四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主角跑步动作的实现)
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主角跑步动作的实现)
- 前言
- 一、添加主角的跑步图片素材
- 二、代码部分
- 1.监听键盘的按下动作,与按键抬起不同
- 2.在事件捕获部分,监听按键的抬起动作
- 3.根据按键进行不同的页面变化
- 3.根据按键进行不同的主角人物动作变化
- 4.实现向右跑步后的完整的Myself.py代码(带注释)
- 5.实现向右跑步后的完整的runner_main方法代码(带注释)
- 实现效果
前言
本篇主要实现页面通过空格键的释放使得页面进行暂停和运行,对主角添加按下向右箭头按键实现向右快速跑步动作
一、添加主角的跑步图片素材
图片放在了主角跑步素材
二、代码部分
1.监听键盘的按下动作,与按键抬起不同
keys = pygame.key.get_pressed()
2.在事件捕获部分,监听按键的抬起动作
for event in pygame.event.get():if event.type == pygame.QUIT:running = False#空格键作为暂停键 当空格键抬起时触发暂停动作#如果当前是运动状态,抬起空格变为暂停#如果当前是暂停状态,抬起空格变为运动elif event.type == pygame.KEYUP:if not isPause:if event.key == pygame.K_SPACE:isPause = Trueelse:if event.key == pygame.K_SPACE:isPause = False
3.根据按键进行不同的页面变化
#暂停状态下,道路不会向左滑动if isPause:margin=0else:margin=3#通过提升道路的滑动效果体现出疾跑的效果if keys[pygame.K_RIGHT]:margin=8
3.根据按键进行不同的主角人物动作变化
# 暂停状态下,主角也要保持静止,也就是说主角直保持一个动作,因此要传递一个参数给主角精灵
# 通过按下键盘的事件更改主角的状态,因此也需传递一个参数给主角来决定状态比如奔跑、跳跃以及滑行
screen.blit(myself.image, myself.rect)
myself.update(index,keys,isPause)
4.实现向右跑步后的完整的Myself.py代码(带注释)
import pygame
class Myself(pygame.sprite.Sprite):def __init__(self):super(Myself, self).__init__()self.image = pygame.image.load('material/image/myself/walk/1.PNG').convert_alpha()self.walk = [pygame.image.load('material/image/myself/walk/{:d}.PNG'.format(i)).convert_alpha() for i inrange(1, 8)]self.run = [pygame.image.load('material/image/myself/run/{:d}.PNG'.format(i)).convert_alpha() for i inrange(1, 6)]self.rect = self.walk[0].get_rect()self.rect.top=400self.rect.left=200self.state = 0 # 初始状态是步行态self.flag = 0 #设置标志位 记录按键按下的时钟def update(self, *args):#将是否暂停传递if args[2]: self.image=pygame.image.load('material/image/myself/walk/1.PNG').convert_alpha()else:#人物状态传递keys = args[1]#这里选择按下右箭头 是奔跑状态if keys[pygame.K_RIGHT]:self.state=1self.flag=args[0]#步行状态if self.state==0:if args[0] % 6 == 0:i = int(args[0] / 6)self.image=self.walk[i % len(self.walk)]self.rect.top = 400#奔跑状态elif self.state==1:#设置一定的动作时长 超出之后变为步行态if args[0]-self.flag>=12:self.state=0if args[0] % 6 == 0:i = int(args[0] / 8)self.image=self.run[i % len(self.run)]self.rect.top = 430
5.实现向右跑步后的完整的runner_main方法代码(带注释)
import pygame
from Myself import Myself
import ospygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((1080, 600))
pygame.display.set_caption('跑酷游戏')
#背景图
bg_image_path1 = 'material/image/background4.jpg'
bg_img_obj1 = pygame.image.load(bg_image_path1).convert_alpha()
#道路图
road_image_path= 'material/image/road1.png'
road_img_obj=pygame.image.load(road_image_path).convert_alpha()
#距离图
km_image_path= 'material/image/km.png'
km_img_obj=pygame.image.load(km_image_path).convert_alpha()
#按键图
keyUp_image_path= 'material/image/keyboardUpUp.png'
keyUp_img_obj=pygame.image.load(keyUp_image_path).convert_alpha()
keyLeft_image_path= 'material/image/keyboardLEFT.png'
keyLeft_img_obj=pygame.image.load(keyLeft_image_path).convert_alpha()
keyDown_image_path= 'material/image/keyboardDown.png'
keyDown_img_obj=pygame.image.load(keyDown_image_path).convert_alpha()
font_path = 'material/ziti/AlimamaFangYuanTiVF-Thin-2.ttf' # 例如 'SimSun.ttf'
chinese_font = pygame.font.Font(font_path, 30)
text_surface = chinese_font.render('跳跃', True, (0, 0, 255))
text1_surface = chinese_font.render('疾跑', True, (0, 0, 255))
text2_surface = chinese_font.render('滑行', True, (0, 0, 255))
def init():fps = 60running = Trueindex = 0left = 0right = 1080margin = 3myself = Myself()pygame.mixer.music.load(os.path.join('material/music', 'bgm1.mp3'))pygame.mixer.music.play(-1)km = '0'#标志位是否暂停isPause = Falsewhile running:# 获取键盘的按下事件,与抬起不同keys = pygame.key.get_pressed()for event in pygame.event.get():if event.type == pygame.QUIT:running = False#空格键作为暂停键 当空格键抬起时触发暂停动作#如果当前是运动状态,抬起空格变为暂停#如果当前是暂停状态,抬起空格变为运动elif event.type == pygame.KEYUP:if not isPause:if event.key == pygame.K_SPACE:isPause = Trueelse:if event.key == pygame.K_SPACE:isPause = False#暂停状态下,道路不会向左滑动if isPause:margin=0else:margin=3#通过提升道路的滑动效果体现出疾跑的效果if keys[pygame.K_RIGHT]:margin=8screen.blit(bg_img_obj1, (0, 0))screen.blit(road_img_obj, (left, 465))screen.blit(road_img_obj, (right, 465))#键位介绍screen.blit(keyUp_img_obj, (900, 5))screen.blit(text_surface, (980, 23))screen.blit(keyLeft_img_obj, (900, 70))screen.blit(text1_surface, (980, 88))screen.blit(keyDown_img_obj, (900, 135))screen.blit(text2_surface, (980, 148))if left<=-1080:left=left+2160if right<=-1080:right=right+2160# 暂停状态下,主角也要保持静止,也就是说主角直保持一个动作,因此要传递一个参数给主角精灵# 通过按下键盘的事件更改主角的状态,因此也需传递一个参数给主角来决定状态比如奔跑、跳跃以及滑行screen.blit(myself.image, myself.rect)myself.update(index,keys,isPause)screen.blit(km_img_obj, (10, 70))km_font = pygame.font.SysFont('arial', 30)km_num_surface = km_font.render(km, True, (0, 0, 255))screen.blit(km_num_surface, (80, 88))if index%6==0:km = str(int(km) + margin)index += 1pygame.display.update()clock.tick(fps)left -= marginright -= margin
if __name__=="__main__":init()
实现效果
按下向右疾跑键后实现加速效果
按下暂停键后实现暂停效果