[英]AttributeError: 'Group' object has no attribute '_check_edges' (based off the game project in Python Crash Course,2ndEdition(EricMatthes)
我正在尝试模块化编程并在很大程度上遵循本书的说明,但是每当我运行以下代码时:
import sys
import pygame
from settings import Settings
from kirby import Kirby
from bullet import Bullet
from enemy import Scarfy
class KnockOffShooter:
"""used to structure the game"""
def __init__(self):
pygame.init()
self.settings = Settings()
self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
pygame.display.set_caption("Knock Off Shooter")
self.kirby = Kirby(self)
self.bullets = pygame.sprite.Group()
self.scarfys = pygame.sprite.Group()
self.fleet_drop = self.settings.fleet_direction
self._create_rows()
def _create_rows(self):
scarfy = Scarfy(self)
scarfy_width = scarfy.rect.width
avaliableSpaceHor = self.settings.screen_width - (2*scarfy_width)
rowCapacity = (avaliableSpaceHor//(2*scarfy_width))-1
scarfy_height = scarfy.rect.height
avaliableSpaceVer = self.settings.screen_height - (8*scarfy_height)
rowCount = avaliableSpaceVer//(2*scarfy_height)
for rowNum in range(rowCount):
for scarfyNum in range(rowCapacity):
self._create_scarfy(scarfyNum,rowNum)
def _create_scarfy(self,scarfyNum,rowNum):
scarfy = Scarfy(self)
scarfy_width = scarfy.rect.width
scarfy_height = scarfy.rect.height
scarfy.x = scarfy_width + 2 * scarfy_width * scarfyNum
scarfy.rect.x = scarfy.x
scarfy.rect.y = scarfy.rect.height + 2 * scarfy.rect.height * rowNum
self.scarfys.add(scarfy)
def _fire_bullet(self):
bulletCount = len(self.bullets)
if bulletCount <= self.settings.bullet_limit:
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
bulletCount = bulletCount - 1
def _check_keydown_events(self,event):
if event.key == pygame.K_RIGHT:
self.kirby.moving_right = True
elif event.key == pygame.K_LEFT:
self.kirby.moving_left = True
elif event.key == pygame.K_q:
pygame.quit()
sys.exit()
exit()
elif event.key == pygame.K_UP:
self.kirby.moving_up = True
elif event.key == pygame.K_DOWN:
self.kirby.moving_down = True
elif event.key == pygame.K_SPACE:
self.bullets.shoot = True
self._fire_bullet()
def _check_keyup_events(self,event):
if event.key == pygame.K_RIGHT:
self.kirby.moving_right = False
elif event.key == pygame.K_LEFT:
self.kirby.moving_left = False
elif event.key == pygame.K_UP:
self.kirby.moving_up = False
elif event.key == pygame.K_DOWN:
self.kirby.moving_down = False
def _check_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown_events(event)
elif event.type == pygame.KEYUP:
self._check_keyup_events(event)
def _scarfy_edge(self):
for scarfy in self.scarfys.sprites():
if self.scarfys._check_edges():
self._respond
break
def _respond(self):
self.settings.fleet_direction *=-1
def _update_scarfys(self):
self._scarfy_edge()
self.update()
def _maintain_screen(self):
self.screen.fill(self.settings.bg_color)
self.kirby.blitme()
for bullet in self.bullets.sprites():
bullet.drawbullet()
self.scarfys.draw(self.screen)
pygame.display.flip()
def runGame(self):
while True:
self._check_events()
self._maintain_screen()
self.kirby.update()
self.bullets.update()
self._update_scarfys()
for bullet in self.bullets.copy():
if bullet.rect.bottom <= 0:
self.bullet.remove(bullet)
bulletCount = bulletCount - 1
print(len(self.bullets))
if __name__ == '__main__':
kns = KnockOffShooter()
kns.runGame()
我得到错误: if self.scarfys._check_edges(): AttributeError: 'Group' object has no attribute '_check_edges' 供参考这里是敌人 class 文件:
import pygame
from pygame.sprite import Sprite
class Scarfy(Sprite):
def __init__(self,kns):
super().__init__()
self.screen = kns.screen
self.settings = kns.settings
self.image = pygame.image.load('cutescarfy.bmp')
self.shot = pygame.image.load('onehit.bmp')
self.seq = pygame.image.load('transformation.bmp')
self.real = pygame.image.load('realscarfy.bmp')
self.rect = self.image.get_rect()
self.rect.x = self.rect.width
self.rect.y = self.rect.height
self.x = float(self.rect.x)
self.y = float(self.rect.y)
self.scarfys = kns.scarfys
def _check_edges(self):
self.rect = self.image.get_rect()
if self.rect.right >= screen_rect.right or self.rect.left <=0:
return True
def update(self):
self.x += (self.settings.scarfy_speed * self.settings.fleet_direction)
self.rect.x = self.x
我不明白我哪里出错了,我该如何解决这个问题
这是你的错误:
AttributeError: 'Group' object has no attribute '_check_edges'
当您看到这样的错误时,它告诉您您用来调用_check_edges()
的 object 无权访问该方法。 它还告诉您,您使用的 object 是一个Group
。
那么让我们看看调用_check_edges()
的代码:
def _scarfy_edge(self):
for scarfy in self.scarfys.sprites():
if self.scarfys._check_edges():
self._respond
break
你有self.scarfys._check_edges()
。 但是self.scarfys
是一个Pygame Group
object; 这不是Scarfy
。 我认为这是一个错字,你的意思是写self.scarfy._check_edges()
。
错别字是简单的错误,但它们在大型项目中的影响可能很难解开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.