试图射击一个源自Pygame中的角色的射弹(带有all_sprites的声明)

时间:2017-04-04 19:05:04

标签: python pygame

我试图用一个角色射出一个射弹,那个射弹就是泥球形象。我引用了我的类MUDBALL以包含在all_sprites中。在我的第一种方法中,我得到一个错误:AttributeError:' TRUMP'对象没有属性' rect'当我尝试在all_sprites中包含MUDBALL时。该方法在下面的代码中与Game类定义一起使用。在第二种方法中,我尝试将all_sprites语句编码为TRUMP类的shoot方法。我知道我只需要这两段代码中的一条就可以了。我试图包含必要的代码,同时省略其他所有内容以尽量减少混淆。

import pygame as pg

class Game:
  def __init__(self):
      # initialize game window, etc
      pg.init()
      pg.mixer.init()
      self.screen = pg.display.set_mode((WIDTH, HEIGHT))
      pg.display.set_caption(TITLE)
      self.clock = pg.time.Clock()
      self.running = True
      self.font_name = pg.font.match_font(FONT_NAME)
      self.load_data()

  def load_data(self):
       # load high score
       self.dir = path.dirname(__file__)
       img_dir = path.join(self.dir, 'img')
       with open(path.join(self.dir, HS_FILE), 'r') as f:
        try:
            self.highscore = int(f.read())
        except:
            self.highscore = 0
      # load spritesheet image
      self.spritesheet = Spritesheet(path.join(img_dir, SPRITESHEET))

def new(self):
      # start a new game
      self.score = 0
      self.all_sprites = pg.sprite.Group()
      self.platforms = pg.sprite.Group()
      self.player = Player(self)
      #ME: TRUMP added to all sprites!!!
      self.trump = TRUMP(self)
      self.all_sprites.add(self.trump)

      #***First attempt at adding mudball to all_sprites
      self.mudball = MUDBALL(TRUMP.rect.centerx, TRUMP.rect.centery)
      self.all_sprites.add(self.mudball)

      #game class continues...

class TRUMP(pg.sprite.Sprite):
    def __init__(self, game):
       pg.sprite.Sprite.__init__(self)
       self.game = game
       self.current_frame2 = 0
       self.last_update2 = 0
       self.load_images()

#TRUMP class continued etc... Second attempt with shoot def is below.

def shoot(self):
    mudball = MUDBALL(self.rect.centerx, self.rect.centery)
    Game.all_sprites.add(mudball)
     mudballs.add(mudball)

class MUDBALL(pg.sprite.Sprite):
    def __init__(self, x, y):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.image.load("MUDBALL.png")
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedx = -10

    def update(self):
        self.rect.x += self.speedx
        # kill if moves off screen
        if self.rect.centerx < 0:
            self.kill

拍摄是TRUMP类的一种方法!在第二次尝试中,我尝试将MUDBALL添加到TRUMP类的拍摄定义中的所有精灵中。这不起作用。再次在这种方法中,我从前一种方法中取出代码。该尝试(仅在下面)返回:NameError:name&#39; Game&#39;没有定义。我不知道如何继续。

2 个答案:

答案 0 :(得分:0)

问题可能在于您的行

self.mudball = MUDBALL(self)

MUDBALL的 __ init __ 方法需要x,y参数;相反,你传递了一个对象而没有。这足以导致您所看到的错误。

对OP更新的回应:

这是正确的:游戏未定义。这一行是您发布的代码中唯一出现符号的位置。正如您对此进行了编码,您将向后添加附件: all_sprites 游戏的属性(可变字段)。换句话说, all_sprites 附加到游戏,而不是相反。进入 all_sprites 的唯一方法是通过游戏 ...除了游戏没有在任何地方定义。

答案 1 :(得分:0)

我的一个朋友帮助了我。他说“TRUMP是你的类......它没有rect作为属性,只有TRUMP的一个实例才会有rect作为属性。”我还不明白这一点。但是要感谢所有帮助过我的人。

self.mudball = MUDBALL(self.trump.rect.centerx,self.trump.rect.centery) self.all_sprites.add(self.mudball)