我目前正在从“python速成课程”这本书中学习Python。
在这本书中,我目前正在参与一个名为“异形入侵”的项目。我在游戏中遇到了一个问题,因为我试图增加你按下按钮的时间越长,飞船就会获得速度的能力。它说settings()没有'blit‘属性(当它调用blitme函数在游戏中绘制船的时候)。
我的代码被分成多个模块,我已经在下面包含了这些模块。
所有模块都是.py。
alieninvasionbase:
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:
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:
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:
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)发布于 2019-08-10 07:34:39
game.py中的us方法不是实例方法,因为它不是类的一部分,因此它不需要self参数。参见What is the purpose of the word 'self', in Python?。
def us(self,ai_settings,screen,ship):
self.screen.fill(ai_settings.bg_color)
self.ship.blitme()
self.pygame.display.flip()删除self,直接使用这3个参数。
def us(ai_settings,screen,ship):
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()我认为将check_events和us实例方法设置为Ship会更好,因为您无论如何都会将ship作为参数传递,而且所有的Ship实例都已经有了screen和ai_settings的副本。
我看到的另一个问题是您混淆了Ship的参数。类__init__方法以特定顺序接受screen和ai_settings、
def __init__(self,screen,ai_settings): # <--- look at the input order
self.screen = screen
self.ai_settings = ai_settings但您可以像这样实例化一艘船:
ship = Ship(ai_settings, screen) # <--- the order here is incorrect请注意,顺序不正确。所以在__init__中,的第一个参数 ai_settings被赋值给self.screen,的第二个参数 screen被赋值给self.ai_settings。对于函数的位置参数,顺序很重要,不检查变量名。
这将导致您在此处提到的错误:
def blitme(self):
self.screen.blit(self.image,self.rect)因为实际上,self.screen实际上就是settings实例ai_settings。您可以通过打印输出type(self.screen)进行检查。它与以下内容相同:
ai_settings = settings() # instantiated in `start_game`
ai_settings.blit(...) # inside `Ship#blitme`并且settings类没有blit属性。
https://stackoverflow.com/questions/57438035
复制相似问题