首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pygame: self.screen AttributeError:...没有属性'screen‘

pygame: self.screen AttributeError:...没有属性'screen‘
EN

Stack Overflow用户
提问于 2015-05-16 03:51:43
回答 3查看 882关注 0票数 0

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

所以我现在不想做整个游戏。我只是想完成游戏菜单:这意味着我想要开始屏幕,在按下空格键后,我想进入游戏屏幕。

这里是我的代码

代码语言:javascript
运行
复制
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()

现在我得到了这个错误:

代码语言:javascript
运行
复制
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:我从来没有用过没有自己的屏幕..

我已经在这里了:How do I solve an attribute error?

https://www.daniweb.com/software-development/python/threads/348024/global-name-screen-is-not-definedpygame

EN

回答 3

Stack Overflow用户

发布于 2015-05-16 03:56:52

您的__init__方法中有一个拼写错误。

代码语言:javascript
运行
复制
self_screen = pygame.display.set_mode([RES[0], RES[1]])

应该是

代码语言:javascript
运行
复制
self.screen = pygame.display.set_mode([RES[0], RES[1]])

请注意self_screenself.screen之间的区别。

票数 2
EN

Stack Overflow用户

发布于 2015-05-16 04:16:26

好了,现在我得到了start_screen,但空格并不是我想的那样:3我删除了"refresh_screen“方法,因为我猜它在这里没有用。我还添加了全局变量"WHITE = (255,255,255)“,因为我忘记了这一点。当然,我用self.screen替换了self_screen。

现在,我必须找出缺少了什么才能通过按空格键来改变图片。如果我发现了,我会写另一个答案的。

票数 0
EN

Stack Overflow用户

发布于 2015-05-16 15:11:30

好了,现在我得到了我想要的东西。如果我启动,start_screen出现在800x600的窗口中。按下空格键后,我进入ingame_screen。使用ESC,我返回到开始屏幕,然后再次使用ESC来关闭程序。

我怀念这种平静的代码:

代码语言:javascript
运行
复制
 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 ):

代码语言:javascript
运行
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30267686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档