Pygame中Sprite实现逃亡游戏5

server/2024/10/17 21:02:37/

在《Pygame中Sprite实现逃亡游戏4》中通过碰撞检测实现了玩家、飞龙与飞火之间的碰撞处理,基本上实现了逃亡功能。最后,实现这个逃亡游戏中文字提示的功能。

1 操作提示

当进入游戏后,会在玩家下方的位置给出操作提示,如图1所示。

图1 显示操作提示

1.1 定义字体

要在屏幕中显示提示信息,必须首先定义字体,代码如图2所示。

图2 定义字体代码

其中,通过pygame.font模块中的Font()类定义字体变量font,第一个参数表示字体文件,也可以用None表示使用默认字体;第二个参数表示字体大小。

相关链接1 pygame.font.Font()类的详细使用方法请参考《Pygame显示文字》

1.2 定义显示信息的函数

接下来自定义一个函数用来显示指定信息,代码如图3所示。

图3 自定义函数代码

其中,第76行代码中自定义了一个名为print_text()的函数,该函数的font参数表示使用的字体,x和y参数表示显示信息的位置(横坐标和纵坐标),text表示显示的内容,color表示字体的颜色,默认为白色;第77-78行代码的作用是根据位置、内容和颜色显示指定信息。

相关链接2 显示信息的详细使用方法请参考《Pygame显示文字》

1.3 显示操作提示

在while True的内部,使用图4所示代码显示操作提示信息。

图4 显示操作提示的代码

从图4中可以看出,调用自定义函数print_text(),使用font字体在(350,560)这个位置上显示“Press SPACE to jump”信息。

注意1 图4所示的代码必须在group.draw(screen)代码之后。

2 玩家获胜提示

当飞龙被飞火击退到屏幕最左侧时,玩家获胜,如图5所示。

图5 玩家获胜

2.1 玩家获胜的判断

判断玩家获胜的代码在while True循环中,如图6所示。

图6 判断玩家获胜的代码

第155行代码的含义是当飞龙的横坐标小于-50,也就是飞龙被飞火打到屏幕左侧的一定位置处,表示玩家获胜,此时将获胜标志you_win设置为True,游戏结束表示game_over也设置为True。

注意2 获胜标志you_win初始值是False。

2.2 获胜信息的显示

当飞龙被击退到屏幕左侧某个位置时,显示玩家获胜信息,代码如图7所示。

图7 玩家获胜或失败信息显示的代码

其中,第163行代码判断游戏是否结束(触发游戏结束的条件有两个:玩家获胜或者玩家失败);第164行代码调用自定义函数print_text()显示“GAME OVER”,第165-168行代码对玩家获胜或者玩家失败进行判断,如果you_win的值是True则表示玩家获胜,否则表示玩家失败,则分别调用print_text()显示成功或失败的信息。

3 玩家失败信息提示

当飞龙抓到玩家,则玩家失败。飞龙抓到玩家的代码在《Pygame中Sprite实现逃亡游戏4》中已实现,此时game_over为True,you_win为False,根据图7所示代码,显示玩家失败的信息,效果如图8所示。

图8 显示玩家失败信息

4 完整代码

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,ydef print_text(font, x, y, text, color=(255,255,255)):imgText = font.render(text, True, color)screen.blit(imgText, (x,y))pygame.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
you_win = 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 = Trueif dragon.X < -50:you_win = Truegame_over = Truescreen.blit(bg, (0,0))group.update(ticks, 50)group.draw(screen)print_text(font, 350, 560, "Press SPACE to jump!")if game_over:print_text(font, 360, 100, "G A M E   O V E R")if you_win:print_text(font, 330, 130, "YOU BEAT THE DRAGON!")else:print_text(font, 330, 130, "THE DRAGON GOT YOU!")pygame.display.update()


http://www.ppmy.cn/server/125260.html

相关文章

实战OpenCV之图像滤波

基础入门 图像滤波是数字图像处理中一种非常重要的技术,主要用于图像噪声去除、图像平滑、突出图像特征,或者进行图像风格的转换。它通过数学运算对图像中的像素值进行修改,以达到特定的处理目的。图像滤波可以分为两大类,分别为:线性滤波、非线性滤波。 线性滤波器通过一…

SDK(1.1note)

什么是SDK 控制台程序&#xff08;Console User interface&#xff09;CUI 对于控制台程序&#xff0c;通用&#xff0c;也就是平台无关 图形界面系统 可是如果你想要播放一个音乐&#xff0c;C语言有嘛&#xff1f; 所以需要平台开发&#xff0c;不可以移植性 平台会提供…

uniapp vue3 使用echarts绘制图表 柱状图等

部分内容AI总结 Uniapp 使用 Vue3 和 ECharts 组件的总结 在 Uniapp 中使用 Vue3 和 ECharts 进行数据可视化是一种常见需求。以下将详细介绍如何在 Uniapp 项目中安装 ECharts 插件、在 main.js 中挂载 ECharts 以及一个简单的示例 demo。 1. 下载 ECharts 插件 在 Uniapp 中…

推荐一个可以把PDF样本册转换为翻页电子书的网站

​随着互联网的普及&#xff0c;越来越多的企业和个人开始意识到线上展览的重要性。如何将实体样本册转化为线上版本&#xff0c;让更多人了解和欣赏自己的产品与服务&#xff1f; 一、网站简介 这款PDF样本册免费上传网站名为“FLBOOK”&#xff0c;致力于为广大用户提供便捷…

vue3更具文件目录动态添加路由配置

在项目中&#xff0c;想要在某个文件夹下直接添加.vue文件&#xff0c;并根据文件自动生成route跳转&#xff0c; 在view文件夹下&#xff0c;建立threePage文件夹&#xff0c;在里面建立index.vue&#xff0c;index1.vue&#xff1b; 建立three.js文件&#xff0c; 动态获取…

[报错解决] 运行MATCHA时需要在线下载Arial.TTF字体,但是无法连接huggingface

一、报错详情 requests.exceptions.ConnectTimeout:(MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /ybelkada/fonts/resolve/main/Arial.TTF (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnec…

Elasticsearch要点简记

Elasticsearch要点简记 1、ES概述2、基础概念&#xff08;1&#xff09;索引、文档、字段&#xff08;2&#xff09;映射&#xff08;3&#xff09;DSL 3、架构原理4、索引字段的数据类型5、ES的三种分页方式&#xff08;1&#xff09;深度分页&#xff08;fromsize&#xff09…

使用myAGV、Jetson Nano主板和3D摄像头,实现了RTAB-Map的三维建图功能!

引言 在现代机器人技术中&#xff0c;高精度的环境感知与建图是实现自主导航的关键。本文将展示如何使用myAGV Jetson Nano移动平台搭载Jetson Nano BO1主板&#xff0c;结合RTAB-Map和3D相机&#xff0c;实现更加立体和细致的环境建图。myAGV Jetson Nano具备SLAM雷达导航功能…