小星圆55 2022-02-16 11:10 采纳率: 33.3%
浏览 141
已结题

pygame.sprite.Group().update()参数报错问题

问题遇到的现象和发生背景

我在编写《python编程:从入门到实践(第二版)》的项目一<外星人入侵>(用pygame开发)第12.8.3小节时,要求将子弹添加进一个编组中,并且用pygame.sprite.Group().update()方法更新编组。

问题相关代码,请勿粘贴截图

主程序:(alien_invasion.py)

import pygame
import pygame.display
import pygame.event

from .settings import Settings
from .ship import Ship
from .bullet import Bullet
import sys



class AlienInvasion:
    """
    Game main
    """

    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("Alien Invasion")

        self.bg_color = (180, 200, 200)

        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group


    def run_game(self):
        """
        Game's main While
        """
        while True:
            self._check_events()
            self.ship.update()
            self.bullets.update()   #这里报错
            self._update_screen()

    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

            elif event.type == pygame.KEYDOWN:  # Key Down
                if event.key == pygame.K_RIGHT:
                    self.ship.moving_right = True
                if event.key == pygame.K_LEFT:
                    self.ship.moving_left = True

                if event.key == pygame.K_SPACE:
                    self._fire_bullet()

            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    self.ship.moving_right = False
                if event.key == pygame.K_LEFT:
                    self.ship.moving_left = False

    def _fire_bullet(self):
        new_bullet = Bullet(self)
        self.bullets.add(new_bullet)

    def _update_screen(self):
        self.screen.fill(self.settings.bg_color)

        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        pygame.display.flip()

子弹:(bullet.py)

import pygame
from pygame.sprite import Sprite


class Bullet(Sprite):

    def __init__(self, ai_game):
        super.__init__()
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.color = ai_game.bullet_color

        self.rect = pygame.Rect(0, 0, self.settings.bullet_width,
                                self.settings.bullet_height)
        self.rect.midtop = ai_game.ship.midtop

        self.y = float(self.rect.y)

    def update(self):
        self.y -= self.settings.bullet_speed

        self.rect.y = self.y

    def draw_bullet(self):
        pygame.draw.rect(self.screen, self.color, self.rect)

其他源文件我放在了

,先看 README.md。

运行结果及报错内容
Traceback (most recent call last):
  File "D:/py_proj/Ailen_Invasion/Alien_invasion.py", line 4, in <module>
    ai.run_game()
  File "D:\py_proj\Ailen_Invasion\codes\ailen_invasion.py", line 38, in run_game
    self.bullets.update()
TypeError: update() missing 1 required positional argument: 'self'

也就是

def run_game(self):
    """
    Game's main While
    """
    while True:
        --snip--
        self.bullets.update()   #这里报错
        

告诉我update()需要一个参数self,但是书上、网上说这个方法没有参数啊,还说self应该是pygame.sprite .AbstractGroup类的。

事实上应该在alien_invasion.py的第70行

 def _update_screen(self):
        --snip--
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        --snip--

也有错,其他地方可能也有。

我的解答思路和尝试过的方法

哪里也没有出现AbstractGroup类,于是我把AbstractGroup放到括号里,Pycharm给我红了,也报错:

TypeError: sprites() missing 1 required positional argument: 'self'

我把Sprite类也放里,结果AttributeError: type object 'Sprite' has no attribute 'sprites'

应该是子弹没有正确存到编组里。

我想要达到的结果

让子弹存储到编组里,能发射出去。

  • 写回答

1条回答 默认 最新

  • 小星圆55 2022-02-17 11:38
    关注

    我加了一个git,用他重做一遍^_^

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上