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

Pygame中Sprite实现逃亡游戏4

在《Pygame中Sprite实现逃亡游戏3》中实现了玩家跳跃飞火的效果,接下来通过精灵类的碰撞检测来判断飞火是否击中玩家、飞火是否击中飞龙以及飞龙是否抓住玩家。

1 飞火是否击中玩家的判断

判断飞火是否击中玩家的代码如图1所示。

图1 判断飞火是否击中玩家的代码

第137行代码使用精灵类的collide_rect()方法判断飞火是否击中玩家,该方法的参数arrow表示飞火,参数player表示玩家,当飞火击中玩家时,collide_rect()方法返回True,第138代码在屏幕的右侧重置飞火,第139行代码将玩家的横坐标向左移动(玩家被飞火击中后要退后)。

相关链接1 reset_arrow()方法以及player.X属性请参考《Pygame中Sprite实现逃亡游戏2》

注意1 判断飞火是否击中玩家、飞火是否击中飞龙以及飞龙是否抓住玩家的代码均在while True循环中。

2 飞火是否击中飞龙的判断

判断飞火是否击中飞龙的代码如图2所示。

图2 判断飞火是否击中飞龙的代码

从图2中可知,当飞火是否击中飞龙后,需要重置飞火并且将飞龙的横坐标向左移动。

3 飞龙是否抓住玩家

判断飞龙是否抓住玩家的代码如图3所示。

图3 判断飞龙是否抓住玩家的代码

从图3中可以看出,当飞龙抓住玩家,此时游戏结束,game_over标志设置为True。

4 程序运行效果

程序运行效果如图4所示。

图4 程序运行效果

5 完整代码

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.0if pygame.sprite.collide_rect(arrow, player):reset_arrow()player.X -= 10if pygame.sprite.collide_rect(arrow, dragon):reset_arrow()dragon.X -= 10if pygame.sprite.collide_rect(player, dragon):game_over = Truescreen.blit(bg, (0,0))group.update(ticks, 50)group.draw(screen)pygame.display.update()

相关文章:

  • js替换css主题变量并切换iconfont文件
  • 11-pg内核之锁管理器(六)死锁检测
  • JavaScript中的输出方式
  • SSM框架学习(四、SpringMVC实战:构建高效表述层框架)
  • MAC的几个常见的快捷方式
  • Llama 3.2来了,多模态且开源!AR眼镜黄仁勋首批体验,Quest 3S头显价格低到离谱
  • LLM - 使用 vLLM 部署 Qwen2-VL 多模态大模型 (配置 FlashAttention) 教程
  • 测试面试题:请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试
  • CSS3 字体
  • 【matlab】读取.rec文件格式,脑电数据格式(Trodes)文件格式处理
  • 京东快递员的创新服务
  • 【网站打包app】Prime Web 1.0.10 – 将网站转换为 Flutter 应用程序 |Web View 应用程序 |Web 到 App
  • Tair简介
  • MySQL—触发器详解
  • rabbitMQ 简单使用
  • Angularjs之国际化
  • ES6核心特性
  • github从入门到放弃(1)
  • IOS评论框不贴底(ios12新bug)
  • Python - 闭包Closure
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vuex 学习笔记 01
  • 安卓应用性能调试和优化经验分享
  • 简单数学运算程序(不定期更新)
  • 今年的LC3大会没了?
  • 京东美团研发面经
  • 聊聊flink的BlobWriter
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 一个SAP顾问在美国的这些年
  • ​如何防止网络攻击?
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • (13)DroneCAN 适配器节点(一)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (黑马点评)二、短信登录功能实现
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十八)Flink CEP 详解
  • (转) ns2/nam与nam实现相关的文件
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • ..回顾17,展望18
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core 依赖注入的基本用发
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 直连SAP HANA数据库
  • .NET序列化 serializable,反序列化
  • //解决validator验证插件多个name相同只验证第一的问题
  • ::
  • @ConfigurationProperties注解对数据的自动封装
  • [20180224]expdp query 写法问题.txt
  • [AIGC] Java List接口详解