python——飞机大战游戏——代码(上)

完成上一篇文章的准备工作(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()
  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值