赞
踩
四、重构:模块game_function,创建game_function.py 文件名
1、创建game_function.py(用来存储项目的大部分函数)
2、函数check_events() :响应按键和鼠标事件
3、函数update_screen() :更新屏幕上的图像并切换到新屏幕
4、函数check_play_button() :在玩家单击Play按钮时开始新游戏
5、函数change_fleet_direction() :将整群外星人下移,并改变它们的方向
6、函数update_aliens() : 检查是否有外星人位于屏幕边缘,并更新外星人群中所有外星人的位置
等等一些函数,代码有详细注释,就不一个个列出来了
每当用户按键时,都在pygam中注册一个KEYDOWN事件,事件都是通过方法pygame.event.get()获取的。
(1)响应按键(如果按下右箭头键则增大飞船的 rect.centerx 值)
(2)允许飞船不断移动(设置标志 self.moving_right,按下为true,松开为false)
(3)左右移动 :类似飞船右移动
(4)调整飞船速度
settings.py中添加飞船的速度属性ship_speed_factor
__init__()中初始化一个ai_settings的属性 在飞船的属性center中存储小数值, 更新飞船的center值,而不是rect。 根据self.center更新rect对象。
(5)限制飞船的活动范围
ship.py: 对移动标志进行if判断时添加self.rect.right和self.rect.left,即要保证外接矩形的右边缘的x坐标小于屏幕右边缘,左边缘的x坐标要保证大于0。
(6)重构check_events()
将check_events()的代码放在两个函数中,一个处理KEYDOWN事件,一个处理KEYUP事件。
等等,代码有详细注释,就不一个个列出来了
代码如下
import sys import pygame from time import sleep from bullet import Bullet from alien import Alien def check_keydown_events(event,ai_settings,screen,ship,bullets): #响应按键 if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = True elif event.key ==pygame.K_SPACE: fire_bullet(ai_settings,screen,ship,bullets) #输入q键,退出游戏 elif event.key == pygame.K_q: sys.exit() def fire_bullet(ai_settings,screen,ship,bullets): #创建一颗子弹,并将其加入到编组bullets中 if len(bullets) < ai_settings.bullets_allowed: new_bullet = Bullet(ai_settings,screen,ship) bullets.add(new_bullet) def check_keyup_events(event,ship): #响应松开 if event.key == pygame.K_RIGHT: ship.moving_right = False elif event.key == pygame.K_LEFT: ship.moving_left = False def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets): #响应按键和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.MOUSEBUTTONDOWN: # 返回一个元祖,包含鼠标的x和y坐标 mouse_x , mouse_y = pygame.mouse.get_pos() check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y) elif event.type == pygame.KEYDOWN: check_keydown_events(event,ai_settings,screen,ship,bullets) #向右移动飞船 #ship.rect.centerx += 1 elif event.type == pygame.KEYUP: check_keyup_events(event,ship) def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y): #在玩家单击Play按钮时开始新游戏 #collidepoint()检查鼠标单击位置是否在Play按钮的rect内 button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y) if button_clicked and not stats.game_active: #重置游戏设置 ai_settings.initialize_dynamic_settings() #隐藏光标 pygame.mouse.set_visible(False) #重置游戏统计信息 stats.reset_stats() stats.game_active = True #重置记分牌图像 sb.prep_score() sb.prep_high_score() sb.prep_level() sb.prep_ships() #清空外星人列表和子弹列表 aliens.empty() bullets.empty() #创建一群新的外星人,并让飞船居中 create_fleet(ai_settings,screen,ship,aliens) ship.center_ship() def update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button): #更新屏幕上的图像,并切换到新屏幕 screen.fill(ai_settings.bg_color) #在飞船和外星人后面重绘所有子弹 for bullet in bullets.sprites(): bullet.draw_bullet() ship.blitme() #显示分数 sb.show_score() #在屏幕上绘制编组中的每个外星人 #aliens.blitme() aliens.draw(screen) #如果游戏处于非活跃状态,就绘制Play按钮 if not stats.game_active: play_button.draw_button() #让最近绘制的屏幕可见 pygame.display.flip() def update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets): #更新子弹的位置,并删除已经消失的子弹 #更新子弹的位置 bullets.update() # 删除已消失的子弹 for bullet in bullets.copy(): if bullet.rect.bottom <= 0: bullets.remove(bullet) check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets) def check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets): #检查是否有子弹击中了外星人 #如果是这样,就删除相应的子弹和外星人 collisions = pygame.sprite.groupcollide(bullets,aliens,True,True) if collisions: for aliens in collisions.values(): stats.score += ai_settings.alien_points *len(aliens) sb.prep_score() check_high_score(stats,sb) if len(aliens) == 0: #删除现有的子弹,加快游戏节奏,并新建一群外星人,就提高一个等级 bullets.empty() ai_settings.increase_speed() #提高等级 stats.level += 1 sb.prep_level() create_fleet(ai_settings,screen,ship,aliens) def get_number_aliens_x(ai_settings,alien_width): #计算一行可容纳多少个外星人 available_space_x = ai_settings.screen_width - 2 * alien_width number_aliens_x = int(available_space_x / (2 * alien_width)) return number_aliens_x def create_alien(ai_settings,screen,aliens,alien_number,row_number): # 创建一个外星人并把其放入当前行 alien = Alien(ai_settings, screen) alien_width = alien.rect.width alien.x = alien_width + 2 * alien_width * alien_number alien.rect.x = alien.x alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number aliens.add(alien) def create_fleet(ai_settings,screen,ship,aliens): #创建外星人群 #创建一个外星人,并计算一行可容纳多少个外星人 #外星人的间距为外星人的宽度 alien = Alien(ai_settings,screen) number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width) number_rows = get_number_rows(ai_settings,ship.rect.height,alien.rect.height) #创建第一行外星人 for row_number in range(number_rows): for alien_number in range(number_aliens_x): create_alien(ai_settings,screen,aliens,alien_number,row_number) def get_number_rows(ai_settings,ship_height,alien_height): #计算屏幕可容纳多少行外星人 available_space_y = (ai_settings.screen_height - (3 * alien_height) - ship_height) number_rows = int(available_space_y / (2 * alien_height)) return number_rows def check_fleet_edges(ai_settings,aliens): #有外星人到达边缘时,采取相应措施 for alien in aliens.sprites(): if alien.check_edges(): change_fleet_direction(ai_settings,aliens) break def change_fleet_direction(ai_settings,aliens): #将整群外星人下移,并改变它们的方向 for alien in aliens.sprites(): alien.rect.y += ai_settings.fleet_drop_speed #将ai_settings.fleet_durection的值修改为其当前值与-1的乘积 ai_settings.fleet_direction *= -1 def ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets): #响应被外星人撞到的飞船 if stats.ships_left > 0: #将ship_left减一 stats.ships_left -= 1 #更新记分牌 sb.prep_ships() #清空外星人和子弹列表 aliens.empty() bullets.empty() #创建一群新的外星人,并将飞船放到屏幕低端中央 create_fleet(ai_settings,screen,ship,aliens) ship.center_ship() #暂停 sleep(0.5) else: stats.game_active = False pygame.mouse.set_visible(True) def check_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets): #检查是否有外星人到达了屏幕低端 screen_rect = screen.get_rect() for alien in aliens.sprites(): if alien.rect.bottom >=screen_rect.bottom: #像飞船被撞到一样进行处理 ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets) break def update_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets): #检查是否有外星人位于屏幕边缘,并更新外星人群中所有外星人的位置 check_fleet_edges(ai_settings,aliens) aliens.update() #检查是否有外星人到达屏幕低端 check_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets) #检测外星人和飞船之间的碰撞 if pygame.sprite.spritecollideany(ship,aliens): ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets) #print("Ship hit!!!") def check_high_score(stats,sb): #检查是否诞生了新的最高得分 if stats.score > stats.high_score: stats.high_score = stats.score sb.prep_high_score()
点击链接 https://blog.csdn.net/Ljt101222/article/details/81253329 进入 Python外星人入侵完整代码和注释(五)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。