星际争霸之小霸王之小蜜蜂(十三)--接着奏乐接着舞

系列文章目录

星际争霸之小霸王之小蜜蜂(十二)--猫有九条命

 星际争霸之小霸王之小蜜蜂(十一)--杀杀杀

 星际争霸之小霸王之小蜜蜂(十)--鼠道

星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾

 星际争霸之小霸王之小蜜蜂(八)--蓝皮鼠和大脸猫

 星际争霸之小霸王之小蜜蜂(七)--消失的子弹

 星际争霸之小霸王之小蜜蜂(六)--让子弹飞

 星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速

 星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来


目录

系列文章目录

文章目录

前言

一、设置开始按钮

二、绘制开始按钮

 三、添加点击响应

 四、重置游戏进程

总结


前言

前面我们已经完成了游戏主体部分,现在我们要打磨游戏的细节,增加游戏的可玩性。


一、设置开始按钮

我们需要添加一个开始按钮,在我们点击开始按钮之前,游戏静止不动,当我们点击开始之后,游戏正常运行,当游戏结束后,回到初始状态,并出现开始按钮。

首先我们让游戏处于一个静止状态,就是我们之前设置的game_active,将其赋值为False

然后我们就需要在屏幕上放置一个开始按钮了,但是pygame没有直接创建按钮的方法,我们需要自己创建按钮的模块。

import pygame.fontclass Button():def __init__(self,new_setting,screen,msg):self.screen = screenself.screen_rect =screen.get_rect()#设置按钮的尺寸self.width,self.height = 200,50self.button_color = (0,255,0)self.text_color = (255,255,255)self.font = pygame.font.SysFont(None,48)#创建按钮的rect对象self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = self.screen_rect.centerself.prep_msg(msg)

 pygame.font.SysFont(None, 48)是用于创建一个新的字体对象,其中None表示默认字体,48是字体的大小。

 我们还调用了prep_msg函数,这个函数的目的是将文字变成图片,然后我们要将变成图片的文字显示在按钮的中间位置。

 def prep_msg(self,msg):self.msg_image= self.font.render(msg,True,self.text_color,self.button_color)self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.center

 self.font.render(msg, True, self.text_color, self.button_color)是Pygame中用于渲染文本的方法之一。它的作用是将文本字符串msg渲染成一个图像,以便在游戏中显示。在这个方法中,True表示启用抗锯齿功能,即使用高质量的渲染效果;self.text_color和self.button_color分别表示文本的颜色和按钮的颜色。该方法返回一个Surface对象,表示渲染后的文本图像。可以将这个Surface对象绘制到屏幕上,以显示文本 。

二、绘制开始按钮

我们已经完成按钮和按钮上文字的设置工作,现在我们需要将他们显示在屏幕上,首先我们在Button类里创建一个显示函数,然后主函数里调用这个函数。

def draw_button(self):self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)

 self.screen.fill(self.button_color, self.rect)是Pygame中用于填充屏幕背景色的方法之一。它的作用是将整个屏幕的背景色设置为指定的颜色,以便在游戏中显示。

该方法接受两个参数:color和rect。其中,color是要设置的颜色,可以是RGB元组或颜色名称;rect是一个Rect对象,表示屏幕的矩形区域。

在这个方法中,self.button_color表示要设置的颜色,self.rect表示整个屏幕的矩形区域。

self.screen.blit(self.msg_image, self.msg_image_rect)是Pygame中用于将一个图像绘制到另一个图像上的方法之一。它的作用是将指定的图像绘制到屏幕上的指定位置。

该方法接受三个参数:source、dest和area。其中,source是要绘制的图像,dest是要绘制到的目标位置,area是一个矩形区域,表示要绘制的区域。如果area为None,则只绘制source图像的左上角部分。

在这个方法中,self.msg_image是要绘制的图像,self.msg_image_rect是指定的目标位置。

 

 然后我们在主函数中调用它

play_button = Button(new_setting,screen,'开始')while True:gf.check_events(new_setting,screen,ship,bullets)if stats.game_active:ship.update()gf.update_bullets(new_setting,screen,bullets,aliens)gf.update_aliens(new_setting,stats,screen,ship,aliens,bullets)gf.update_screen(new_setting,screen,ship,bullets,aliens,play_button)

 我们首先创建了Button类的实例,然后我们希望每次刷新屏幕的绘制按钮,所以我们将play_button作为传参传入update_screen,我们希望的是游戏静止还没有开始的时候调用,显示开始按钮,所以要加个判断,在stats.game_active等于False的时候执行代码。因此update_screen要加一个传参stats。

 

def update_screen(new_setting,screen,stats,ship,bullets,aliens,play_button):screen.fill(new_setting.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)if not stats.game_active:play_button.draw_button()
pygame.display.flip()

 运行的时候发现中文不显示,也许是字体不对,我们先按照书上用英文play代替。

 

 三、添加点击响应

 我们现在已经在屏幕上绘制出开始按钮了,但是它只是显示出来,并没有什么作用。之前我们是监听键盘输入,现在我们需要监听鼠标的点击,当鼠标点击开始按钮的位置时候,我们就开始游戏。

def check_events(new_setting,screen,ship,bullets,stats,play_button):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:check_keydown_events(event,new_setting,screen,ship,bullets)elif event.type==pygame.KEYUP:check_keyup_events(event, ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x,mouse_y = pygame.mouse.get_pos()check_play_button(stats,play_button,mouse_x,mouse_y)def check_play_button(stats,play_button,mouse_x,mouse_y):if play_button.rect.collidepoint(mouse_x,mouse_y):stats.game_active = True

很好理解。首先判断监听的事件是否是鼠标点击,然后获取鼠标点击的位置。这里有一个新函数要学习。

play_button.rect.collidepoint(mouse_x, mouse_y)是Pygame中用于检测鼠标点击是否在按钮矩形区域内的方法。其中,play_button是一个pygame.Rect对象,表示一个矩形区域;mouse_x和mouse_y是鼠标的横坐标和纵坐标。

这个方法会返回一个布尔值,如果鼠标点击的位置在play_button矩形区域内,则返回True,否则返回False。这可以用于判断用户是否点击了按钮,以便在游戏中执行相应的操作。

经执行代码,点击开始游戏便开始了,游戏结束后恢复到原始状态,再点击开始又执行。

 四、重置游戏进程

 在玩游戏的过程中,我们发现游戏结束后,我们再点击开始,小花猫的生命值没有恢复,只有最后一条命,失败一次就重新开始了。因此我们需要在点击开始按钮后,对游戏进行重置。

def check_play_button(stats,play_button,mouse_x,mouse_y,new_setting,aliens,bullets,ship,screen):if play_button.rect.collidepoint(mouse_x,mouse_y):stats.reset_stats()stats.game_active = Truealiens.empty()bullets.empty()create_fleet(new_setting,screen,aliens)ship.center_ship()

 我们对check_play_button函数进行了修改,在相关调用的时候,参数都要修改这里就不一一列出来了,按照这个修改之后,运行又出现新的问题,之前因为结束将代表活动的参数stats.game_active设置为False,所以开始按钮一直保持在休眠状态,游戏结束后再出现,现在的开始按钮会一直处于活动状态,游戏开始后虽然看不见,但是点击开始按钮的位置,还是能实现点击开始按钮的效果,游戏可以重置,这显然是不合理的,因此我们要加个判断,只有游戏处于非活动状态时,点击才有效。

def check_play_button(stats,play_button,mouse_x,mouse_y,new_setting,aliens,bullets,ship,screen):if play_button.rect.collidepoint(mouse_x,mouse_y) and not stats.game_active:stats.reset_stats()stats.game_active = Truealiens.empty()bullets.empty()create_fleet(new_setting,screen,aliens)ship.center_ship()

总结

我们实现了游戏的开始可以按钮控制。点赞!!!

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

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

相关文章

什么是集成测试?集成测试方法有哪些?

1、基本概念: 将软件集成起来后进行测试。集成测试又叫子系统测试、组装测试、部件测试等。集成测试主要是针对软件高层设计进行测试,一般来说是以模块和子系统为单位进行测试。 2、集成测试包含的层次: 1. 模块内的集成,主要是…

Linux sed

1.sed介绍 sed:Stream Editor,流编辑器、行编辑器、逐行编辑 sed将每行内容读入到“内存”中,在内存中进行处理,将结果返回给屏幕,此段内存空间称为模式空间。 sed默认不编辑原文件,仅对模式空间的数据进行处理&…

OA 电子审批流程是什么?

公司中,最最最常见也是最最最多的就是——各种审批。 我当年第一次实习,在一家国企的行政部门,我们部门领导那个时候最主要的工作就是“打通流程”,咱也不知道他在打通什么流程,反正这个很重要就是了。 结果&#xf…

CSS动效合集之实现气泡发散动画

前言 👏CSS动效合集之实现气泡发散动画,速速来Get吧~ 🥇文末分享源代码。记得点赞关注收藏! 1.实现效果 2.实现步骤 定义一个数组bubbles,用来存储气泡列表的基本新,w表示宽高,x表示绝对定位…

【Python基础】P01S01 变量与字符串

P01S01 变量与字符串 变量变量的命名规则 字符串字符串的表达方法字符串的基本操作 数整数与浮点数数中下划线常量 注释 变量 变量的命名规则 变量名只能包含字母、数字和下划线; 变量名能以字母或下划线开头,但是不能以数字开头; 变量名不能…

130. 被围绕的区域

130. 被围绕的区域 题目-中等难度示例1. 新建boardbfs2. 哈希bfs 题目-中等难度 给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 示例 示例 1&#x…

6.SpringEL与List,Map

SpringEL与List,Map 文章目录 SpringEL与List,Map介绍Spring EL以注解的形式Spring EL以XML的形式 介绍 使用SpEL与 Map 和 List 的工作方式与Java是完全一样的 //get map whete key MapA Value("#{testBean.map[MapA]}") private String mapA;//get first value …

浅谈C++|类的继承篇

引子: 继承是面向对象三大特性之一、有些类与类之间存在特殊的关系,例如下图中: 我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。 这个时候我们就可以考虑利用继承的技术,减少…

2023全新TwoNav开源网址导航系统源码 | 去授权版

2023全新TwoNav开源网址导航系统源码 已过授权 所有功能可用 测试环境:NginxPHP7.4MySQL5.6 一款开源的书签导航管理程序,界面简洁,安装简单,使用方便,基础功能免费。 TwoNav可帮助你将浏览器书签集中式管理&#…

线程池启动线程 submit () 和 execute () 方法有什么不同?

ThreadPoolExecutor类是Java中用于创建和管理线程池的类,它提供了多个方法来提交任务给线程池,其中包括submit()和execute()方法。这两种方法有以下不同: 返回值:submit()方法返回一个Future对象,可以使用这个对象来跟踪任务的执行状态并获取任务的结果(如果有的话)。Fu…

JWT基础

概念 JSON Web Token本质上就是一串字符串,一串包含了很多信息的字符串令牌拥有三个部分头部-包含加密算法和令牌类型{"alg":"算法名称","type":"JWT"}负载-包含数据和信息-七个官方默认-也可以自己定义内容{iss&#xff…

ubuntu+.net6+docker 应用部署教程

先期工作 1、本地首先安装 Docker Desktop 2、本地装linux in windows 3、生成镜像 后期工作 1、云服务器部署 生成镜像方法 1、生成Dockerfile配置文件 开发工具visual studio 2022 如果项目已经存在,可以选中项目,右键点击->选择添加Docker…

基于Java的高校竞赛管理系统设计与实现(亮点:发起比赛、报名、审核、评委打分、获奖排名,可随意更换主题如蓝桥杯、ACM、王者荣耀、吃鸡等竞赛)

高校竞赛管理系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述4.2 系统角色 五、系统…

基于Matlab实现图像配准技术(附上源码+图像)

图像配准是数字图像处理中的重要技术之一,它的目标是将多幅图像进行准确的对齐,使得它们在空间上保持一致。图像配准在许多领域都有广泛的应用,如医学影像、遥感图像、计算机视觉等。本文将介绍如何使用Matlab实现图像配准技术,并…

Flink相关

墨滴社区 用 Flink 取代 Spark Streaming!知乎实时数仓架构演进_天池技术圈-阿里云天池 关于flink实时数仓的实际问题_flink datastream 按天,小时写入hdfs_一个写湿的程序猿的博客-CSDN博客 基于 Flink Hudi 的实时数仓在 Shopee 的实践 - 墨天轮

6.3 字符数组

思维导图: 前言: 主要内容: 前言内容整理 字符型数据和存储 字符型数据是依据字符的ASCII代码存储在内存单元中,通常占用一个字节的空间。ASCII代码可以被认为是整数,因此在C99标准中,字符类型被归类为整…

nodejs中的错误类型及捕获处理

nodejs中的错误类型及捕获处理 在 node 中,提供了 error 模块,并且内置了标准的 JavaScript 错误,本文将介绍在node中错误类型以及如何捕获。 错误类型 js错误 标准的js错误,跟在浏览器中运行js时提示的错误类型一样 RangeEr…

【Gradle-8】Gradle插件开发指南

1、前言 Gradle插件开发在Android进阶知识中是占有一定比例的,特别是在性能优化领域,基本都会涉及,而且跟我们日常的编译打包也息息相关,加上有不少招聘要求里也明确要有Gradle插件开发经验,所以即使大部分人的日常开…

SSH key 运作方式

1、本地创建SSH key pairs 2、把public key上传到网站服务器(如GitHub 3、当使用ssh方式连接时 本地SSH client向远端请求ssh连接远端发来random data要求加密本地ssh client用private key加密,把加密的data发送过去(不发送private key远端接…

I Pa?sWorD

2023icpc网络赛第一场 I 题意:题目给出只包含大小写字母,数字以及?的字符串,对于每一个小写字母,这一位字符既有可能是该小写字母,也有可能是该小写字母的对应大写字母,也就是该位的字符有两种可能&#x…