问题遇到的现象和发生背景
我在编写《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'
应该是子弹没有正确存到编组里。
我想要达到的结果
让子弹存储到编组里,能发射出去。