Pygame基础4-多阶段

4-多阶段

原理

本章是对第2章的延续。
我们希望为游戏添加多个阶段,比如开始界面、游戏界面、结束界面等。
在这里插入图片描述
在这里插入图片描述

为此,我们可以使用一个类来管理游戏的不同阶段。
我们创建了GameManager类,并通过self.status属性表示不同的阶段。

  • intro阶段:显示准备的背景。当用户按下鼠标时,将状态切换为main_game
  • main_game阶段:进行游戏,更新游戏画面。
class GameManager:def __init__(self):self.status = "intro"def intro(self):for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()if event.type == pygame.MOUSEBUTTONDOWN:self.status = "main_game"screen.blit(bg_img, (0, 0))screen.blit(ready_img, (screen_width//2, screen_height//2))pygame.display.flip()def main_game(self):for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()if event.type == pygame.MOUSEBUTTONDOWN:crosshair.shoot()screen.blit(bg_img, (0, 0))target_group.update()target_group.draw(screen)crosshair_group.update()crosshair_group.draw(screen)pygame.display.flip()def start_game(self):if self.status == "intro":self.intro()elif self.status == "main_game":self.main_game()game_manager = GameManager()
while True:game_manager.start_game()clock.tick(60)

使用GameManager类管理游戏后,我们发现游戏的主循环变得很简单。

案例

完整代码。
添加了准备阶段。

# 使用pygame SPrite实现射击游戏
import pygame
import randomclass Crosshair(pygame.sprite.Sprite):def __init__(self, img_path):super().__init__()self.image = pygame.image.load(img_path)self.rect = self.image.get_rect()self.gun_shot = pygame.mixer.Sound('gunshot.wav')def shoot(self):self.gun_shot.play()pygame.sprite.spritecollide(crosshair, target_group, True)def update(self):self.rect.center = pygame.mouse.get_pos()class Target(pygame.sprite.Sprite):def __init__(self, img_path, x, y):super().__init__()self.image = pygame.image.load(img_path)self.rect = self.image.get_rect()self.rect.center = (x, y)def update(self):pass# init 
pygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.mouse.set_visible(False)
clock = pygame.time.Clock()
crosshair = Crosshair(r'PNG\HUD\crosshair_blue_small.png')crosshair_group = pygame.sprite.Group()
crosshair_group.add(crosshair)target_group = pygame.sprite.Group()
for i in range(20):x,y = random.randint(0, screen_width), random.randint(0, screen_height)target = Target(r'PNG\Objects\duck_target_yellow.png', x, y)target_group.add(target)bg_img = pygame.image.load(r'PNG\Stall\bg_wood.png')
bg_img = pygame.transform.scale(bg_img, (screen_width, screen_height))ready_img = pygame.image.load(r'PNG\HUD\text_ready.png')class GameManager:def __init__(self):self.status = "intro"def intro(self):for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()if event.type == pygame.MOUSEBUTTONDOWN:self.status = "main_game"screen.blit(bg_img, (0, 0))screen.blit(ready_img, (screen_width//2, screen_height//2))pygame.display.flip()def main_game(self):for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()if event.type == pygame.MOUSEBUTTONDOWN:crosshair.shoot()screen.blit(bg_img, (0, 0))target_group.update()target_group.draw(screen)crosshair_group.update()crosshair_group.draw(screen)pygame.display.flip()def start_game(self):if self.status == "intro":self.intro()elif self.status == "main_game":self.main_game()game_manager = GameManager()
while True:game_manager.start_game()clock.tick(60)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/571060.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

I/O(输入/输出流的概述)

文章目录 前言一、流的概述二、输入/输出流 1.字节/字符输入流2.字节/字符输出流总结 前言 在变量、数组和对象中储存的数据是暂时的,程序结束后它们就会丢失。如果想要永久地储存程序创建的数据,需要将其保存在磁盘文件中,这样就可以在程序中…

路径规划——搜索算法详解(三):RRT算法详解与MATLAB代码

本文讲解案例来自于古月学院,该篇也是对笔者学习内容的总结,有需要的朋友可以直接跳转到课程(新人福利8节课特惠价才12!不是广告哈,大家看需求选择,可以先看我的讲解。)。 前两篇我们介绍了Djk…

13.处理指定目录下的所有文件夹里的特定文件

1.命题要求 1)对于指定4K_phone目录下,有好几个文件夹,比如quality_15,quality_17,quality_19,等等quality_xx。获取每一个quality_xx文件夹里的1_teacher.txt。 例如,./4K_phone/quality_15/1_teacher.txt、./4K_pho…

基于nodejs+vue饮食分享平台python-flask-django-php

本系统采用了nodejs语言的express框架,数据采用MySQL数据库进行存储。进行开发设计,功能强大,界面化操作便于上手。本系统具有良好的易用性和安全性,系统功能齐全,可以满足饮食分享管理的相关工作。 前端技术&#xff…

前端面试题---->JavaScript

const声明的对象属性和数组的值可以被修改吗?为什么 原因:当使用const声明一个对象或数组时,实际上是保证了对象或数组的引用不会被修改,但对象或数组本身的属性或元素是可以被修改的。这是因为const只能保证指向的内存地址不变&a…

30---SDRAM电路设计

视频链接 SDRAM电路设计01_哔哩哔哩_bilibili SDRAM电路设计 1、SDRAM简介 SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器。 同步是指其时钟频率和CPU前端总线的系统时钟相同,并且内部命令的发送与数据的传输都以…

设计模式深度解析:深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 开篇: 欢迎来到设计模式的神秘…

Leetcode 3.26

Leetcode Hot 100 一级目录1.每日温度 堆1.数组中的第K个最大元素知识点:排序复杂度知识点:堆的实现 2.前 K 个高频元素知识点:优先队列 一级目录 1.每日温度 每日温度 思路是维护一个递减栈,存储的是当前元素的位置。 遍历整个…

iphone11promax硬件参数

1.截图 2.震动和静音方面还是不行的 3.相关的电子参数信息 4.出处 【苹果iPhone 11 Pro Max 4GB/64GB/全网通参数】Apple iPhone 11 Pro Max 4GB/64GB/全网通手机参数_规格_性能_功能-ZOL中关村在线

批量删除 rabbitmq中随机队列

批量删除 amq.gen–* 随机队列 操作错误产生了无效随机队列,需要批量删除 过滤列出指定amq.gen–队列 # 列出 指定 vhost/qq 以amq.gen开头的所有队列 rabbitmqctl list_queues --vhost / | grep ^amq.gen-# 批量删除队列 #由于list_queues会列出队列名称以及对应…

2022 年甘肃省职业院校技能大赛 高职组 网络系统管理竞赛 网络构建模块试题

2022 年甘肃省职业院校技能大赛 高职组网络系统管理竞赛 网络构建模块试题 目 录 考试说明… 3 任务描述… 3 任务清单… 3 (一)基础配置… 3 (二)有线网络配置… 4 (三)无线网络配置… 6 (四&a…

找茬游戏小程序源码系统:封面广告+插屏广告 自带流量主低成本 带完整的安装代码包以及搭建教程

近年来,小程序市场持续火爆,各类小程序层出不穷。找茬游戏小程序作为其中的一种,以其独特的游戏形式和良好的用户体验,吸引了大量用户。然而,对于许多开发者和商家来说,开发一款高质量的找茬游戏小程序并非…