gpt4 book ai didi

javascript - 使用 deltatime 将矩形移动到位置

转载 作者:行者123 更新时间:2023-11-28 16:48:18 25 4
gpt4 key购买 nike

我试图将一个简单的矩形从当前位置移动到 Canvas 上单击的位置。当我提供恒定速度时,矩形就会出现并且移动得很好。但是当我将其乘以增量时间时,矩形不再出现。我使用 requestAnimationFrame 作为绘制循环。

canvas.js

window.addEventListener('DOMContentLoaded', (event) => {
let canvas = document.getElementById("gamecanvas");
let ctx = canvas.getContext('2d');
var oldframetime = 0;
var x = 0;
var y = 0;
var dstx = 0;
var dsty = 0;
var deltatime = 0;
var speed = 5;
function getmousepos(evt){
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
canvas.addEventListener("mousedown",e=>{
let coord = getmousepos(e);
dstx = coord.x;
dsty = coord.y;
});
function movetowards(current,target,maxdistancedelta){
if(Math.abs(target - current)<=maxdistancedelta){
return target;
}
return current+Math.sign(target - current) * maxdistancedelta;
}
function tick(timestamp){
deltatime = (timestamp - oldframetime)/1000;

var step = deltatime*speed;
var newlocx = movetowards(x,dstx-50,5);
var newlocy = movetowards(y,dsty-50,5);

ctx.clearRect(0,0,canvas.clientWidth,canvas.clientHeight);
ctx.fillStyle = 'green';
ctx.fillRect(newlocx,newlocy,100,100);

x = newlocx;
y = newlocy;
console.log(newlocx+":"+newlocy);
oldframetime = timestamp;
requestAnimationFrame(tick);
}
requestAnimationFrame(function(){
tick();
});
});

在该示例中,newlocx 和 newlocy 都打印 NaN:NaN但如果我选择不使用步进并给它一个像 5 这样的恒定速度,那么它就可以正常工作。

    function tick(timestamp){
deltatime = (timestamp - oldframetime)/1000;

var step = deltatime*speed;
var newlocx = movetowards(x,dstx-50,5);
var newlocy = movetowards(y,dsty-50,5);

ctx.clearRect(0,0,canvas.clientWidth,canvas.clientHeight);
ctx.fillStyle = 'green';
ctx.fillRect(newlocx,newlocy,100,100);

x = newlocx;
y = newlocy;
console.log(newlocx+":"+newlocy);
oldframetime = timestamp;
requestAnimationFrame(tick);
}

现在打印也准确了。为什么将步长乘以增量时间会阻止矩形移动?或者甚至出现?

如果有人感兴趣的话,这是 HTML。

index.html

<html>
<head>
<script src="canvas.js"></script>
</head>
<body>
<canvas id="gamecanvas" width="2000" height="1000"></canvas>
</body>
</html>

最佳答案

我检查了一下,发现问题出在tick函数的第一条语句中。当程序启动时,参数的值是未定义的。这就是为什么 tick 函数的第一个语句结果为 NaN。

只需为参数“timestamp”使用一些默认值。它现在可以工作,但速度很慢,我希望您意识到这一点。

要检查的行:函数刻度(时间戳=10)

function tick(timestamp=10) {
deltatime = (timestamp - oldframetime) / 1000;

var step = deltatime * speed;
var newlocx = movetowards(x, dstx - 50, 5);
var newlocy = movetowards(y, dsty - 50, 5);

ctx.clearRect(0, 0, canvas.clientWidth, canvas.clientHeight);
ctx.fillStyle = 'green';
ctx.fillRect(newlocx, newlocy, 100, 100);

x = newlocx;
y = newlocy;
console.log(newlocx + ":" + newlocy);
oldframetime = timestamp;
requestAnimationFrame(tick);
}

关于javascript - 使用 deltatime 将矩形移动到位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60267707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com