我的第一个问题就是代码中的Sprite这个类的用法,在敲代码的过程中,我遇到了两个调用问题。
def _check_fleet_edages(self):
"""有外星人到达边缘时采取措施"""
for alien in self.aliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
"""表示单个外星人的类"""
def __init__(self, ai_game):
"""初始化外星人并设置起始位置"""
super().__init__()
self.screen = ai_game.screen
self.settings = ai_game.settings
# 加载外星人图像并设置其rect属性
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
# 每个外星人最初都在屏幕左上角附近
self.rect.x = self.rect.width
self.rect.y = self.rect.height
# 存储于外星人的精确水平位置
self.x = float(self.rect.x)
def check_edges(self):
"""如果外星人位于屏幕边缘,就返回True"""
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right or self.rect.left <= 0:
return True
def update(self):
"""向右向左移动外星人"""
self.x += (self.settings.alien_speed * self.settings.fleet_direction)
self.rect.x = self.x
这个是外星人到达边缘的调用,下边的是外星人的类。但是python提示:类 'Sprite' 的属性引用 'check_edges' 未解析。这是其一
def _update_screen(self):
# 更新屏幕上的图像,并切换到新屏幕
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.aliens.draw(self.screen)
# 如果游戏处于非活动状态,就绘制Play按钮
if not self.stats.game_active:
self.play_button.draw_button()
# 让最近绘制的屏幕可见
pygame.display.flip()
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 = 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
def update(self):
"""向上移动子弹"""
# 更新表示子弹位置的小数值。
self.rect.centery -= float(self.settings.bullet_speed)
def draw_bullet(self):
"""在屏幕上绘制子弹"""
pygame.draw.rect(self.screen, self.color, self.rect)
这是上边第一张更新子弹的调用,第二张的图是子弹的类,python也提示,类 'Sprite' 的属性引用 'draw_bullet' 未解析。这到底是什么原因呢?
def run_game(self):
"""开始游戏的主循环"""
while True:
self._check_events()
if self.stats.game_active:
self.ship.update()
self._update_bullets()
self._update_screen()
self._update_aliens()
if __name__ == '__main__':
# 创建游戏实例并运行游戏
ai = AlienInvasion()
ai.run_game()
这是主程序。
还有第二个问题,就是关于button的问题,添加play按键,运行时,游戏界面就黑屏了,但是用鼠标点击界面中央,竟然可以正常 运行。看不到任何和play图标相关的东西,只是黑屏。
import pygame.font
class Button:
def __init__(self, ai_game, msg):
"""初始化按钮的属性"""
self.screen = ai_game.screen
self.screen_rect = self.screen.get_rect()
# 设置按钮的尺寸和其他属性
self.width, self.height = 200, 50
self.button_color = (0, 255, 0)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont("Arial", 48)
# 创建按钮的rect对象,并使其居中
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.center = self.screen_rect.center
# 按钮的标签只需创建一次
self._prep_msg(msg)
def _prep_msg(self, msg):
"""将msg渲染为图像,并使其在按钮上居中"""
self.msg_image = self.font.render(msg, True, self.text_color,
self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
def draw_button(self):
# 绘制一个用颜色填充的按钮,再绘制文本
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)
这是button的代码。
上述所有代码都是根据书上敲的,python变成从入门到实践(第2版)