繁体   English   中英

AttributeError: 'Group' object 没有属性 '_check_edges' (基于 Python 速成课程中的游戏项目,第二版(EricMatthes)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM