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

news2024/11/19 3:29:21

目录

前言

一、思路

 二、调整小蜜蜂的移速

 三、限制活动范围

 四、继续重构

总结 


前言

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

一、思路

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

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

import pygame

class Ship():
    def __init__(self,screen):
        self.screen = screen
        self.image = pygame.image.load('cat.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom=self.screen_rect.bottom

        self.moving_right = False
        self.moving_left = False


    def update(self):
        if self.moving_right:
            self.rect.centerx += 0.5
           
        if 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 = 800
        self.screen_height = 600
        self.bg_color = (220,220,220)
        self.ship_speed_factor = 0.5

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

 

import pygame

class Ship():
    def __init__(self,screen,new_settings):
        self.screen = screen
        self.image = pygame.image.load('cat.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom=self.screen_rect.bottom
        self.new_settings = new_settings

        self.moving_right = False
        self.moving_left = False
        self.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_factor
            
        self.rect.centerx = self.center

    def 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 gf

def 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 pygame

class Ship():
    def __init__(self,screen,new_settings):
        self.screen = screen
        self.image = pygame.image.load('cat.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom=self.screen_rect.bottom
        self.new_settings = new_settings

        self.moving_right = False
        self.moving_left = False
        self.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_factor

        if self.moving_left and self.rect.left > 0:
            self.center -= self.new_settings.ship_speed_factor

        self.rect.centerx = self.center

    def blitme(self):
        self.screen.blit(self.image,self.rect)

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

 四、继续重构

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

import sys
import pygame

def check_keydown_events(event,ship):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = True

    elif event.key == pygame.K_LEFT:
        ship.moving_left = True


def check_keyup_events(event,ship):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = False

    if event.key == pygame.K_LEFT:
        ship.moving_left = False


def 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.coloradmin.cn/o/919801.html

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

相关文章

Diffusion Models for Time Series Applications: A Survey

Diffusion Models for Time Series Applications: A Survey (Paper reading) Lequan Lin, The University of Sydney Business School, arXiv2023,Cited:5, Code, Paper 1. 引言 扩散模型是一类基于深度学习的生成模型&#xff0c;在前沿的机器学习研究中变得越来越突出。在…

Linux线程 --- 生产者消费者模型(C语言)

在学习完线程相关的概念之后&#xff0c;本节来认识一下Linux多线程相关的一个重要模型----“ 生产者消费者模型” 本文参考&#xff1a; Linux多线程生产者与消费者_红娃子的博客-CSDN博客 Linux多线程——生产者消费者模型_linux多线程生产者与消费者_两片空白的博客-CSDN博客…

测试平台metersphere

metersphere可以做接口测试、UI测试、性能测试。 metersphere接口测试底层是jmeter&#xff0c;可以做API管理&#xff0c;快捷调试&#xff0c;接口用例管理&#xff0c;接口自动化场景执行一键选取用例范围&#xff0c;生成测试报告。 会用jmeter&#xff0c;metersphere会…

软年架构复用-架构师之路(十一)

软件架构复用 软件产品线是 一组产业密集型系统&#xff0c;规定用公用的 核心资产集成 开发而来。 机会复用 和 系统复用。 机会复用&#xff1a;临时发现有可服用资产立马复用。 系统复用&#xff1a;开发之前进行规划好哪些需要复用。 复用的三个阶段&#xff1a; 获取到…

高阶数据结构并查集

目录&#xff1a; 并查集的概念代码实现 并查集的概念 将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中反复遇到查询某一个元素属于那个集合的运算&#xff0c;这…

储能运行约束的Matlab建模方法

最近一段时间有很多人问我最优潮流计算中储能系统的建模方法。部分朋友的问题我回复了&#xff0c;有些没有回消息的&#xff0c;我就不再一一回复了&#xff0c;在这里我写一篇博客统一介绍一下。 1.储能系统介绍 首先&#xff0c;让【GPT】简单介绍一下储能系统&#xff1a;…

【多天线传输技术】BPSK调制信号在AWGN信道下的理论误码率与仿真误码率

%% [0、预处理] clc; clear; close all&#xff1b;%% [1、配置参数] N1000000; %数据点数&#xff08;个&#xff09; SNR_dB0:10; %信噪比&#xff08;dB形式&#xff09; SNR10.^(SNR_dB/10); %信噪比&#xff08;一般形式&#xff0c;Eb/N0&#xff09;…

【业务功能篇78】微服务-前端后端校验- 统一异常处理-JSR-303-validation注解

5. 前端校验 我们在前端提交的表单数据&#xff0c;我们也是需要对提交的数据做相关的校验的 Form 组件提供了表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;并将 Form-Item 的 prop 属性设置为需校验的字段名即可 校验的页面效果 前端数据…

Android相机-HAL子系统

引言 应用框架要通过拍照预览摄像获得照片或者视频,就需要向相机子系统发出请求, 一个请求对应一组结果 一次可发起多个请求&#xff0c;并且提交请求是非阻塞的&#xff0c;始终按照接收的顺序以队列的形式先进先出地进行顺序处理 一个请求包含了拍摄和拍照配置的所有信息&…

企业数字化转型中,VR数字展厅能有哪些体验?

在数字化转型的浪潮下&#xff0c;企业纷纷开始注重数字展厅的开展&#xff0c;VR虚拟展厅结合VR全景技术&#xff0c;可以创造出许多有趣的玩法和体验&#xff0c;无论是虚拟参观、互动体验还是VR云会议对接&#xff0c;都为企业客户带来了全新的感知方式。 同传统展厅相比&am…

【LeetCode-中等题】560. 和为 K 的子数组

题目 题解一&#xff1a;逆序枚举数组 //方法一:枚举数组&#xff08;顺序&#xff09;int count 0;// 记录最终符合条件的数组个数int n nums.length;for(int end 0; end<n ; end){int sum 0;//记录每一次经过的元素总和for(int start end; start>0;start--){sum n…

漏洞挖掘和漏洞利用技术:讨论漏洞发现、利用和修复,深入研究不同类型漏洞的技术细节

章节一&#xff1a;引言 在当今数字化时代&#xff0c;计算机技术的迅猛发展为我们的生活带来了无数便利&#xff0c;然而也伴随着各种安全威胁。恶意黑客利用漏洞进行攻击已成为一种常见现象。本文将深入探讨漏洞挖掘和漏洞利用技术&#xff0c;以及如何修复这些漏洞&#xf…

微信小程序路由以及跳转页面传递参数

路由 在app.json的pages里面写 "pages/页面/页面" 直接保存pages直接生成非常方便 跳转页面 wx.navigateTo() 保留当前页面&#xff0c;跳转到应用内的某个非tabBar页面。 <text bindtap"daka">点击</text> daka:function () {wx.navigateTo…

第3篇:vscode搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 1.下载vscode并安装 https://code.visualstudio.com/ 运行VSCodeUserSetup-x64-1.80.1.exe 2.点击扩展&#xff0c;搜索arduino,并点击安装 3.点击扩展设置&#xff0c;配置arduino…

java+springboot+mysql村务档案管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的村务档案管理系统&#xff0c;系统包含超级管理员、工作人员角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;系统用户管理&#xff08;工作人员管理&#xff09;&#xff1b;公开资料&#xff1b;会议记录&…

PDF校对:追求文档的精准与完美

随着数字化时代的到来&#xff0c;PDF已经成为了多数机构和个人首选的文件格式&#xff0c;原因在于它的稳定性、跨平台特性以及统一的显示效果。但是&#xff0c;对于任何需要公开或正式发布的文档&#xff0c;确保其内容的准确性是至关重要的&#xff0c;这就是PDF校对显得尤…

IDEA创建Spring,Maven项目没有resources文件夹

有时新建Spring或Maven项目时&#xff0c;会出现目录中main下无resources文件夹的情况&#xff0c;来一起解决一下&#xff1a; FIles|Project Structure 在Modules模块找到对应路径&#xff0c;在main下创建resources&#xff0c;右键main&#xff0c;选择新文件夹 输入文件…

瞎扯之synchronized

我是胡说八道君&#xff0c;鉴别一个人基础打得牢不牢&#xff0c;有没有这个举一反三、将学过的知识串联起来的能力&#xff0c;教你一个简单的方法&#xff1a;关键词联想法 有兴趣的童鞋也可以跟着我的思路去画一张思维导图哦!加入你自己联想道德的部分更重要 eg: 给你一个…

金桥跨越相伴岁月 桂冠加冕爱意时光 GP芝柏表演绎浪漫七夕

两个多世纪以前&#xff0c;康士坦特芝勒德 (Constant Girard) 与玛莉亚柏雷戈 (Marie Perregaux) 喜结连理&#xff0c;两颗心灵在爱意中交织&#xff0c;二人将姓氏结合&#xff0c;创立“Girard-Perregaux”芝柏表&#xff0c;成为数百年来瑞士高级制表中仅有的以夫妻双人姓…

VoxWeekly|The Sandbox 生态周报|20230821

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布&#xff0c;对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容&#xff0c;欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter&#xff0c;并加入 Discord 社区&#xf…