我猜你没有阅读我在你最后一个答案中传递给你的链接,并以似乎最简单的方式向另一个人靠近。啧啧啧……
无论如何,要解决这个问题,你必须drawScreen()
像以前一样在方法中绘制你的坦克,但你必须从关键运动事件中调用坦克的动画函数。这样,坦克将在不移动时停止绘制,并在移动时绘制动画作为您的原始问题。
编辑:
我的机器上现在已经有了你的全部代码,这里是解决你问题的步骤,因为我给了你很多提示,现在我会给你你想要的代码:
1- 负责动画初始化和选择要显示的动画帧的代码被反转。计数器frameIndex
需要在tankSourceX
and之前初始化tankSourceY
:
// Counter to keep track of the current index of animationFrames
var frameIndex = 0;
// Tank tiles
var tankSourceX = Math.floor(animationFrames[frameIndex] % tilesPerRow) * tileWidth;
var tankSourceY = Math.floor(animationFrames[frameIndex] / tilesPerRow) * tileHeight;
2- 将定义帧的这些变量放置在动画函数内,如果您更改动画帧,则frameIndex
更改tankSourceX
和tankSourceY
值:
function animateMovement() {
// Animation frames
frameIndex += 1;
if (frameIndex == animationFrames.length) {
frameIndex = 0;
}
tankSourceX = Math.floor(animationFrames[frameIndex] % tilesPerRow) * tileWidth;
tankSourceY = Math.floor(animationFrames[frameIndex] / tilesPerRow) * tileHeight;
}
3-您的绘图和动画函数可以由您的事件处理程序或开始时的间隔调用:
var animateInterval = setInterval(animateMoviment, 200);
var drawingInterval = setInterval(drawScreen, 200);
4-初始化一个变量作为坦克状态:
var tankState = "stopped";
5- 在动画功能上,检查此变量以更改帧:
function animateMovement() {
if (tankState == "moving") {
// Animation frames
frameIndex += 1;
if (frameIndex == animationFrames.length) {
frameIndex = 0;
}
tankSourceX = Math.floor(animationFrames[frameIndex] % tilesPerRow) * tileWidth;
tankSourceY = Math.floor(animationFrames[frameIndex] / tilesPerRow) * tileHeight;
}
}
6-更改您的事件处理程序以设置tankState
为moving
:
e = e?e:window.event;
tankState = "moving";
...
7- 在 keyup 事件上重置 tankState:
document.onkeyup = function(e) {
tankMoveX = 0;
tankMoveY = 0;
tankState = "stopped";
}
当然,您可以在关键事件处理程序上调用动画和绘制函数并消除间隔,但是这样您可以添加更多动画以在不等待玩家输入的同一函数上运行,例如 NPC(非普通字符)。