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

目录

前言

一、思路

 二、调整小蜜蜂的移速

 三、限制活动范围

 四、继续重构

总结 


前言

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

一、思路

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

最简单的思路就是之前我们每次都是将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()

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

总结 

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】表操作 习题总结

目录 关系建表 数据库sql的执行顺序 内外连接的写法 1.设计一张商品表 2.设计一张老师表 3.设计一张图书表 4.查询练习 5.查询练习 6.设计一个考勤系统 7.设计一个学校宿舍管理系统 8.设计一个车辆违章系统 9.设计一个学校食堂管理系统 10.有一张员工表emp&#xf…

OpenCV笔记之solvePnP函数和calibrateCamera函数对比

OpenCV笔记之solvePnP函数和calibrateCamera函数对比 文章目录 OpenCV笔记之solvePnP函数和calibrateCamera函数对比1.cv::solvePnP2.cv::solvePnP函数的用途和工作原理3.cv::solvePnP背后的数学方程式4.cv::SOLVEPNP_ITERATIVE、cv::SOLVEPNP_EPNP、cv::SOLVEPNP_P3P5.一个固定…

RNN模型简单理解和CNN区别

目录 神经网络&#xff1a;水平方向延伸&#xff0c;数据不具有关联性 ​ RNN&#xff1a;在神经网络的基础上加上了时间顺序&#xff0c;语义理解 ​RNN: 训练中采用梯度下降&#xff0c;反向传播 ​ 长短期记忆模型 ​输出关系&#xff1a;1 toN&#xff0c;N to N 单入…

python 各种疑难杂包安装方法与踩坑记录

常用招数&#xff1a; 网络问题&#xff1a;切换网络线路/开关科学、启用/不用国内镜像 包找不到&#xff1a;启用/不用国内镜像、尝试conda、pip、source等多种安装方式 gdal、rasterio 参考链接&#xff1a; python rasterio库安装具体流程 - 知乎 Python安装gdal,raster…

MySQL——基础——外连接

一、外连接查询语法&#xff1a;(实际开发中,左外连接的使用频率要高于右外连接) 左外连接 SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件...; 相当于查询表1(左表)的所有数据 包含 表1和表2交集部分的数据 右外连接 SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN …

前端处理图片文件的方法

在项目开发过程中&#xff0c;有一个需求&#xff0c;需要前端对上传的图片进行处理&#xff0c;以字符串的形式传给后端&#xff0c;实现效果如下&#xff1a; 1.上传图片的组件 在该项目中&#xff0c;使用了element plus组件库 <el-uploadv-model:file-list"fileL…

函数式编程

函数式编程&#xff08;lambda&#xff09; 哈喽&#xff0c;大家好&#xff0c;又到了技术成长的一天。今天向大家分享一个编程利器-函数式编程之lambda。Lambda函数式编程在前端后端编程中使用非常广泛&#xff0c;我们现在就一起去深入了解一下它是什么&#xff0c;怎么用。…

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

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

C语言学习系列-->【关于qsort函数的详解以及它的模拟实现】

文章目录 一、概述二、qsort函数参数介绍三、qsort实现排序3.1 qsort实现整型数组排序3.2 qsort实现结构体数组排序 四、模拟实现qsort函数 一、概述 对数组的元素进行排序 对数组中由 指向的元素进行排序&#xff0c;每个元素字节长&#xff0c;使用该函数确定顺序。 此函数使…

使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。

目录 一.拉取镜像 二.运行镜像生成容器实例 三.登录 环境&#xff1a;centos7 一.拉取镜像 使用docker pull命令来拉取MySQL和own cloud的镜像 [rootlocalhost ~]# docker pull mysql:5.6 [rootlocalhost ~]# docker images [rootlocalhost ~]# docker images REPOSITORY…

Vue Element upload组件和Iview upload 组件上传文件

今天要分享的是使用这俩个UI组件库的upload组件分别实现调用组件本身的上传方法实现和后台交互。接下来就是开车的时间&#xff0c;请坐稳扶好~ 一、element upload组件传送门 1、html文件 <el-upload ref"uploadRef" :action"uploadUrl" :data"…

【校招VIP】前端校招考点之行内/块级元素

考点介绍&#xff1a; 行内元素会在一条直线上排列&#xff08;默认宽度只与内容有关&#xff09;&#xff0c;都是同一行的&#xff0c;水平方向排列。块级元素各占据一行&#xff08;默认宽度是它本身父容器的100%&#xff08;和父元素的宽度一致&#xff09;&#xff0c;与内…

02.案列项目Demo

1.创建项目 1. 创建项目 用pycharm 选择对应的编译器&#xff0c;输入对应的文件名&#xff0c;点击创建项目。删除默认外层生成的template和DIRS 配置项&#xff1a; 2. 创建App 创建appo1的命令&#xff1a; python manage.py startapp app01 如果使用pycharm>tool>…

Hi-TRS:骨架点视频序列的层级式建模及层级式自监督学习

论文题目&#xff1a;Hierarchically Self-Supervised Transformer for Human Skeleton Representation Learning 论文下载地址&#xff1a;https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136860181.pdf 代码地址&#xff1a;https://github.com/yuxiaochen1103…

私有化部署即时通讯平台,30分钟替换钉钉和企业微信

随着企业对即时通讯和协作工具的需求不断增长&#xff0c;私有化部署的即时通讯平台成为企业的首选。WorkPlus作为有10余年行业深耕经验与技术沉淀品牌&#xff0c;以其安全高效的私有化部署即时通讯解决方案&#xff0c;帮助企业在30分钟内替换钉钉和企业微信。本文将深入探讨…

iOS17 widget Content margin

iOS17小组件有4个新的地方可以放置分别是&#xff1a;Mac桌面、iPad锁屏界面、 iPhone Standby模式、watch的smart stack Transition to content margins iOS17中苹果为widget新增了Content margin, 使widget的内容能够距离边缘有一定的间隙&#xff0c;确保内容显示完整。这…

HTTPS证书如何申请?只需这五个步骤

在如今的互联网时代&#xff0c;网络安全变得愈发重要。为了保障网站内数据的安全&#xff0c;许多网站都开始使用HTTPS协议来进行数据传输。而谷歌、百度等搜索巨擘启用全站HTTPS加密服务&#xff0c;更是掀起了网站HTTPS加密的浪潮。那么申请HTTPS证书都需要什么&#xff1f;…

React(7)

1.React Hooks 使用hooks理由 1. 高阶组件为了复用&#xff0c;导致代码层级复杂 2. 生命周期的复杂 3. 写成functional组件,无状态组件 &#xff0c;因为需要状态&#xff0c;又改成了class,成本高 1.1 useState useState();括号里面处的是初始值&#xff1b;返回的是一个…

接口自动化框架(Pytest+request+Allure)

前言&#xff1a; 接口自动化是指模拟程序接口层面的自动化&#xff0c;由于接口不易变更&#xff0c;维护成本更小&#xff0c;所以深受各大公司的喜爱。 接口自动化包含2个部分&#xff0c;功能性的接口自动化测试和并发接口自动化测试。 本次文章着重介绍第一种&#xff0c…

Python Opencv实践 - 直方图显示

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像直方图计算 #cv.calcHist(images, channels, mask, histSize, ranges, hist, accumulate) #images&…