赞
踩
本篇博客接上一篇博客,上一篇中讲了如何创建一个游戏窗口和设置事件控制飞船左右移动。
上一篇博客链接:https://blog.csdn.net/Ace_bb/article/details/104843356
本篇博客实现让飞船发射子弹
class Settings(): """ 存储 游戏 的所有设置的类,存放一些基本参数""" def __init__(self): """ 初始化游戏的设置""" #屏幕设置 self.screen_width = 600 self.screen_height = 400 self.bg_color = (230,230,230) # 设置属性ship_speed_factor来控制飞船的速度 # 移动飞船时移动1.5 个像素 self.ship_speed_factor = 1.0 # 子弹设置 self.bullet_speed_factor = 0.5 # 子弹速度 self.bullet_width = 3 self.bullet_height = 15 self.bullet_color = 60, 60, 60 self.bullets_allowed = 3 # 限制子弹数量
这个类中初始化了子弹的基本属性,用一个小方块代替子弹。并且动态获取飞船的位置,将子弹的位置设置在飞船的正上发,实现飞船发射子弹的效果。
import pygame from pygame.sprite import Sprite class Bullet(Sprite): # 对飞船发射的子弹进行管理 def __init__(self, ai_settings,screen,ship): # 在飞船所处的位置创建一个子弹对象 super(Bullet,self).__init__() self.screen = screen # 在(0,0)处创建一个表示子弹的矩形, 再设置正确的位置 # 使用pygame.Rect创建一个空白的矩形,创建时必须提供(x,y)坐标 # 子弹的宽度和高度从ai_settings中获取 self.rect = pygame.Rect(0,0,ai_settings.bullet_width, ai_settings.bullet_height) # 设置子弹的位置,位于飞船的正上方。 self.rect.centerx = ship.rect.centerx self.rect.top = ship.rect.top #存储用小数表示的子弹位置,以便后期微调,存储子弹颜色和速度 self.y = float(self.rect.y) self.color = ai_settings.bullet_color self.speed_factor = ai_settings.bullet_speed_factor def update(self): # 设置子弹发出的效果,向上移动 # 更新表示子弹位置的小数值 self.y -= self.speed_factor # 更新表示子弹的rect的位置 self.rect.y = self.y def draw_bullet(self): pygame.draw.rect(self.screen,self.color,self.rect)
核心代码:
def update_bullets(bullets): # 更新子弹的位置, 并删除已消失的子弹 4303987588749 bullets.update() # 清楚越界的子弹,防止占用内存 # 遍历子弹编组的副本,在副本中检查每颗子弹,判断是否到顶端 for bullet in bullets.copy(): # 如果子弹到顶端则删除 if bullet.rect.bottom<=0: bullets.remove(bullet) # print(len(bullets)) # 打印输出剩余的子弹数量 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)
在game_functions.py中的完整代码:
import sys import pygame from bullet import Bullet def check_keydown_events(event,ai_settings,screen,ship,bullets): # 响应按键 右方向键 # 通过读取event.key,检查按下的是否是右箭头键 if event.key == pygame.K_RIGHT: # 向右移动飞船 # ship.rect.centerx += 1 飞船向右移动 ship.moving_right = True elif event.key == pygame.K_LEFT: # 向左移动飞船 # ship.rect.centerx -= 1 ship.moving_left = True elif event.key == pygame.K_SPACE: # 设置开火指令 fire_bullet(ai_settings, screen, ship, bullets) 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,ship,bullets): """ 响应按键和鼠标事件,在这个方法中指定需要检查的事件 """ # 事件都是通过pygame.event.get()方法获取 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 每次按键都会注册一个KEYDOWN # 检测到KEYDOWN事件时,我们需要检查按下的是否是特定的键 elif event.type == pygame.KEYDOWN: check_keydown_events(event,ai_settings,screen,ship,bullets) # 松开方向键时触发的事件,将moving_right or moving_left设为false elif event.type == pygame.KEYUP: check_keyup_events(event,ship) def update_screen(ai_settings, screen, ship,bullets): # 更新屏幕上的图像, 并切换新屏幕 #每次循环都会重绘制屏幕 screen.fill(ai_settings.bg_color) #只能有一个参数 for bullet in bullets.sprites(): bullet.draw_bullet() ship.blitme() # 让最近绘制的屏幕可见 pygame.display.flip() def update_bullets(bullets): # 更新子弹的位置, 并删除已消失的子弹 4303987588749 bullets.update() # 清楚越界的子弹,防止占用内存 # 遍历子弹编组的副本,在副本中检查每颗子弹,判断是否到顶端 for bullet in bullets.copy(): # 如果子弹到顶端则删除 if bullet.rect.bottom<=0: bullets.remove(bullet) # print(len(bullets)) # 打印输出剩余的子弹数量 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)
主文件中创建了一个子弹的Group组来管理子弹。
import sys import pygame from setting import Settings from pygame.sprite import Group from ship import Ship import game_functions as gf def run_game(): # 初始化游戏并创建一个屏幕对象 pygame.init() #初始化背景设置 ai_settings = Settings() screen = pygame.display.set_mode( (ai_settings.screen_width, ai_settings.screen_height)) #创建一个sceen窗口 pygame.display.set_caption("Alien Invasion") #创建一艘飞船 ship = Ship(ai_settings,screen) #设置背景颜色 bg_color = (230, 230, 230) # 创建一个用于存储子弹的编组,存储所有有效的子弹, # 管理发射出去的子弹 bullets = Group() #开始游戏的主循环 #循环控制管理屏幕更新 while True: gf.check_events(ai_settings,screen,ship,bullets) ship.update() # 更新子弹运行轨迹 gf.update_bullets(bullets) gf.update_screen(ai_settings, screen, ship,bullets) run_game()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。