首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置没有blit属性

设置没有blit属性
EN

Stack Overflow用户
提问于 2019-08-10 07:05:41
回答 1查看 69关注 0票数 0

我目前正在从“python速成课程”这本书中学习Python。

在这本书中,我目前正在参与一个名为“异形入侵”的项目。我在游戏中遇到了一个问题,因为我试图增加你按下按钮的时间越长,飞船就会获得速度的能力。它说settings()没有'blit‘属性(当它调用blitme函数在游戏中绘制船的时候)。

我的代码被分成多个模块,我已经在下面包含了这些模块。

所有模块都是.py。

alieninvasionbase:

代码语言:javascript
复制
import sys                                               
import pygame
from settings import *
from ship import *
from gamef import *

def start_game():
        pygame.init()
    ai_settings = settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Space Wars")
    ship = Ship(ai_settings, screen)
    while True:
        ship.update() 
        check_events(ship)
        us(ai_settings,screen,ship)

start_game()

game.py:

代码语言:javascript
复制
import sys
import ship
import pygame
def check_events(ship):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:                                                     
                ship.moving_right = True
            elif event.key == pygame.K_LEFT:
                ship.moving_left = True
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT:                                                     
                ship.moving_right = False
            elif event.key == pygame.K_LEFT:
                ship.moving_left = False
def us(self,ai_settings,screen,ship):
    self.screen.fill(ai_settings.bg_color)
    self.ship.blitme()                              
    self.pygame.display.flip()
check_events(ship)

ship.py:

代码语言:javascript
复制
import pygame
import sys
class Ship():
    def __init__(self,screen,ai_settings):
        self.screen = screen
        self.ai_settings = ai_settings
        self.image = pygame.image.load('images/spaceship.bmp')
        self.rect = self.image.get_rect()
        self.screen_rect = self.image.get_rect()
        self.screen_rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom
        self.moving_right = False
        self.moving_left = False

    def update(self):
        if self.moving_right == True:
            self.rect.centerx += 1
        if self.moving_left == True:
            self.rect.centerx += -1
    def blitme(self):
        self.screen.blit(self.image,self.rect)

settings.py:

代码语言:javascript
复制
import pygame

import sys
import ship
class settings():
    def __init__(self):
        self.screen_width = 1200
        self.screen_height = 800 
        self.bg_color = (0,0,0)
EN

回答 1

Stack Overflow用户

发布于 2019-08-10 07:34:39

game.py中的us方法不是实例方法,因为它不是类的一部分,因此它不需要self参数。参见What is the purpose of the word 'self', in Python?

代码语言:javascript
复制
def us(self,ai_settings,screen,ship):
    self.screen.fill(ai_settings.bg_color)
    self.ship.blitme()                              
    self.pygame.display.flip()

删除self,直接使用这3个参数。

代码语言:javascript
复制
def us(ai_settings,screen,ship):
    screen.fill(ai_settings.bg_color)
    ship.blitme()                              
    pygame.display.flip()

我认为将check_eventsus实例方法设置为Ship会更好,因为您无论如何都会将ship作为参数传递,而且所有的Ship实例都已经有了screenai_settings的副本。

我看到的另一个问题是您混淆了Ship的参数。类__init__方法以特定顺序接受screenai_settings

代码语言:javascript
复制
def __init__(self,screen,ai_settings):  # <--- look at the input order
    self.screen = screen
    self.ai_settings = ai_settings

但您可以像这样实例化一艘船:

代码语言:javascript
复制
ship = Ship(ai_settings, screen)        # <--- the order here is incorrect

请注意,顺序不正确。所以在__init__中,的第一个参数 ai_settings被赋值给self.screen,的第二个参数 screen被赋值给self.ai_settings。对于函数的位置参数,顺序很重要,不检查变量名。

这将导致您在此处提到的错误:

代码语言:javascript
复制
def blitme(self):
    self.screen.blit(self.image,self.rect)

因为实际上,self.screen实际上就是settings实例ai_settings。您可以通过打印输出type(self.screen)进行检查。它与以下内容相同:

代码语言:javascript
复制
ai_settings = settings()  # instantiated in `start_game`
ai_settings.blit(...)     # inside `Ship#blitme`

并且settings类没有blit属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57438035

复制
相关文章

相似问题

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