做了很多小游戏,都会遇到碰撞和反弹的情况,CC哥大多时候也都是简单处理一下,包括之前的讲座也有提过,但是没有认真的讲解过。今天就专门为这个主题做一讲,把这部分内容彻底讲透,大家可以一起探讨一下。

是不是觉得很简单,就是一个小球落到地上再弹起来,但是让我们一起来过过这个下落反弹里面有多少坑。

1:匀速下坠

先来看下落,一个最简单的下落程序是这样的:

小球匀速下落,碰到黑线停下来。这肯定不完美,因为下坠应该是加速度的,而不是匀速的。v=at,这是加速度公式。所以下坠的每一步都随着时间的增加,下坠的距离在增大。

2:下坠配上加速度。

这个也不复杂,让每一次循环的时候都将下落速度增加一点,这样就有加速度的效果了。

加速度的效果有了,但是大家发现问题没?小球碰到黑线并没有停下来,而是会一部分穿过黑线才能停下来。也就是说小球碰到黑线时并没有完全停下来。这是怎么发生的呢?

因为小球下降的每一步走的距离就会变大,我们仔细读程序,也就是小球碰到黑线的前一步和碰到黑线的后一步之间,行进的步数已经比较大了,已经超过了小球最后和黑线的距离。所以在碰到黑线时,实际上已经一部分越过了黑线。那如何解决这个问题呢?

3:碰到黑线刚好停住。

如果解决这个问题,解决的方法就是让小球再退回到黑线的上方。我们这时候并不知道小球应该退后多少步,所以只能一步步试,直到小球和黑线分离。

我们加了一段程序,如果小球碰到了黑色那么就执行一个循环,让小球回到黑线上方。

奇怪不?小球在向上后退离开黑线后为什么又掉了下来,然后在黑线上反复震动?其实在做碰撞处理的时候这是经常会出的一个bug。

我们仔细读程序,就会发现,在这个循环里的判断逻辑是这样,如果没有碰到黑线,就往下落。每一步下落的距离就是“下落速度”这个变量的值。如果碰到黑线,就往上后退,直到离开黑线。那大家有没有发现,这个逻辑其实就是个死循环。小球永远不可能停下来。

我们修改一下程序,重新把逻辑判断的位置调整一下,同时再加上一条关键语句。

逻辑判断调整成,在每一步下落时都判断是否碰到黑线,如果碰到黑线后就后退,后退完毕后又增加了一条语句,让小球再下降一步,保证小球和黑线接触上。小球再下降一步就是一个关键语句。然后大循环就终止了。大家再好好理解一下。

但是大家发现没有,这样效果还是不好,小球在返回黑线上方有个过程,我们已经没有加等待命令了,这已经是最快的方式了。但是这个过程还是让人不舒服。(有人在返回黑线上方的操作做的更复杂些,比如一次退回更多步数,比如一次退10步,如果退过了,再返回5步,这种反复趋近的操作也是一种办法。但是程序复杂不说,效果也不好)那如何解决这个问题呢?

这里教大家一种方法,用自定义命令的方式。把后退的操作用一个单独的自定义命令来做。

猛一看,这段程序跟刚才没什么区别呀?其实区别是有的,之所以大家看到小球向上回退的过程,是因为程序有刷新的过程,每一步都需要刷新屏幕。而把这段程序放到自定义的语句,就可以解决这个问题。因为新的积木属性里面有一个 选项:运行时不刷新屏幕。只要勾选了这个选项,那么这段程序每一步执行的时候就不会刷新屏幕。大家看看效果。

看,通过这种方法就完美解决了吧。

4:下坠加反弹

这段代码不复杂,反弹操作发生在当球碰到了黑线停止不动后,然后以之前的速度进行向上走的过程,走的过程,速度不断减小到零。为了让代码看着简单清晰,我们又用了自定义语句的做法。单独做了个反弹的语句命令。

5:下坠反弹,反弹幅度不断减小直到静止在黑线上。

这个效果不复杂,只需要每次反弹的时候减少反弹的初始速度就行。让我们把这条语句加上。

奇怪了,球最后静止之后,竟然没有停下来,反而飞到天上去了。这是什么bug呢?这是因为在最后当反弹速度为零的时候,已经应该静止下来的时候,由于没有做判断控制,反弹速度的数值继续增加已经由负值转为正值,不再是向下降落,而是向上飞了。所以球就直接向上加速飞去了。所以我们要加个判断,当反弹的初始速度为零时,反弹要停止下来。

这个下落和反弹目前看起来挺完美了。

6:用空格键做个起跳的过程。

最后一步就是把这个程序做成刚开始视频的样子,需要增加一个用空格键来控制小球起跳的过程。

看起来很简单,通常我们也会这么做,但是实际执行效果呢?我们看一下:

关于按空格键,我们之前就有过一讲,主要是按键这个过程这么简单处理有两个问题:

1:按键的过程有时延,有的人按的快,有的人按的慢,所以可能你按了一下,由于按的慢,程序当成你按了几下。

2:球在跳跃的过程中,你按了空格键,球就在半空中进入了起跳的过程。

要解决这个问题就要加状态变量了,只有在球已经静止在黑线上时,才准许用空格键起跳。

下面我把这个程序全部贴出来。大家可以试着做一下。

我们做程序有时候就像画一幅画一样,如果有画的不好的地方,你总会时不时想起来,总想把它画好。做程序也一样,只有你对自己的程序很满意了,你才会觉得非常开心。

Scratch第四十九讲:完美的下落和反弹的更多相关文章

  1. Linux性能优化实战学习笔记:第四十九讲

    一.上节回顾 上一期,我们一起梳理了,网络时不时丢包的分析定位和优化方法.先简单回顾一下.网络丢包,通常会带来严重的性能下降,特别是对 TCP 来说,丢包通常意味着网络拥塞和重传,进而会导致网络延迟增 ...

  2. Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  3. SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)

    0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...

  4. “全栈2019”Java第四十九章:重载与重写对比详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 第四十九个知识点:描述在IPsec和TLS后的基本想法

    第四十九个知识点:描述在IPsec和TLS后的基本想法 网络安全协议(Internet Protocol Security,IPsec)和安全传输层协议(Transport Layer Securit ...

  6. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之一(四十九)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  7. Android项目实战(四十九):Andoird 7.0+相机适配

    解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...

  8. 论文阅读笔记四十九:ScratchDet: Training Single-Shot Object Detectors from Scratch(CVPR2019)

    论文原址:https://arxiv.org/abs/1810.08425 github:https://github.com/KimSoybean/ScratchDet 摘要 当前较为流行的检测算法 ...

  9. 四十九 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

    逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_t ...

随机推荐

  1. 怎么在for循环中新建出不同的list

    public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 1, 1, 1, 1, 3, ...

  2. 我的BO之导航属性

    我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 数据需要导航 数据之间普遍存在关系,做业务处理时往往也是按照关系在数据之间查询和处理.业务处理可 ...

  3. 爬虫界的福利--touchRobot,机器模拟触碰滑动库(已开源)

    此插件能干什么? 一句话概括:通过程序主动触发移动端滑动.拖拽.触碰等操作 插件有什么用呢? 可以用于爬虫,也可以用于自动化测试以及程序演示 插件演示地址 (从网上扒了一个canvas绘图的demo, ...

  4. Java 代码里乱打日志了,这才是正确的打日志姿势

    使用slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一. 实现方式统一使用: Logback框架 打日志的正确方式 什么时候应该打日志 当你遇到问题的时候,只能通过debug功能 ...

  5. EXCEL公式中如何表示回车符?

    问题: 将 id credttm cdno cdamt cashbrid cashrole note 转换为 "id  credttm  cdno   cdamt  cashbrid  ca ...

  6. 面试题集锦---BY算法导论小组

    3.7题 3.21题 1.给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数. 提示:两个random就可以有25种可能,每种可能都是等概率的 2.判断一个自然数是否是某个 ...

  7. 《Glibc内存管理》笔记DAY1

    目录 x86_64栈和mmap固定映射地址 内存的延迟分配 内核数据结构 mm_struct Heap 操作相关函数 Mmap 映射区域操作相关函数 内容来源 x86_64栈和mmap固定映射地址   ...

  8. Go 语言入门(三)并发

    写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于A tour of Go编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(三 ...

  9. el-table的type="selection"的使用

    场景:el-table,type="selection"时,重新请求后,设置列表更新前的已勾选项 踩坑:在翻页或者changPageSize之后,table的data会更新,之前勾 ...

  10. gitment初始化评论跳回博客首页

    表现 众所周知,gitment评论系统需要初始化以创建对应的issue,可是我在点击login with github的时候,总是跳向博客首页!WTF!什么鬼?这样不程序啊? 排查 1.F12查看lo ...