【问题标题】:pygame: self.screen AttributeError: ... no attribute 'screen'pygame: self.screen AttributeError: ...没有属性'screen'
【发布时间】:2015-05-16 15:11:30
【问题描述】:

我正在尝试学习一些 pygame 编程,所以我找到了 pivader 项目,这应该是学习 python/pygame 的良好开端。 这里是链接:pivaders

所以我现在不想制作整个游戏。我只是想完成游戏菜单:这意味着我想要开始屏幕,在按下 SPACE 后我想进入游戏屏幕。
这是我的代码

import pygame, random

RES = (800, 600)

class GameState:
    pass

class Game(object):
    def __init__(self):
        pygame.init()
        pygame.font.init()
        self_screen = pygame.display.set_mode([RES[0], RES[1]])
        self.intro_font = pygame.font.Font(
            'data/Orbitracer.ttf', 72)
        self.intro_screen = pygame.image.load(
            '/home/pi/pivaders/data/graphics/start_screen.jpg')
        self.background = pygame.image.load(
            '/home/pi/pivaders/data/graphics/Space-Background.jpg')
        GameState.end_game = False
        GameState.start_screen = True


    def control(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                GameState.start_screen = False
                GameState.end_game = True
            if event.type == pygame.KEYDOWN \
            and event.key == pygame.K_ESCAPE:
                if GameState.start_screen:
                    GameState.start_screen = False
                    GameState.end_game = True
                else:
                    GameState.start_screen = True
        self.keys = pygame.key.get_pressed()
        if self.keys[pygame.K_SPACE]:
            if GameState.start_screen:
                GameState.start_screen = False

    def splash_screen(self):
        while GameState.start_screen:
            self.screen.blit(self.intro_screen, [0, 0])
            self.screen.blit(self.intro_font.render(
                "PIVADERS", 1, WHITE), (265, 128))
            self.screen.blit(self.intro_font.render(
                "PRESS SPACE TO PLAY", 1, WHITE), (284, 191))
            pygame.display.flip()
            self.control()

    def refresh_screen(self):
        self.all_sprite_list.draw(self.screen)
        self.screen.blit(self.background, [0, 0])
        self.clock.tick(self.refresh_rate)

    def main_loop(self):
        while not GameState.end_game:
            while not GameState.start_screen:
                self.control()
                self.refresh_screen()
            self.splash_screen()
        pygame.quit()

if __name__ == '__main__':
    pv = Game()
    pv.main_loop()

现在我得到这个错误:

Traceback (most recent call last):                                  
File "/home/pi/pivaders/MenuTest.py", line 65, in <module>                     
pv.main_loop()
File "/home/pi/pivaders/MenuTest.py", line 60, in main_loop
self.splash_screen()
File "/home/pi/pivaders/MenuTest.py", line 42, in splash_screen
self.screen.blit(self.intro_screen, [0, 0])
AttributeError: 'Game' object has no attribute 'screen' 

我发现了有关该错误和屏幕/self.screen 的其他问题,但我无法弄清楚如何通过使用这些新信息来解决我的问题。 我不知道为什么 AttributeError: 会在这里弹出我从来没有使用过没有 self 的屏幕..

我已经在这里了: How do I solve an attribute error?
https://www.daniweb.com/software-development/python/threads/348024/global-name-screen-is-not-definedpygame

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    您的 __init__ 方法中有错字。

    self_screen = pygame.display.set_mode([RES[0], RES[1]])
    

    应该是

    self.screen = pygame.display.set_mode([RES[0], RES[1]])
    

    注意self_screenself.screen 之间的区别。

    【讨论】:

    • 哇,我检查了 2 个小时,没有看到这个?现在我因为这个而感觉很糟糕。 -感谢您的快速检查^^
    【解决方案2】:

    好的,现在我得到了 start_screen,但 SPACE 并没有像我想象的那样:3 我删除了“refresh_screen”方法,因为我猜它在这里没用。我还添加了全局变量“WHITE = (255, 255, 255)”,因为我忘记了。当然,我用 self.screen 替换了 self_screen。
    .
    现在我必须弄清楚通过推动 SPACE 来改变图片缺少什么。如果我发现了,我会再写一个答案。

    【讨论】:

      【解决方案3】:

      好的,现在我有我想要的了。如果我开始,start_screen 会出现在 800x600 的窗口中。按下 SPACE 后,我进入 ingame_screen。使用 ESC 我回到开始屏幕,然后再次 ESC 关闭程序。
      我错过了代码的平静:

       def refresh_screen(self):
              pygame.display.flip()
              self.screen.blit(self.background, [0, 0])
      
      
      def main_loop(self):
          while not GameState.end_game:
              while not GameState.start_screen:
                  self.control()
                  self.refresh_screen() #change picture
              self.splash_screen()
          pygame.quit()
      

      这里是完整代码(我得到了图片,我的问题是来自 Git 链接的 Orbitracer.ttf):

      import pygame, random
      
      RES = (800, 600)
      WHITE = (255, 255, 255)
      
      class GameState:
          pass
      
      class Game(object):
          def __init__(self):
              pygame.init()
              pygame.font.init()
              self.screen = pygame.display.set_mode([RES[0], RES[1]])
              self.intro_font = pygame.font.Font(
                  'data/Orbitracer.ttf', 72)
              self.intro_screen = pygame.image.load(
                  '/home/pi/pivaders/data/graphics/start_screen.jpg')
              self.background = pygame.image.load(
                  '/home/pi/pivaders/data/graphics/Space-Background.jpg')
              GameState.end_game = False
              GameState.start_screen = True
      
      
          def control(self):
              for event in pygame.event.get():
                  if event.type == pygame.QUIT:
                      GameState.start_screen = False
                      GameState.end_game = True
                  if event.type == pygame.KEYDOWN \
                  and event.key == pygame.K_ESCAPE:
                      if GameState.start_screen:
                          GameState.start_screen = False
                          GameState.end_game = True
                      else:
                          GameState.start_screen = True
              self.keys = pygame.key.get_pressed()
              if self.keys[pygame.K_SPACE]:
                  if GameState.start_screen:
                      GameState.start_screen = False
      
          def splash_screen(self):
              while GameState.start_screen:
                  self.screen.blit(self.intro_screen, [0, 0])
                  self.screen.blit(self.intro_font.render(
                      "PIVADERS", 1, WHITE), (175, 128))
                  self.screen.blit(self.intro_font.render(
                      "PRESS SPACE TO PLAY", 1, WHITE), (175, 191))
                  pygame.display.flip()
                  self.control()
      
          def refresh_screen(self):
              pygame.display.flip()
              self.screen.blit(self.background, [0, 0])
      
          def main_loop(self):
              while not GameState.end_game:
                  while not GameState.start_screen:
                      self.control()
                      self.refresh_screen()
                  self.splash_screen()
              pygame.quit()
      
      if __name__ == '__main__':
          pv = Game()
          pv.main_loop()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-04
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多