为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2019-02-20 05:50:36
我是按照书上的内容写到外星人群移动,发现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
查看完整描述

2 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

是的,谢谢大神知道,确实是参数写反了

查看完整回答
反对 回复 2019-03-01
  • 2 回答
  • 0 关注
  • 4810 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信