外星人飞船报错'pygame.Surface' object has no attribute 'alien_speed'

我是按照书上的内容写到外星人群移动,发现game_function.py中的 def update_aliens(aliens):aliens.update()无法正常读取setting.py中的alien_speed取值,我将alien.py中的def update(self):self.x += self.ai_screen.alien_speed改成self.x += 1,外星人群就可以正常右移了,请问是哪里出现问题了?新人请多多指教,困扰半天了。

alien_invasion.py

import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as game_expand
from pygame.sprite import Group
from alien import Alien
from bull import Bullet
def run_game():
pygame.init()#pygame初始化背景设置,让pygame能够正确工作
ai_screen = Settings()
#设置实例获取setting模块下Settings方法中的参数设置
screen = pygame.display.set_mode((ai_screen.width,ai_screen.height))
#创建显示窗口,通过实例传递setting模块下self.width和self.height的具体参数
pygame.display.set_caption('Alien Invasion')
#创建游戏窗口标题,这些都属于游戏元素
ship = Ship(screen,ai_screen)
#获取ship模块下的Ship方法,调用飞船图片,创造出飞船
black_color = ai_screen.black_color
#设置背景颜色,以RGB值指定,每个取值范围0-255
bullets = Group()
aliens = Group()
#将外星人添加到一个数组中
game_expand.create_fleet(ai_screen,screen,aliens)
#创建外星人群
while True:#使用无限循环的目的是可以在每次刷新时都打印输出
        ship.update()
        # 每次循环时都调用飞船的update方法
        game_expand.check_events(ai_screen, screen, ship, bullets)
        #将ship模块作为实参传递给game_functions模块下的check_events方法,目的是当检测到事件是按键并且是特定的方向键是将飞船做出相应的位置调整
        game_expand.update_bullets(aliens,bullets,ai_screen,screen,ship)
        game_expand.update_aliens(aliens)
        game_expand.update_screen(ai_screen,screen,ship,bullets,aliens)

run_game()


game_function.py

import sys
import pygame
from bull import Bullet
from alien import Alien
#响应按键和鼠标事件
def check_keydown_events(event,ship,ai_screen,screen,bullets):
if event.key == pygame.K_RIGHT:
    ship.move_right = True
        # 上边代码表示持续移动属性被修改为true,允许持续移动
elif event.key == pygame.K_LEFT:
    ship.move_left = True
elif event.key == pygame.K_UP:
    ship.move_up = True
elif event.key == pygame.K_DOWN:
    ship.move_down = True
elif event.key == pygame.K_SPACE:
        #创建一颗子弹,并将其加入到编组bullets中
    fire_bullets(bullets,ai_screen,screen,ship)
elif event.key == pygame.K_q:
        #创建一颗子弹,并将其加入到编组bullets中
    sys.exit()

def check_keyup_events(event,ship):
if event.key == pygame.K_RIGHT:
    ship.move_right = False
        # 上边代码表示持续移动属性被修改为false,不允许持续移动
if event.key == pygame.K_LEFT:
    ship.move_left = False
if event.key == pygame.K_UP:
    ship.move_up = False
if event.key == pygame.K_DOWN:
    ship.move_down = False

def check_events(ai_screen, screen, ship, bullets):
for event in pygame.event.get():
# 为让程序响应事件,我们编写一个事件循环,监听事件,如果有事件发生,执行相应任务
    if event.type == pygame.QUIT:
        sys.exit()  # 退出进程
    elif event.type == pygame.KEYDOWN:
        #如果pygame检测到KEYDOWN事件,做出以下反应
        check_keydown_events(event,ship,ai_screen,screen,bullets)
    elif event.type == pygame.KEYUP:
        #如果pygame检测到KEYUP事件,做出一下反应
        check_keyup_events(event,ship)
def fire_bullets(bullets,ai_screen,screen,ship):
if len(bullets) <= ai_screen.bull_allow:
    # 检查如果同屏子弹数小于等于setting.py中设置的要求数量,执行下列命令,将子弹添加到bullets列表中
    new_bullet = Bullet(ai_screen, screen, ship)
    bullets.add(new_bullet)

def update_bullets(aliens,bullets,ai_screen,screen,ship):
for bullet in bullets.copy():
    if bullet.rect.bottom <= 0:
        bullets.remove(bullet)
bullets.update()

def get_number_aliens_x(ai_screen,alien_width):
#计算每行可容纳多少个外星人
available_space_x = ai_screen.width - 2 * alien_width
#可放置外星人的水平空间有多大
number_aliens_x = int(available_space_x / (2 * alien_width))
#计算一行可容纳外星人数量
return number_aliens_x

def create_alien(ai_screen,screen,aliens,alien_number):
alien = Alien(ai_screen,screen)
alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
aliens.add(alien)

def create_fleet(ai_screen,screen,aliens):
#创建外星人群
alien = Alien(ai_screen,screen)
#先创建一个外星人
number_aliens_x = get_number_aliens_x(ai_screen,alien.rect.width)
for alien_number in range(number_aliens_x):
    create_alien(ai_screen,screen,aliens,alien_number)

def update_aliens(aliens):
aliens.update()

def update_screen(ai_screen,screen,ship,bullets,aliens):
#更新屏幕中的图片,并切换到新屏幕
screen.fill(ai_screen.black_color)
#用屏幕填充背景颜色,只接受一个实参,一种颜色
for bull in bullets.sprites():
#在飞船和外星人后面重绘所有子弹,该方法中的所有函数必须在pygame.display.flip()前执行,否则无法正常显示
    bull.draw_bull()
ship.blitme()
#将飞船图片绘制到屏幕中
aliens.draw(screen)
#在屏幕上绘制编组中的每个外星人
pygame.display.flip()
# 绘制最近屏幕的显示,通过不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动效果


aline.py

import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(self,screen,ai_screen):
    super(Alien,self).__init__()
    self.screen = screen
    self.ai_screen = ai_screen
    self.image = pygame.image.load('C:\\Users\\邢小星\\PycharmProjects\\Game\\Game_Windows\\aliens.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 update(self):
    self.x += self.ai_screen.alien_speed
    self.rect.x = self.x

def blitme(self):
    self.screen.blit(self.image, self.rect)


setting.py

class Settings():
def __init__(self):
    self.width = 960#宽度
    self.height = 600#高度
    self.black_color = (255,255,255)#背景颜色
    self.ship_speed = 1.5#飞船行驶速度
    self.bull_speed = 1
    self.bull_width = 3
    self.bull_height = 15
    self.bull_color = (10,10,10)
    self.bull_allow = 5#限制同屏的子弹数
    self.alien_speed = 1
    self.fleet_drop_speed = 2
    self.fleet_direction = 1
撒科打诨
浏览 4811回答 2
2回答

三国纷争

是的,谢谢大神知道,确实是参数写反了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python