在编写外星人入侵游戏时,到了发射子弹的环节,按下空格键就会报错 退出。代码如下
用代码块功能插入代码,请勿粘贴截图
import sys
import pygame
from settings import Settings
from ship import Ship
from bullet import Bullet
class AlienInvasion:
"""管理游戏资源和行为的类"""
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.ship = Ship(self)
"""这里是新加的子弹编组"""
self.bullets = pygame.sprite.Group()
#设置背景颜色。
self.bg_color = (0,230,255)
def run_game(self):
"""开始游戏的主循环"""
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: #按下
self._check_keydown_events(event)
elif event.type == pygame.KEYUP:
self._check_keyup_events(event)
"""这是下面11.10号新加的"""
def _check_keydown_events(self,event):
"""响应按键"""
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
elif event.key == pygame.K_q:
sys.exit()
elif event.key == pygame.K_SPACE:
#空格发射子弹
self._fire_bullet()
def _check_keyup_events(self,event):
"""响应松开"""
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):
"""c创建一颗子弹 加入编组 bullets"""
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
def _update_screen(self):
"""更新屏幕 图像,并切换到新屏幕 """
self.screen.fill(self.bg_color)
self.ship.blitme()
for bullet in self.bullets.sprites():
bullet.draw_bullet()
pygame.display.flip()
if __name__ == '__main__':
#创建游戏实例 并运行游戏。
ai = AlienInvasion()
ai.run_game()
运行结果及报错
Traceback (most recent call last):
File "D:\python_work\alien_invasion\alien_invasion.py", line 47, in _check_events
self._check_keydown_events(event)
File "D:\python_work\alien_invasion\alien_invasion.py", line 68, in _check_keydown_events
self._fire_bullet()
File "D:\python_work\alien_invasion\alien_invasion.py", line 81, in _fire_bullet
self.bullets.add(new_bullet)
File "C:\Users\NINGMEI\AppData\Roaming\Python\Python37\site-packages\pygame\sprite.py", line 444, in add
sprite.add_internal(self)
File "C:\Users\NINGMEI\AppData\Roaming\Python\Python37\site-packages\pygame\sprite.py", line 160, in add_internal
self.__g[group] = 0
AttributeError: 'Bullet' object has no attribute '_Sprite__g'
我也检查了结构和语法,反复测试还是不行。请问问题处在哪里了