原生JS超级马里奥(第三天)
上一章主要是绘制马里奥和绘制图像代码的部分重构
本章主要是用于时间控制,实现马里奥每次弹跳的定点和弹跳起点一致,对源代码拆分比较多,各位可以跟着原作者视频一起敲
本章的提交ID:90dc4d0a02cc67339b120e55f29e46751e76e0c6、6773e3baedba43f22978e2d0a2a61f514fa524d1
github地址:ainuo5213的超级马里奥
本节目录
本章效果
目录说明:
mario.js:马里奥实体工厂类文件,用于创建马里奥,封装马里奥的绘制过程
Entity.js:马里奥实体类,用于记录实体的位置和速度等信息
Velocity.js:用来记录马里奥横向和纵向速度的实体
Timer.js:绘制玛丽奥,更新马里奥位置的方法(原入口文件main方法中的update)封装
入口文件改动
入口文件改动:
1. 将原本加载马里奥的方法移动到了mario.js
2. 将马里奥位置改变的方法也内聚到了mario.js,并新增了横向和纵向速度变量对象,实现对横向速度和纵向速度的控制
Entity实体:
Entity实体主要用于对速度和位置的记录对象,其实现交给马里奥工厂函数
import { Velocity } from "./Velocity.js";export class Entity {constructor() {this.pos = new Velocity(0, 0);this.vel = new Velocity(0, 0);}
}
创建马里奥工厂函数
创建马里奥的工厂函数将原本loadMarioSprite方法内聚返回了马里奥对象,并在马里奥对象上面增加了两个方法分别是drawMario(绘制马里奥)和updateMario(更新马里奥位置)的方法,其中updateMario方法将速度和时间进行累加操作,使马里奥不再做匀速运动
import { Entity } from "./Entity.js"
import { loadMarioSprite } from "./sprites.js";export function createMario() {return loadMarioSprite().then(marioSprite => {const mario = new Entity();mario.draw = function drawMario(context) {marioSprite.draw('mario', context, this.pos.x, this.pos.y);}mario.update = function updateMario(deltaTime) {this.pos.x += this.vel.x * deltaTime;this.pos.y += this.vel.y * deltaTime;}return mario;})
}
马里奥运动的时间控制
为实现马里奥的每次跳跃的定点都保持在y轴方向一致,原作者这里使用累加法,当误差大于阈值时,就减去阈值,相当于归0
马里奥入口中增加了update方法,用于updateProxy调用,来更新马里奥位置。
export default class Timer {constructor(deltaTime = 1 / 60) {let accumulatedTime = 0;let lastTime = 0;this.updateProxy = time => {// 因为deltaTime是以秒为单位,所以这里运动的累加误差时间需要除以1000accumulatedTime += (time - lastTime) / 1000;while (accumulatedTime > deltaTime) {this.update(deltaTime);accumulatedTime -= deltaTime}lastTime = time;this.enqueue();}}enqueue = () => {requestAnimationFrame(this.updateProxy);}start = () => {this.enqueue();}
}
原生JS超级马里奥(第三天)相关推荐
- 原生JS超级马里奥(第九天)
上一章讲述马里奥跳跃动作和刹车的动作,本章对Json文件改动较多,我会一一讲解,还涉及到了部分代码重构 本章的提交ID:7419c4a70c772a45795d20ceb6559c1e1e8d8e3a ...
- 原生JS超级马里奥(第五天)
上一章讲的是键盘事件监听,实现马里奥的跳跃功能,本章讲述马里奥和大地(砖块)的碰撞检测,代码有点多,原视频长度差不多1个小时20分钟,大家可以看原视频进行理解,边看边敲,我在这里写的代码和注释仅我自己 ...
- 原生JS超级马里奥(第一天)
这段时间心血来潮,在网上找了一大堆前端关于游戏制作的博客,诸如飞机大战.魂斗罗等,但是个人思维限制,可能想的不是很多.很全面,最终放弃了个人独立开发的打算.皇天不负有心人,最终在youtube上找到了 ...
- 原生JS超级马里奥(第四天)
上一章讲的是马里奥速度改变的事件控制,本章改动较多,例如将马里奥位置改变拆分为一个一个的特征类,还有键盘事件监听,实现马里奥的跳跃功能,各位可以跟着原作者视频一起敲 本章的提交ID:e5caf33c8 ...
- 原生JS超级马里奥(第八天)
上一章讲述马里奥前进和后退动画以及其他一些动画,本章讲述马里奥跳跃动作和刹车的动作 本章的提交ID:493f38d8628e5beaa23c72ff6c38f76e46fa5b3a github地址: ...
- Blender图解教程:高仿版超级马里奥(三)身体建模(5月7日更新 附模型下载)
书接上文<Blender图解教程:高仿版超级马里奥(二)头部建模> 效果图 细节 文章目录 效果图 思路 步骤 躯干 腿部 胳膊 平滑 背带裤 肩带 扣子 上色预览 思路 马里奥的身体部分 ...
- 原生JS事件绑定的三种方式
JavaScript绑定事件的方法 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定"事件处理函数".所谓事件处理函数,就是处理用户操作的函数,不同的 ...
- 原生js绑定事件的三种方法
// 绑定事件// 行内绑定// 选择元素绑定事件// 事件监听 有三个参数('什么事件','函数','true或false')true(事件捕获) false(事件冒泡)document.query ...
- 【JavaScript】原生js阻止事件的三种方式
三种阻止事件执行的方式 event.preventDefault() event.stopPropagation() return false 1.event.preventDefault() 阻止特 ...
最新文章
- java selenium_java+selenium,40行代码完成支付宝账单爬取
- python中意外缩进是什么意思_与python中的“意外缩进”怎么办?
- F5 network
- SOCKET/串口通信粘包问题处理,附带详细代码
- 常用的绘图约定——提高绘图和读图的效率
- 微积分19--定积分的几何应用
- UIAlertView的使用方法
- 介绍Linux中cp直接覆盖不提示的方法
- Java Servlet技术
- vi 不保存退出_vi / vim编辑器介绍
- Golang: How to sort struct with multiple sort parameters?
- 桌面计算机未响应怎么办,资源管理器未响应怎么办
- 大气压力换算公式_大气压怎么算
- mysql +cobar_转:阿里开源Mysql分布式中间件:Cobar
- kappa一致性检验
- 一篇文章了解爬虫技术现状
- EventBus粘性事件
- linux怎么切换键盘布局,Ubuntu 切换键盘布局(colemak - workman - norman)
- Python聪明的尼姆游戏(人机对战)
- CAD中如何删除顽固图层?
热门文章
- 什么是线下门店陈列洞察?百度AI人工智能
- 基于STM32的单片2KW+全数控移相全桥开关电源研发记录
- mes系统如何帮助工厂提高生产效率的?
- 深度解析论文CEPR: A Collaborative Exploration and Periodically Returning Model for Location Prediction
- git 丢弃修改 回退版本
- Android-UI 慕淘旅游
- 2013_Signal-Processing-Image-Communication泛读
- 人工智能专业基础课程
- 迪士尼业务部门大变革,即将强推流媒体
- 赛事推荐 | 建筑物细粒度实例分割——2023 IEEE GRSS 数据融合赛道1