完成上一篇文章的准备工作(pygame模块的创建,rect的使用和图片的命名导入),接下来我们就开启制作飞机大战的游戏。
文章最下方有本篇文章的完整代码。
1.创建游戏窗口
(1)创建游戏窗口,可视化
import pygame
# 游戏初始化
pygame.init()
# 使用screen接收返回值,代表整个窗口对象,mode设置窗口尺寸
screen = pygame.display.set_mode((480, 650)) # 元组中320表示宽度,550表示高度
(2)使游戏循环
#游戏循环
while True:
pygame.display.update()
运行结果:
2.修改游戏名称和图标
# 修改游戏名称,caption设置窗口标题
pygame.display.set_caption("飞机大战")
# 修改游戏图标,load加载图像资源。
# 然后在游戏循环中使用screen.blit()函数将加载的图片显示在窗口上的指定位置。
icon = pygame.image.load("img/icon.png")
pygame.display.set_icon(icon) #icon设置窗口的图标
运行结果:
3.绘制背景精灵和英雄飞机精灵
(1)绘制游戏背景图片
# 加载背景图片
bg_img = pygame.image.load("img/background.png")
# 将背景图片加载到窗口中,(0,0)表示背景图片放到原点
screen.blit(bg_img, (0, 0))
(2)绘制英雄飞机图片
# 加载英雄飞机
hero_img1 = pygame.image.load("img/me1.png")
hero_img2 = pygame.image.load("img/me2.png")
# 作为切换图片索引
heroIndexShift = 0
# 定义英雄飞机的rect(矩形区域的对象)
hero_rect = pygame.Rect(190, 526, 66, 80)
# 英雄精灵的x,y轴坐标
heroPlaneX = hero_rect.x
heroPlaneY = hero_rect.y
使用if… else…语句实现动态效果
#将英雄飞机绘制到窗口上
if heroIndexShift == 0:
screen.blit(hero_img1,(heroPlaneX, heroPlaneY))
heroIndexShift += 1
else:
screen.blit(hero_img2,(heroPlaneX, heroPlaneY))
heroIndexShift = 0
代码位置:
运行结果:
4.游戏时钟设置
为了设置游戏的刷新次数。
(1)创建游戏时钟
# 创建游戏时钟,
clock = pygame.time.Clock()
(2)每秒刷新60次
# 每秒刷新60次,限制游戏的帧率为60帧/秒
clock.tick(60)
代码位置:
5.修改英雄机位置
为了英雄精灵实现上下自动移动。
# 修改英雄飞机的y轴值
heroPlaneY -= 1
# 让飞机从底部飞出
if heroPlaneY <= 0:
heroPlaneY = 650
代码位置:
6.事件监听和控制英雄机移动
事件监听主要是键盘事件和鼠标事件,之前游戏不能正常关闭,是因为没有事件监听。
(1)事件监听
# 1.获取所有事件
event_list = pygame.event.get()
(2)实现正常退出游戏
# 2.捕获窗口退出事件
for event in event_list:
if event.type == pygame.QUIT: # 加上这个模块就不卡了
print("游戏结束了......")
pygame.quit() # 卸载模块
exit(0) # 终止Python程序,exit(0)表示正常退出,exit(1)表示异常退出
(3)控制英雄机移动
# 控制英雄精灵移动
if event.type == pygame.KEYDOWN:
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
(4)按键动作重复执行
第一个参数20表示按键长按后开始重复触发事件的延迟时间,单位为毫秒。也就是说,按住某个键不放,延迟20ms后开始重复触发事件。
第二个参数30表示按键重复触发事件的频率,单位为毫秒。也就是说,按住某个键不放后,每隔30ms重复触发事件一次。
# 设置灵敏度,首次出现重复输入的延迟时间为20毫秒,之后每次重复输入的间隔时间为30毫秒。
pygame.key.set_repeat(20, 30)
代码位置:
运行结果:
本篇文章就先讲解这么多,本篇文章能够实现飞机上下左右移动。
下面是本篇文章的完整代码:
import pygame
# 游戏初始化
pygame.init()
# 使用screen接收返回值,代表整个窗口对象,mode设置窗口尺寸
screen = pygame.display.set_mode((480, 650)) # 元组中320表示宽度,550表示高度
# 修改游戏名称,caption设置窗口标题
pygame.display.set_caption("飞机大战")
# 修改游戏图标,load加载图像资源。
# 然后在游戏循环中使用screen.blit()函数将加载的图片显示在窗口上的指定位置。
icon = pygame.image.load("img/icon.png")
pygame.display.set_icon(icon) #icon设置窗口的图标
# 加载背景图片
bg_img = pygame.image.load("img/background.png")
# 将背景图片加载到窗口中,(0,0)表示背景图片放到原点
# 加载英雄飞机
hero_img1 = pygame.image.load("img/me1.png")
hero_img2 = pygame.image.load("img/me2.png")
# 作为切换图片索引
heroIndexShift = 0
# 定义英雄飞机的rect(矩形区域的对象)
hero_rect = pygame.Rect(190, 526, 66, 80)
# 英雄精灵的x,y轴坐标
heroPlaneX = hero_rect.x
heroPlaneY = hero_rect.y
# 设置灵敏度,首次出现重复输入的延迟时间为20毫秒,之后每次重复输入的间隔时间为30毫秒。
pygame.key.set_repeat(20, 30)
# 创建游戏时钟,
clock = pygame.time.Clock()
while True:
# 每秒刷新60次,限制游戏的帧率为60帧/秒
clock.tick(60)
screen.blit(bg_img, (0, 0))
# 将英雄飞机绘制到窗口上
if heroIndexShift == 0:
screen.blit(hero_img1, (heroPlaneX, heroPlaneY))
heroIndexShift += 1
else:
screen.blit(hero_img2, (heroPlaneX, heroPlaneY))
heroIndexShift = 0
# 修改英雄飞机的y轴值
heroPlaneY -= 1
# 让飞机从底部飞出
if heroPlaneY <= 0:
heroPlaneY = 650
# 1.获取所有事件
event_list = pygame.event.get()
# 2.捕获窗口退出事件
for event in event_list:
if event.type == pygame.QUIT: # 加上这个模块就不卡了
print("游戏结束了......")
pygame.quit() # 卸载模块
exit(0) # 终止Python程序,exit(0)表示正常退出,exit(1)表示异常退出
# 控制英雄精灵移动
if event.type == pygame.KEYDOWN:
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
pygame.display.update()