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

目录

前言

一、思路

 二、调整小蜜蜂的移速

 三、限制活动范围

 四、继续重构

总结 


前言

前面我们已经让小蜜蜂左右移动起来了,而且是连续的左右移动,但是在使用的过程中,因为我使用的是笔记本电脑,所以屏幕比较小,设置的窗口也小,我感觉到小蜜蜂的敏捷有点高,速度太快了,而且很容易跑出窗口看不见了,对于游戏玩家来说,这体验是极差的。所以我们今天要解决两个问题:一是给小蜜蜂降速,二是限制小蜜蜂的移动范围。

一、思路

“大蟒蛇”上是认为飞船的速度太慢,要加快速度,因为我的屏幕比较小,所以我要减慢速度,但是原理是一样的,只要改变参数的值就可以达到效果。

最简单的思路就是之前我们每次都是将self.rect.centerx参数移动一个像素,那么我们每次移动0.5或者更少不就行了吗?我们先修改一下代码试试看:

import pygameclass Ship():def __init__(self,screen):self.screen = screenself.image = pygame.image.load('cat.png')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom=self.screen_rect.bottomself.moving_right = Falseself.moving_left = Falsedef update(self):if self.moving_right:self.rect.centerx += 0.5if self.moving_left:self.rect.centerx -= 0.5           def blitme(self):self.screen.blit(self.image,self.rect)

 运行之后发现,小蜜蜂只能右移,不能左移,当我参数0.5继续下降至0.4时,发现左右移动都不行了,于是我增加了一个 print(self.rect.centerx),看看点击之后每次的值到底是多少,结果发现self.rect.centerx是一个整数,会根据结果四舍五入,也就是说每次加0.5和加1效果是一样的,并不会减慢移动速度,只要能移动速度都是1。

“大蟒蛇”给的思路是定义一个浮点型变量(暂定为w),来保存小蜜蜂的位置,每次先改变w的值,最后再将w传给self.rect.centerx。有些人就会问了,那不是和前面一样吗?其实还是有区别的,就拿每次移动0.5个像素为例,之前的方法,向右移动0.5和1个像素是一样的,每次都是1个像素,向左的话是原地不动。用变量保存之后,第一次向右移动0.5,实际移动1,第二次向右移动0.5,实际不动,这里有些人可能有点蒙,我们来做个对比。

我们的窗口宽是800,初始小蜜蜂在中间的位置,所以w和self.rect.centerx初始值是400。

W:                     400 405 410 415 420,将w赋值给self.rect.centerx后,self.rect.centerx的值为:

self.rect.centerx:400 410 410 420 420

 可以看出self.rect.centerx两次位移一个像素,平均起来就相当于每次移动0.5个像素,向左移动也是同理,两次位移一个像素,当速度够快的情况下确实能达到减速的目的,但是不知道这个游戏会不会肉眼发现卡顿,毕竟走一步停一步,下面我们用代码实现看看效果。

 二、调整小蜜蜂的移速

 首先在settings模块里设定一个每次移动的数值,“大蟒蛇”里设置的是1.5,因为它觉得移动慢了,我们设置为0.5吧

class Settings():def __init__(self):self.screen_width = 800self.screen_height = 600self.bg_color = (220,220,220)self.ship_speed_factor = 0.5

然后我们再在ship函数里面调用ship_speed_factor。

 

import pygameclass Ship():def __init__(self,screen,new_settings):self.screen = screenself.image = pygame.image.load('cat.png')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom=self.screen_rect.bottomself.new_settings = new_settingsself.moving_right = Falseself.moving_left = Falseself.center = float(self.rect.centerx)def update(self):if self.moving_right:self.center += self.new_settings.ship_speed_factor  if self.moving_left:self.center -= self.new_settings.ship_speed_factorself.rect.centerx = self.centerdef blitme(self):self.screen.blit(self.image,self.rect)

 可以看出,我们增加了传参new_settings,目的是把参数ship_speed_factor传进去,最后我们在主函数里引用函数的时候加上参数就行。

import pygame
import settings
from ship import Ship
import game_functions as gfdef run_game():pygame.init()new_setting=settings.Settings()screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height))ship = Ship(screen,new_setting)pygame.display.set_caption("狂敲代码的橘子")while True:gf.check_events(ship)ship.update()gf.update_screen(new_setting,screen,ship)run_game()

我帮大家运行了下,很丝滑,根本感觉不到卡顿,但是有个问题,还是快了,根本感觉不到减速,在我将ship_speed_factor参数降至0.1后,速度感觉到明显下降,而且也感觉不到卡顿。

 

 三、限制活动范围

 首先说明,窗口的坐标的左上角坐标(0,0),而右下,按照我设置的窗口那就是(799,599),因为小蜜蜂现在只能左右移动,所以左移范围不超过0,右移不超过799。按照这个思路,我们只需要调整self.center之前加上判断即可,代码如下:

import pygameclass Ship():def __init__(self,screen,new_settings):self.screen = screenself.image = pygame.image.load('cat.png')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom=self.screen_rect.bottomself.new_settings = new_settingsself.moving_right = Falseself.moving_left = Falseself.center = float(self.rect.centerx)def update(self):if self.moving_right and self.rect.right < self.screen_rect.right:self.center += self.new_settings.ship_speed_factorif self.moving_left and self.rect.left > 0:self.center -= self.new_settings.ship_speed_factorself.rect.centerx = self.centerdef blitme(self):self.screen.blit(self.image,self.rect)

 经测试,功能实现,小蜜蜂跑不出屏幕了。

 四、继续重构

 “大蟒蛇”说随着游戏开发的进行,函数check_events()会越来越长,需要将其重构,使代码更加清晰,增加阅读性。其实我们在编程的时候应该是能想到,随着监听的事项变多,判断语句会越来越多。“大蟒蛇”给出的方案是将键盘按下后的操作和键盘弹起的操作封装成两个函数,减少check_events()函数的大小,这样代码不会少,但是会清晰点。我们试着写下:

import sys
import pygamedef check_keydown_events(event,ship):if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Truedef check_keyup_events(event,ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(ship):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:check_keydown_events(event, ship)elif event.type==pygame.KEYUP:check_keyup_events(event, ship)def update_screen(new_setting,screen,ship):screen.fill(new_setting.bg_color)ship.blitme()pygame.display.flip()

对比之前的代码,我们只是建立两个函数,将按键抬起或者按下的操作代码全部拷贝到函数里,然后再相应的位置调用即可,这里就不赘述了。

总结 

 截至目前,小蜜蜂的移动操作基本已经完毕,这个游戏应该是像三维弹球一样,小蜜蜂在最下面左右移动,不会满屏飞的,如果是这样,后期我们再升级。

 

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

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

相关文章

分库分表之拆分键设计 | 京东物流技术团队

众所周知&#xff0c;在现实世界中&#xff0c;每一个资源都有其提供能力的最大上限&#xff0c;当单一资源达到最大上限后就得让多个资源同时提供其能力来满足使用方的需求。同理&#xff0c;在计算机世界中&#xff0c;单一数据库资源不能满足使用需求时&#xff0c;我们也会…

Vue2-全局事件总线、消息的订阅与发布、TodoList的编辑功能、$nextTick、动画与过渡

&#x1f954;&#xff1a;高度自律即自由 更多Vue知识请点击——Vue.js VUE2-Day9 全局事件总线1、安装全局事件总线2、使用事件总线&#xff08;1&#xff09;接收数据&#xff08;2&#xff09;提供数据&#xff08;3&#xff09;组件销毁前最好解绑 3、TodoList中的孙传父&…

LRU淘汰策略执行过程

1 介绍 Redis无论是惰性删除还是定期删除&#xff0c;都可能存在删除不尽的情况&#xff0c;无法删除完全&#xff0c;比如每次删除完过期的 key 还是超过 25%&#xff0c;且这些 key 再也不会被客户端访问。 这样的话&#xff0c;定期删除和堕性删除可能都彻底的清理掉。如果…

飞天使-k8s基础组件分析-pod

文章目录 pod介绍pod 生命周期init 容器容器handlerpod中容器共享进程空间sidecar 容器共享 参考链接 pod介绍 最小的容器单元 为啥需要pod? 答: 多个进程丢一个容器里&#xff0c;会因为容器里个别进程出问题而出现蝴蝶效应&#xff0c;pod 是更高级的处理方式pod 如何共享相…

机器学习深度学习——NLP实战(情感分析模型——RNN实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——NLP实战&#xff08;情感分析模型——数据集&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&…

Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)

Hadoop学习&#xff1a;深入解析MapReduce的大数据魔力之数据压缩&#xff08;四&#xff09; 4.1 概述1&#xff09;压缩的好处和坏处2&#xff09;压缩原则 4.2 MR 支持的压缩编码4.3 压缩方式选择4.3.1 Gzip 压缩4.3.2 Bzip2 压缩4.3.3 Lzo 压缩4.3.4 Snappy 压缩4.3.5 压缩…

Nets3e v1.1.4(攻击者在受害者主机上偷拍并弹出受害者个人照片)

Github>https://github.com/MartinxMax/Nets3e/tree/Nets3e_V1.1.4 首页 历史更新: Nets3e v1.1.4 新增echo参数,-g -echo,生成payload后,受害者泄露的个人照片将会在受害者的主机上弹出展示 Nets3e v1.1.3 修复受害者无法获取公网IP,新增钉钉实时监控推送 Nets3e v1.1…

excel 动态表头与合并列

零、希望Springboot-java导出excel文件&#xff0c;包括动态表头与下边合并的列 使用 org.apache.poi 与自己封装工具类实现相关功能。代码如下 一、代码 1、依赖 implementation(group: org.apache.poi,name: poi-ooxml,version: 4.1.0)implementation(group: org.apache.po…

VR漫游:720度实景参观,打造魅力生态小区

随着城市的不断发展&#xff0c;小区的建设越发具有生态化、绿色化的特点&#xff0c;人们也会偏向选择更加适合居住的小区。为了让更多的用户体验小区的舒适性&#xff0c;不少地产开发商准备引入VR漫游技术。 VR漫游不仅能够真实地展示现场环境&#xff0c;还可以改变传统网络…

【数据结构】实现栈和队列

目录 一、栈1.栈的概念及结构&#xff08;1&#xff09;栈的概念&#xff08;2&#xff09;栈的结构 2.栈的实现&#xff08;1&#xff09;类型和函数的声明&#xff08;2&#xff09;初始化栈&#xff08;3&#xff09;销毁&#xff08;4&#xff09;入栈&#xff08;5&#x…

连接未来 驱动创新|腾讯云 CODING DevOps 主题沙龙诚邀您的参与

点击链接了解详情 随着企业数字化转型步入深水区&#xff0c;DevOps 作为数字化转型关键的内建阶段&#xff0c;其应用和实施已经成为企业提升研发效率&#xff0c;实现快速迭代和持续交付的重要手段。然而如何有效地实施 DevOps&#xff0c;如何利用 DevOps 推动业务发展和创新…

CSS加载失败的6个原因

有很多刚刚接触 CSS 的新手有时会遇到 CSS 加载失败这个问题&#xff0c;但测试时&#xff0c;网页上没有显示该样式的问题&#xff0c;这就说明 CSS 加载失败了。出现这种状况一般是因为的 CSS 路径书写错&#xff0c;或者是在浏览器中禁止掉了 CSS 的加载&#xff0c;可以重新…

vue3 路由缓存问题

目录 解决问题的思路&#xff1a; 解决问题的方案&#xff1a; 1、给roter-view添加key&#xff08;破坏复用机制&#xff0c;强制销毁重建&#xff09; 2、使用beforeRouteUpdate导航钩子 3、使用watch监听路由 vue3路由缓存&#xff1a;当用户从/users/johnny导航到/use…

[网络架构]Self-organized operational neural networks (SelfONN)

Self-organized operational neural networks (SelfONN 背景CNNONNSelfONNCNN, ONN&#xff0c; SelfONN对比SelfONN与CNN的关系总结References 背景 本节要分享的是SelfONN, SelfONN可以看作是ONN的优化/升级&#xff0c; 而ONN可以看作是更一般化的CNN&#xff0c; 克服了CN…

自己实现 SpringMVC 底层机制 系列之-实现任务阶段 6-完成控制器方法获取参数-@RequestParam

&#x1f600;前言 自己实现 SpringMVC 底层机制 系列之-实现任务阶段 6-完成控制器方法获取参数-RequestParam &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c…

Feign:使用接口方式调用服务

创建一个新的消费者模块并导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://ma…

Linux学习之firewallD

systemctl status firewalld.service查看一下firewalld服务的状态&#xff0c;发现状态是inactive (dead)。 systemctl start firewalld.service启动firewalld&#xff0c;systemctl status firewalld.service查看一下firewalld服务的状态&#xff0c;发现状态是active (runni…

无涯教程-PHP - preg_grep()函数

preg_grep() - 语法 array preg_grep ( string $pattern, array $input [, int $flags] ); 返回由与给定模式匹配的输入数组元素组成的数组。 如果将flag设置为PREG_GREP_INVERT&#xff0c;则此函数返回输入数组中与给定模式不匹配的元素。 preg_grep() - 返回值 返回使用…

pdf转word最简单方法~

pdf转word最简单方法&#xff01;pdf转word最简单方法我们都知道&#xff0c;PDF文件是一种只读文件格式&#xff0c;无法按照需求对PDF文件进行更改与编辑&#xff0c;从而影响到了PDF文件的使用。所以&#xff0c;我们需要将PDF文件转换为word文档&#xff0c;以此来保证文件…

LLM 生成式配置的推理参数温度 top k tokens等 Generative configuration inference parameters

在这个视频中&#xff0c;你将了解一些方法和相关的配置参数&#xff0c;这些参数可以用来影响模型在下一个词生成时的最终决策方式。如果你在Hugging Face网站或AWS的游乐场中使用过LLMs&#xff0c;你可能已经看到了这些控制选项&#xff0c;用来调整LLM的行为。每个模型都暴…