@websec007
        
        2020-06-18T14:35:16.000000Z
        字数 5735
        阅读 1319
    2020.Python从入门到实践-过程消化
self.alien_speed_factor = 1
def update(self):self.x = self.x + game_settings.alien_speed_factorself.rect.x = self.x
while True:gf.update_aliens(aliens)
def update_aliens(self):aliens.update()
self.fleet_drop_speed = 10self.fleet_direction = 1
def check_edges(self):scree_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <= 0:return Truedef update(self):# 左右移动方向的动态更新调整self.x += self.game_settings.alien_speed_factor*self.game_settings.fleet_directionself.rect.x = self.x
# 检查外星人边缘,下移并改变aliens方向def check_fleet_edges(game_settings, aliens):for alien in aliens.sprites():if check_edges():change_fleet_direction(game_settings, aliens)break# 将外星人整体下移,并改变其方向def change_fleet_direction(game_settings, aliens):for alien in aliens.sprites():alien.rect.y += game_settings.fleet_drop_speedgame_settings.fleet_direction *= -1# 检查外星人群是否位于屏幕边缘,更新群外星人的位置def update_aliens(game_settings, aliens):check_fleet_edges(game_settings, aliens)aliens.update()
(8) 游戏主循环调用(alien_invasion.py)
while True:....gf.update_aliens(game_settings, aliens)gf.update_screen(...., aliens)
self.alien_speed_factor = 1
self.speed_factor = game_settings.alien_speed_factor...def update(self):self.x = self.x + self.speed_factor
def update_aliens(aliens):aliens.update()
def update_screen(screen, bg_color, ship, bullets, aliens):...ship.update()# 重构后的调用:飞船的更新&绘制update_bullets(bullets)# 重构后的调用:更新外星人群update_aliens(aliens)# 绘制外星人aliens.draw(screen)
while True:...gf.update_aliens(aliens)
所有外星人左/右移动碰壁后处理动作有:
(1)首先,监控碰壁检查事件是否发生;
(2)随后,确认碰撞后开始整体下移;
(3)同时,调转方向进行移动;
针对碰撞检查收,外星人的下移与方向调整属性进行提前设置
-> 1)外星人移动速度因子
-> 2)外星人移动方向属性
-> 3)外星人下移速度属性
self.alien_speed_factor = 1self.alien_fleet_direction = 1self.alien_drop_speed = 1
检测外星人移动是否有碰撞事件发生,如发生则直接返回一个事件属性值:True
def check_edges(self):screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueif self.rect.left <= 0:return True
(依据碰壁检测)更新单个外星人移动方向方法
-> 1)单个外星人更新方法:alien.update()
-> 2)外星人移动方向属性:game_setting.alien_fleet_direction
self.fleet_direction = game_settings.alien_fleet_directiondef update(self):self.x = self.x + self.speed_factor*self.fleet_dirctionself.rect.x = self.x
外星人发生碰撞事件的检测判断,以及后续的下移与方向调整动作的整合
def check_fleet_edges(aliens, game_settings):# 对所有外人逐个进行边缘检测,依据检测的属性值返回做事件响应处置for alien in aliens.spriters():# 如果边缘碰撞事件发生,则对应的事件响应处置if alien.check_edges():change_fleet_direction(aliens, game_settings)break
创建一个外星人边缘碰撞事件发生后:所有外星人全部下移,并随后调整方向的函数方法,以备后续整合调用;
def change_fleet_direction(aliens, game_settings):# (1)外星人是整体的逐个下移for alien in aliens.spriters():alien.rect.y += game_settings.alien_drop_speed# (2)随后调整外星人移动方向属性值game_settings.alien_fleet_direction *= -1
整合前面的准备方法1&2&3 ,完成外形人群碰壁检测与事件处置过程函数。
def aliens_update():# 碰撞检测与处置check_fleet_edges(aliens, game_settings)# 更新所有外星人aliens.update()
def update_screen(..., aliens):...# 绘制所有外星人到主屏幕aliens.draw(screen)
while True:.......gf.update_aliens(game_settings, aliens)gf.update_screen(...., aliens)
# 外星人设置self.alien_speed_factor = 1self.fleet_drop_speed = 10# fleet_direction为1表示向右移,为-1表示向左移self.fleet_direction = 1
排错:这里的放了最大的错误,给每个外星人单独初始化基本属性值,为什么,暂时不知道??? 
正解:直接赋值为self.game_settings = game_settings即可。
def __init__(self, screen, game_settings):.."""外星人坐标值支持浮点数"""self.x = float(self.rect.x)# 外星人基本属性初始化self.game_settings = game_settingsdef update(self, game_settings):"""向左或向右移动外星人"""self.x += (self.game_settings.alien_speed_factor*self.game_settings.fleet_direction)self.rect.x = self.x
# 开始游戏主循环while True:gf.check_events(ai_settings, screen, ship, bullets)ship.update()gf.update_bullets(bullets)gf.update_aliens(aliens)gf.update_screen(ai_settings, screen, ship, aliens, bullets)
def update_aliens(aliens):"""更新外星人群中所有外星人的位置"""aliens.update()
def check_edges(self):"""如果外星人位于屏幕边缘,就返回True"""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <= 0:return True
def change_fleet_direction(game_settings, aliens):"""将整群外星人下移,并改变它们的方向"""for alien in aliens.sprites():alien.rect.y = alien.rect.y + game_settings.fleet_drop_speed# print(alien.rect.x, alien.rect.y)game_settings.fleet_direction *= -1def check_fleet_edges(aliens, game_settings):# 对所有外人逐个进行边缘检测,依据检测的属性值返回做事件响应处置for alien in aliens.sprites():# 如果边缘碰撞事件发生,则对应的事件响应处置if alien.check_edges():change_fleet_direction(game_settings, aliens)breakdef update_aliens(game_settings, aliens, screen):"""检查是否有外星人位于屏幕边缘,并更新整群外星人的位置"""check_fleet_edges(aliens, game_settings)aliens.update(screen)
def update_screen(screen, bg_color, ship, bullets, aliens, game_settings):# Update Gamescreen.fill(bg_color)# 飞船移动更新ship.update()# 绘制子弹for bullet in bullets.sprites():bullet.draw_bullet()# 绘制飞船ship.blitme()# 绘制外星人update_aliens(game_settings, aliens, screen)aliens.draw(screen)
知识点:只有“image对象”才有image对象的精灵族其采用 images.draw(screen) 这个绘图方法,已经实际测试子弹逐个Rect对象,其就没有bullets.draw(screen)。
alien_invasion.py# 开始游戏主循环while True:# (1) process Inputgf.check_events(ship, screen, game_settings, bullets)# (2) Update Gamebullets.update()# 重构游戏画面绘制与更新gf.update_screen(screen, bg_color, ship, bullets, aliens, game_settings)# (3) renderpygame.display.update()