上一章主要是绘制马里奥和绘制图像代码的部分重构

本章主要是用于时间控制,实现马里奥每次弹跳的定点和弹跳起点一致,对源代码拆分比较多,各位可以跟着原作者视频一起敲

本章的提交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超级马里奥(第三天)相关推荐

  1. 原生JS超级马里奥(第九天)

    上一章讲述马里奥跳跃动作和刹车的动作,本章对Json文件改动较多,我会一一讲解,还涉及到了部分代码重构 本章的提交ID:7419c4a70c772a45795d20ceb6559c1e1e8d8e3a ...

  2. 原生JS超级马里奥(第五天)

    上一章讲的是键盘事件监听,实现马里奥的跳跃功能,本章讲述马里奥和大地(砖块)的碰撞检测,代码有点多,原视频长度差不多1个小时20分钟,大家可以看原视频进行理解,边看边敲,我在这里写的代码和注释仅我自己 ...

  3. 原生JS超级马里奥(第一天)

    这段时间心血来潮,在网上找了一大堆前端关于游戏制作的博客,诸如飞机大战.魂斗罗等,但是个人思维限制,可能想的不是很多.很全面,最终放弃了个人独立开发的打算.皇天不负有心人,最终在youtube上找到了 ...

  4. 原生JS超级马里奥(第四天)

    上一章讲的是马里奥速度改变的事件控制,本章改动较多,例如将马里奥位置改变拆分为一个一个的特征类,还有键盘事件监听,实现马里奥的跳跃功能,各位可以跟着原作者视频一起敲 本章的提交ID:e5caf33c8 ...

  5. 原生JS超级马里奥(第八天)

    上一章讲述马里奥前进和后退动画以及其他一些动画,本章讲述马里奥跳跃动作和刹车的动作 本章的提交ID:493f38d8628e5beaa23c72ff6c38f76e46fa5b3a github地址: ...

  6. Blender图解教程:高仿版超级马里奥(三)身体建模(5月7日更新 附模型下载)

    书接上文<Blender图解教程:高仿版超级马里奥(二)头部建模> 效果图 细节 文章目录 效果图 思路 步骤 躯干 腿部 胳膊 平滑 背带裤 肩带 扣子 上色预览 思路 马里奥的身体部分 ...

  7. 原生JS事件绑定的三种方式

    JavaScript绑定事件的方法 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定"事件处理函数".所谓事件处理函数,就是处理用户操作的函数,不同的 ...

  8. 原生js绑定事件的三种方法

    // 绑定事件// 行内绑定// 选择元素绑定事件// 事件监听 有三个参数('什么事件','函数','true或false')true(事件捕获) false(事件冒泡)document.query ...

  9. 【JavaScript】原生js阻止事件的三种方式

    三种阻止事件执行的方式 event.preventDefault() event.stopPropagation() return false 1.event.preventDefault() 阻止特 ...

最新文章

  1. java selenium_java+selenium,40行代码完成支付宝账单爬取
  2. python中意外缩进是什么意思_与python中的“意外缩进”怎么办?
  3. F5 network
  4. SOCKET/串口通信粘包问题处理,附带详细代码
  5. 常用的绘图约定——提高绘图和读图的效率
  6. 微积分19--定积分的几何应用
  7. UIAlertView的使用方法
  8. 介绍Linux中cp直接覆盖不提示的方法
  9. Java Servlet技术
  10. vi 不保存退出_vi / vim编辑器介绍
  11. Golang: How to sort struct with multiple sort parameters?
  12. 桌面计算机未响应怎么办,资源管理器未响应怎么办
  13. 大气压力换算公式_大气压怎么算
  14. mysql +cobar_转:阿里开源Mysql分布式中间件:Cobar
  15. kappa一致性检验
  16. 一篇文章了解爬虫技术现状
  17. EventBus粘性事件
  18. linux怎么切换键盘布局,Ubuntu 切换键盘布局(colemak - workman - norman)
  19. Python聪明的尼姆游戏(人机对战)
  20. CAD中如何删除顽固图层?

热门文章

  1. 什么是线下门店陈列洞察?百度AI人工智能
  2. 基于STM32的单片2KW+全数控移相全桥开关电源研发记录
  3. mes系统如何帮助工厂提高生产效率的?
  4. 深度解析论文CEPR: A Collaborative Exploration and Periodically Returning Model for Location Prediction
  5. git 丢弃修改 回退版本
  6. Android-UI 慕淘旅游
  7. 2013_Signal-Processing-Image-Communication泛读
  8. 人工智能专业基础课程
  9. 迪士尼业务部门大变革,即将强推流媒体
  10. 赛事推荐 | 建筑物细粒度实例分割——2023 IEEE GRSS 数据融合赛道1