可以运行但是他说我未解析
为什么类 'Sprite' 的属性引用 'draw_bullet' 未解析,bullet里面的方法draw_bullet
import sys
import pygame
"""为了访问settings,ship的属性,调用settings和ship的方法"""
from settings import Settings
from ship import Ship
from bullet import Bullet
from alien import Aline
class AlienInvasion:
def __init__(self):
"""初始化游戏"""
pygame.init()
"""把settings的属性取出来放到self.settings实例"""
self.settings = Settings()
"""游戏的边框以及游戏名及颜色"""
self.screen = pygame.display.set_mode(
(self.settings.screen_width, self.settings.screen_height)
)
pygame.display.set_caption("武装飞机")
"""把ship的属性取出,放到self.ship,注意括号不能丢掉,丢掉取不出来"""
self.ship = Ship(self)
"""bullet 运用了父类继承的方法 在sprite里建立了精灵"""
self.bullets = pygame.sprite.Group()
self.aliens = pygame.sprite.Group()
self._create_fleet()
self.bg_color = self.settings.bg_color
def run_game(self):
"""游戏开始循环"""
while True:
"""按键检测"""
self._check_events()
"""飞机的位置更新"""
self.ship.update()
"""子弹的位置更新"""
self._update_bullets()
"""外星人位置更新"""
self._update_aliens()
"""屏幕的刷新"""
self._update_screen()
def _check_events(self):
"""监视键盘和鼠标事件,pygame.event.get()和pygame.key.get_pressed()两种,这里选第一种"""
for event in pygame.event.get():
"""event.type"""
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
"""检测按键被按下并修改ship里的属性"""
if event.key == pygame.K_d:
self.ship.moving_right = True
elif event.key == pygame.K_a:
self.ship.moving_left = True
elif event.key == pygame.K_w:
self.ship.moving_up = True
elif event.key == pygame.K_s:
self.ship.moving_down = True
"""检测按键q被按下调用 '_fire_bullet' 创建子弹"""
elif event.key == pygame.K_p:
self._fire_bullet()
"""创建一个新的退出程序的方法"""
elif event.key == pygame.K_q:
sys.exit()
elif event.type == pygame.KEYUP:
"""检测按键被松开并修改ship里的属性"""
if event.key == pygame.K_d:
self.ship.moving_right = False
elif event.key == pygame.K_a:
self.ship.moving_left = False
elif event.key == pygame.K_w:
self.ship.moving_up = False
elif event.key == pygame.K_s:
self.ship.moving_down = False
def _update_screen(self):
self.screen.fill(self.bg_color)
self.ship.blitme()
""" 'bullets.sprites' 返回一个列表,其中包括bullet的所有精灵 """
for bullet in self.bullets.sprites():
bullet.draw_bullet()
""" draw() 把每个属性绘制到self.screen"""
self.aliens.draw(self.screen)
"""刷新屏幕"""
pygame.display.flip()
def _update_aliens(self):
self._check_fleet_edges()
self.aliens.update()
def _check_fleet_edges(self):
"""检查有没有外星人到达边界"""
for alien in self.aliens.sprites():
if alien.check_edges():
self._check_fleet_direction()
def _check_fleet_direction(self):
for alien in self.aliens.sprites():
"""调用一群外星人向下移动"""
alien.rect.y += self.settings.fleet_drop_speed
"""只要一个移动方向故没有放到for语句,放到for里会出现奇怪的问题"""
self.settings.fleet_drection *= -1
def _fire_bullet(self):
"""创建一个新的子弹用add()加入到'bullets'类似于 append()"""
if len(self.bullets) <= self.settings.bullets_allowed:
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
def _update_bullets(self):
self.bullets.update()
"""先用.copy()复制bullets里的精灵,在用if语句判断是否需要删除,删除后查看bullets的长度并显示"""
for bullet in self.bullets.copy():
if bullet.rect.bottom <= 0:
self.bullets.remove(bullet)
pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
"""检查还有没有外星人"""
if not self.aliens:
"""删除子弹,添加新的外星人"""
self.bullets.empty()
self._create_fleet()
def _create_fleet(self):
"""创建外星人群"""
"""for 以前的语句是判断一行能容纳多少外星人"""
alien = Aline(self)
alien_width = alien.rect.width
alien_height = alien.rect.height
ship_height = self.ship.rect.height
"""这里不能直接self.screen.rect.width而是self.settings.screen_width
因为没有用语句get_rect获得其外接矩形"""
available_space_y = self.settings.screen_height-(3*alien_height)-ship_height
number_rows = available_space_y//(2*alien_height)
available_space_x = self.settings.screen_width-(2*alien_width)
number_aliens_x = available_space_x//(2*alien_width)
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
self._create_aluen(row_number, alien_number)
def _create_aluen(self, number_rows, alien_number):
"""容纳的外星人个数得到后逐一添加到aliens里"""
alien = Aline(self)
alien_width = alien.rect.width
alien_height = alien.rect.height
alien.x = alien_width+2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien_height + 2 * alien_height * number_rows
self.aliens.add(alien)
"""检查程序入口"""
if __name__ == '__main__':
"""导入类"""
ai = AlienInvasion()
"""运行run_game"""
ai.run_game()
```python
import pygame
"""使用精灵(sprite),相关元素编组"""
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 = self.settings.bullet_color
"""要先在(0,0)处创建一个表示子弹的矩形"""
self.rect = pygame.Rect(0, 0, self.settings.bullet_width, self.settings.bullet_height)
"""放到正确的位置"""
self.rect.midtop = ai_game.ship.rect.midtop
"""用'self.y'储存有小数的'self.rect.y' """
self.y = float(self.rect.y)
def update(self):
"""当按下一个按键在组里放一个精灵, 'update' 对每个精灵的位置进行调整 """
self.y -= self.settings.bullet_speed
self.rect.y = self.y
def draw_bullet(self):
"""draw.rect的用法 储存三个数据 分别为 屏幕的数据 子弹的颜色 和子弹的对角坐标(及子弹覆盖的面积与覆盖的位置) 然后把子弹代替屏幕显示"""
pygame.draw.rect(self.screen, self.color, self.rect)
```
在alien文件import bullet文件了吗?
不知道你这个问题是否已经解决, 如果还没有解决的话: