@websec007
2020-06-18T22:35:16.000000Z
字数 5735
阅读 956
2020.Python从入门到实践-过程消化
self.alien_speed_factor = 1
def update(self):
self.x = self.x + game_settings.alien_speed_factor
self.rect.x = self.x
while True:
gf.update_aliens(aliens)
def update_aliens(self):
aliens.update()
self.fleet_drop_speed = 10
self.fleet_direction = 1
def check_edges(self):
scree_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right:
return True
elif self.rect.left <= 0:
return True
def update(self):
# 左右移动方向的动态更新调整
self.x += self.game_settings.alien_speed_factor*self.game_settings.fleet_direction
self.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_speed
game_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 = 1
self.alien_fleet_direction = 1
self.alien_drop_speed = 1
检测外星人移动是否有碰撞事件发生,如发生则直接返回一个事件属性值:True
def check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right:
return True
if self.rect.left <= 0:
return True
(依据碰壁检测)更新单个外星人移动方向方法
-> 1)单个外星人更新方法:alien.update()
-> 2)外星人移动方向属性:game_setting.alien_fleet_direction
self.fleet_direction = game_settings.alien_fleet_direction
def update(self):
self.x = self.x + self.speed_factor*self.fleet_dirction
self.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 = 1
self.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_settings
def 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 True
elif 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 *= -1
def check_fleet_edges(aliens, game_settings):
# 对所有外人逐个进行边缘检测,依据检测的属性值返回做事件响应处置
for alien in aliens.sprites():
# 如果边缘碰撞事件发生,则对应的事件响应处置
if alien.check_edges():
change_fleet_direction(game_settings, aliens)
break
def 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 Game
screen.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 Input
gf.check_events(ship, screen, game_settings, bullets)
# (2) Update Game
bullets.update()
# 重构游戏画面绘制与更新
gf.update_screen(screen, bg_color, ship, bullets, aliens, game_settings)
# (3) render
pygame.display.update()