飞机大战(2)
2.6.事件监听和控制英雄精灵移动
1.先获取所有事件
#获取所有事件
event_list=pygame.event.get()
注:用来获取当前发生的所有事件,并将其存储在event_list列表中。
2.实现正常退出游戏
#捕获窗口退出事件
for event in event_list:
if event.type==pygame.QUIT:
print("游戏结束")
pygame.quit()
exit(0)#参数为1是非正常退出,0是正常退出,终止python程序
注:if event.type == pygame.QUIT这行代码是一个条件判断语句,用来检查当前遍历到的事件类型是否是pygame.QUIT,表示尝试关闭游戏窗口,加上这个模块后我们运行出的界面就不会显示卡顿。
3.控制英雄精灵移动
#控制英雄界面移动
if event.type==pygame.KEYUP:
if event.key==pygame.K_LEFT:
heroPlaneX=heroPlaneX-5 if heroPlaneX>=5 else 0
elif event.key==pygame.K_RIGHT:
heroPlaneX = heroPlaneX+5 if heroPlaneX <= 375 else 380
elif event.key == pygame.K_UP:
heroPlaneY = heroPlaneY-5 if heroPlaneY >= 5 else 0
elif event.key == pygame.K_DOWN:
heroPlaneY = heroPlaneY+5 if heroPlaneY <= 521 else 526
注:heroPlaneX = heroPlaneX - 5 if heroPlaneX >= 5 else 0:如果我们按下左箭头键,且英雄精灵飞机的当前水平位置heroPlaneX大于等于5,则将飞机向左移动5个像素,设为0是为了以避免飞机移出屏幕左侧,剩下的与这个代码的意思类似。
4.按键动作重复执行
#设置灵敏度
pygame.key.set_repeat(20,30)
注:set_repeat是设置键盘灵敏度的,其中delay是延迟时间,interval是间隔时间,且都是毫秒级的,并且要在循环体外设置。
5.游戏更新
#更新页面
pygame .display.update()
代码位置:
注:标红的地方要修改,如果不修改,那么就会一直在循环里被初始化,结果就无法控制精灵的移动。
2.7.绘制敌机精灵和控制敌机精灵移动
1.绘制敌机精灵
# #加载敌机图片
enemy_img=pygame.image.load('img/enemy2.png')
enemy_img2=pygame.image.load("img/enemy2_hit.png")
# 定义敌机位置
enemy_rect = pygame.Rect(158, 0, 69, 69) # (480-69)/2
enemyPlaneX = enemy_rect.x
enemyPlaneY = enemy_rect.y
screen.blit(enemy_img, (enemyPlaneX, enemyPlaneY))
注:绘制敌机精灵要在循环体外绘制。
2.控制敌机精灵移动
# 控制精灵机移动
if direct == "左":
enemyPlaneX = 5
if hero_PlaneX <= 0:
direct = "右"
elif direct == "右":
enemyPlaneX += 5
if enemyPlaneX >= 480 - 69:
direct = "左"
注:enemyPlaneX的值是否大于等于480 - 69,如果是,则将direct的值设为"left",表示下一步移动方向为左边。
2.8.绘制精灵子弹
1.用类方法绘制精灵子弹
# 创建英雄机子弹类
# 子弹类
class HeroBullet():
def __init__(self, x, y, screen):
self.x = x # x坐标
self.y = y # y坐标
self.screen = screen # 窗口对象
self.pic = pygame.image.load("img/bullet2.png")
# 画子弹
def draw(self):
self.screen.blit(self.pic, (self.x, self.y))
self.move()
# 使子弹移动
def move(self):
self.y -= 5
# 创建敌机子弹类
class EnemyBullet():
def __init__(self, x, y, screen):
self.x = x
self.y = y
self.screen = screen
self.pic = pygame.image.load("img/bullet1.png")
# 画子弹
def draw(self):
self.screen.blit(self.pic, (self.x, self.y))
self.move()
def move(self):
self.y += 5
注:创建类要在循环体外创建,用draw方法来绘制飞机并调用move方法来更新飞机的位置,实现飞机在屏幕上的移动效果。
2.画出英雄战机的子弹
elif event.key == pygame.K_SPACE: # 英雄机控制发射子弹
# 调用子弹的方法和属性
hero_bullet = HeroBullet(hero_PlaneX + 51 - 2, hero_PlaneY - 11, screen)
# 把子弹放入列表中,子弹是多个,我们将多个实例化的子弹放入列表中
hero_Bulletlist.append(hero_bullet)
# 让子弹到最上面的时候消失
for bullet in hero_Bulletlist:
bullet.draw()
hero_Bulletlist.remove(bullet) if bullet.y < 0 else ''
注:我们要在循环体外创建一个英雄机子弹的列表,一个敌机子弹的列表。
# 敌机子弹列表
enemy_list = []
# 创建英雄机子弹列表
hero_Bulletlist = []
代码位置:
3.画出敌机子弹
#绘制敌机子弹
x = random.randint(1, 100)
if x == 5 or x == 78:
#实例化一个子弹
enemybullet = EnemyBullet(enemyPlaneX + 69 / 2 - 5 / 2, enemyPlaneY + 99, screen)
#产生的每一个子弹放到一个列表里
enemy_list.append(enemybullet)
for bullet2 in enemy_list:
bullet2.draw()#绘制子弹
enemy_bullet_rect = pygame.Rect(bullet2.x, bullet2.y, 5, 11)
flag2 = enemy_bullet_rect.colliderect(hero_rect)
注:random,这是Python中的一个标准库模块,提供了处理随机数的函数。
代码位置:
2.9绘制精灵爆炸
1.绘制敌机爆炸图片
# 碰撞检测
flag = hero_bullet_rect.colliderect(enemy_rect)
if flag:
print("敌机爆炸")
enemy_bomb = True
hero_Bulletlist.remove(bullet)
if enemy_bomb == False:
if enemy_bomb_index == 0:
# 切换图片#绘制敌机未暴炸图片
screen.blit(enemy_img, (enemyPlaneX, enemyPlaneY))
enemy_bomb_index += 1
else:
screen.blit(enemy_img2, (enemyPlaneX, enemyPlaneY))
enemy_bomb_index = 0
else:
if enemy_bomb_index == len(enemy_bomb_imgs):
time.sleep(0.2)
# 当敌机爆炸索引与图片总数相同时,退出游戏
exit(0)
enemy_bomb_img = pygame.image.load(enemy_bomb_imgs[enemy_bomb_index])
screen.blit(enemy_bomb_img, (enemyPlaneX, enemyPlaneY))#绘制爆炸图片
enemy_bomb_index += 1
time.sleep(0.5)
注:绘制敌机爆炸图片在循环体外创建。
#加载敌机战损
enemy_bomb_imgs=["img/enemy2_down1.png",
"img/enemy2_down2.png",
"img/enemy2_down3.png",
"img/enemy2_down4.png"]
注:其中colliderect是一个方法,用于检测两个矩形是否相交,用于碰撞检测;time.sleep(0.2)的作用是让程序暂停执行0.2秒,通常用于控制程序的执行速度或者在需要延迟执行的情况下使用。
代码位置:
2.绘制英雄机爆炸图片
flag2 = enemy_bullet_rect.colliderect(hero_rect)
if flag2:
print("英雄机爆炸")
hero_bomb = True
EnemyBiulist.remove(bullet)
if hero_bomb == False:
if heroIndexShift == 0:
screen.blit(hero_img1, (heroPlaneX, heroPlaneY))
heroIndexShift += 1
else:
screen.blit(hero_img2, (heroPlaneX, heroPlaneY))
heroIndexShift = 0
else:
if hero_bomb_index == len(hero_bomb_imgs):
# 当战机爆炸索引与图片总数相同时,退出游戏
time.sleep(0.3)
代码位置:
文章来源:https://www.toymoban.com/news/detail-858365.html
运行图片:
文章来源地址https://www.toymoban.com/news/detail-858365.html
到了这里,关于python游戏开发项目之飞机大战(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!