原生JS超级马里奥(第三天)

19 篇文章 0 订阅
14 篇文章 1 订阅
本篇博客主要介绍了如何在超级马里奥游戏中实现时间控制,确保马里奥每次跳跃的起点和定点一致。通过重构代码,创建了马里奥实体工厂类,包括Entity、Velocity和Timer模块,实现了马里奥的位置更新和速度控制。更新后的入口文件将马里奥的加载和位置更新方法内聚,使用累加法控制马里奥的运动,减少误差。同时,提供了一个定时器类用于更新马里奥的位置。
摘要由CSDN通过智能技术生成

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

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

本章的提交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是以秒为单位,所以这里运动的累加误差时间需要除以1000
            accumulatedTime += (time - lastTime) / 1000;
            while (accumulatedTime > deltaTime) {
                this.update(deltaTime);
                accumulatedTime -= deltaTime
            }
            lastTime = time;
    
            this.enqueue();
        }
    }

    enqueue = () => {
        requestAnimationFrame(this.updateProxy);
    }

    

    start = () => {
        this.enqueue();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值