当前位置: 首页 > news >正文

Pygame中Sprite实现逃亡游戏3

在《Pygame中Sprite实现逃亡游戏2》中实现了飞龙和飞火的显示。接下来实现玩家跳跃效果,如图1所示。

图1 玩家跳跃效果

1 按键响应

当玩家按下键盘中空格按键后,游戏中的玩家就会跳跃,用于躲避飞火。在while True循环判断按键的代码中,通过如图2所示的代码实现对空格按键的响应。

图2 按键响应

其中,第120行中的keys是通过pygame.key.get_pressed()获取到的按键信息,如果keys[K_SPACE]的值是True,则表示键盘中的空格按键被按下;第121行中的player_jumping是玩家是否处于跳跃状态的标志,该标志初始值是False,对player_jumping进行判断,如果该值是False,则说明玩家处于奔跑状态,而并没有处于跳跃状态,接下来的代码将玩家设置为跳远状态,而如果player_jumping的值是True,则说明此时玩家已经在跳跃状态,如果此时再对玩家进行处理,那么玩家就会在空中实现再次跳跃。如果玩家处于奔跑状态时按下了空格按键,接下来第122行代码将player_jumping的值设置为True,即跳跃状态,之后第123行将跳跃速度jump_vel的值设置为-8.0,因为玩家向上跳跃时,其纵坐标是变小的。

2 玩家跳跃效果的实现

在修改了跳跃速度之后,继续在while True循环中修改玩家的纵坐标,实现跳跃效果,如图3所示。

图3 实现玩家跳跃效果的代码

第129行代码对玩家的状态进行判断,只有在处于跳跃状态时,才实现跳跃效果;第130行代码修改玩家的纵坐标player.Y,Y是精灵类MySprite的属性,在图4中显示的代码中定义。

图4 精灵类MySprite的属性

修改player.Y的值,实际上通过精灵类的_sety()方法修改了rect.y的值,也就是显示帧图像起始位置的纵坐标。图3中第131行代码改变jump_vel的值,也就是跳跃的高度,跳跃的高度应该是随着时间推移而减小的(因为jump_vel的值是-8.0),直到jump_vel的值变为0,则玩家达到跳跃的最高位置,接下来jump_vel变为正数,随着时间推移逐渐变大,玩家开始下落;第132-135行代码表示当玩家下落到地面(玩家初始位置)之下时,将玩家的纵坐标设置为地面player_start_y(保证玩家下落后在地面上),之后将玩家的状态设置为非跳跃即奔跑状态,最后跳跃速度jump_vel的值恢复为0。变量player_start_y在while True循环之前设置为玩家初始状态的纵坐标player.Y。

3 完整代码

import pygame
import os
import time
import random
from pygame.locals import *class MySprite(pygame.sprite.Sprite):def __init__(self, target):pygame.sprite.Sprite.__init__(self) #extend the base Sprite classself.master_image = Noneself.frame = 0self.old_frame = -1self.frame_width = 1self.frame_height = 1self.first_frame = 0self.last_frame = 0self.columns = 1self.last_time = 0#X propertydef _getx(self):return self.rect.xdef _setx(self,value):self.rect.x = valueX = property(_getx,_setx)#Y propertydef _gety(self):return self.rect.ydef _sety(self,value):self.rect.y = valueY = property(_gety,_sety)#position propertydef _getpos(self):return self.rect.topleftdef _setpos(self,pos):self.rect.topleft = posposition = property(_getpos,_setpos)def load(self, filename, width, height, columns):self.master_image = pygame.image.load(filename).convert_alpha()self.frame_width = widthself.frame_height = heightself.rect = Rect(0,0,width,height)self.columns = columns#try to auto-calculate total framesrect = self.master_image.get_rect()self.last_frame = (rect.width // width) * (rect.height // height) - 1def update(self, current_time, rate=30):#update animation frame numberif current_time > self.last_time + rate:self.frame += 1if self.frame > self.last_frame:self.frame = self.first_frameself.last_time = current_time#build current frame only if it changedif self.frame != self.old_frame:frame_x = (self.frame % self.columns) * self.frame_widthframe_y = (self.frame // self.columns) * self.frame_heightrect = Rect(frame_x, frame_y, self.frame_width, self.frame_height)self.image = self.master_image.subsurface(rect)self.old_frame = self.framedef __str__(self):return str(self.frame) + "," + str(self.first_frame) + \"," + str(self.last_frame) + "," + str(self.frame_width) + \"," + str(self.frame_height) + "," + str(self.columns) + \"," + str(self.rect)def reset_arrow():y = random.randint(250,350)arrow.position = 800,ypygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption('Escape The Dragon Game')
font = pygame.font.Font('1.ttf', 18)
framerate = pygame.time.Clock()group = pygame.sprite.Group()
player = MySprite(screen)
player.load('caveman.png', 50, 64, 8)
player.first_frame = 1
player.last_frame = 7
player.position = 400, 303
group.add(player)bg = pygame.image.load('background.png').convert_alpha()#create the dragon sprite
dragon = MySprite(screen)
dragon.load("dragon.png", 260, 150, 3)
dragon.position = 100, 230
group.add(dragon)#create the arrow sprite
arrow = MySprite(screen)
arrow.load("flame.png", 40, 16, 1)
arrow.position = 800,320
group.add(arrow)game_over = False
arrow_vel = 8.0
player_jumping = False
jump_vel = 0.0
player_start_y = player.Y
while True:framerate.tick(30)ticks = pygame.time.get_ticks()for event in pygame.event.get():if event.type == QUIT:pygame.quit()os.sys.exit()keys = pygame.key.get_pressed()if keys[K_ESCAPE]:pygame.quit()os.sys.exit()elif keys[K_SPACE]:if not player_jumping:player_jumping = Truejump_vel = -8.0#update the arrowif not game_over:arrow.X -= arrow_velif arrow.X < 0:reset_arrow()if player_jumping:player.Y += jump_veljump_vel += 0.5if player.Y > player_start_y:player.Y = player_start_yplayer_jumping = Falsejump_vel = 0.0screen.blit(bg, (0,0))group.update(ticks, 50)group.draw(screen)pygame.display.update()

相关文章:

  • Pandas 数据分析入门详解
  • 基于阿里云免费部署Qwen1-8B-chat模型并进行lora参数微调从0到1上手操作
  • Unity2022.3.x各个版本bug集合及推荐稳定版本
  • 基于AI+多技术融合在流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的实践应用
  • 神经网络(四):UNet图像分割网络
  • 运行程序时总是提示带so.xx.xx版本号共享库打不开(共享库的不同命名的含义)
  • MySQL的登录、访问、退出
  • 伊犁云计算22-1 apache 安装rhel8
  • 如何在 Rust 中通过 Rumqttc 实现 MQTT 通信
  • Cannot read properties of undefined (reading ‘upgrade‘)
  • R包:ggheatmap热图
  • Redis发布和订阅
  • C++三大特性——继承性(超万字详解)
  • 【推荐一个好用的AI】
  • 小程序-生命周期与WXS脚本
  • 【RocksDB】TransactionDB源码分析
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Angular数据绑定机制
  • canvas绘制圆角头像
  • css属性的继承、初识值、计算值、当前值、应用值
  • Effective Java 笔记(一)
  • Linux快速复制或删除大量小文件
  • Logstash 参考指南(目录)
  • VUE es6技巧写法(持续更新中~~~)
  • Yii源码解读-服务定位器(Service Locator)
  • 从PHP迁移至Golang - 基础篇
  • 从零搭建Koa2 Server
  • 分享几个不错的工具
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 使用putty远程连接linux
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 收藏好这篇,别再只说“数据劫持”了
  • 为什么要用IPython/Jupyter?
  • 我有几个粽子,和一个故事
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 再次简单明了总结flex布局,一看就懂...
  • nb
  • C# - 为值类型重定义相等性
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 阿里云API、SDK和CLI应用实践方案
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​比特币大跌的 2 个原因
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (03)光刻——半导体电路的绘制
  • (1)svelte 教程:hello world
  • (附源码)计算机毕业设计大学生兼职系统
  • (剑指Offer)面试题34:丑数
  • (力扣题库)跳跃游戏II(c++)
  • (论文阅读30/100)Convolutional Pose Machines
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (论文阅读40-45)图像描述1
  • (一)Linux+Windows下安装ffmpeg