四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主角跑步动作的实现)

四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主角跑步动作的实现)


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本篇主要实现页面通过空格键的释放使得页面进行暂停和运行,对主角添加按下向右箭头按键实现向右快速跑步动作


一、添加主角的跑步图片素材

在这里插入图片描述
图片放在了主角跑步素材

二、代码部分

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 = True
                else:
                    if event.key == pygame.K_SPACE:
                        isPause = False

3.根据按键进行不同的页面变化

 #暂停状态下,道路不会向左滑动
        if isPause:
            margin=0
        else:
            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 in
                       range(1, 8)]
        self.run = [pygame.image.load('material/image/myself/run/{:d}.PNG'.format(i)).convert_alpha() for i in
                     range(1, 6)]
        self.rect = self.walk[0].get_rect()
        self.rect.top=400
        self.rect.left=200
        self.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=1
                self.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=0
                if 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 os

pygame.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 = 60
    running = True
    index = 0
    left = 0
    right = 1080
    margin = 3
    myself = Myself()
    pygame.mixer.music.load(os.path.join('material/music', 'bgm1.mp3'))
    pygame.mixer.music.play(-1)
    km = '0'
    #标志位是否暂停
    isPause = False
    while 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 = True
                else:
                    if event.key == pygame.K_SPACE:
                        isPause = False
        #暂停状态下,道路不会向左滑动
        if isPause:
            margin=0
        else:
            margin=3

        #通过提升道路的滑动效果体现出疾跑的效果
        if keys[pygame.K_RIGHT]:
            margin=8


        screen.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+2160
        if 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 += 1
        pygame.display.update()
        clock.tick(fps)
        left -= margin
        right -= margin
if __name__=="__main__":
    init()

实现效果

按下向右疾跑键后实现加速效果
在这里插入图片描述
按下暂停键后实现暂停效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值