我在画布上的屏幕上渲染了一张瓷砖地图和一个坦克:
http://www.exeneva.com/html5/movingTankExample/
但是,您会注意到坦克的动画运动(移动轨迹)经常发生。你会如何改变它,以便只有在坦克移动时才会发生坦克履带的移动?请注意,目前没有物理学。
答案 0 :(得分:1)
你必须实施一个基本state machine
来控制坦克的心脏状态。
例如
看看这个链接(主要是实际行动的第二部分,第一部分更理论化):http://active.tutsplus.com/tutorials/actionscript/the-power-of-finite-state-machines-concept-and-creation/
这是关于Flash的,但这个概念是普遍的。
答案 1 :(得分:1)
你的startUp
函数每100毫秒调用一次drawScreen
坦克运动动画。您需要将动画逻辑从drawScreen
提取到其自己的函数中,例如animateMovement
并从您的onkeydown
处理程序中调用它。
类似的东西:
function animateMovement(){
var int = setInterval(function(){
// Tank tiles
var tankSourceX = Math.floor(animationFrames[frameIndex] % tilesPerRow) * tileWidth;
var tankSourceY = Math.floor(animationFrames[frameIndex] / tilesPerRow) * tileHeight;
// Draw the tank
context.drawImage(tileSheet, tankSourceX, tankSourceY, tileWidth, tileHeight, tankX, tankY, tileWidth, tileHeight);
// Animation frames
frameIndex += 1;
if (frameIndex == animationFrames.length) {
frameIndex = 0;
}
},100);
setTimeout(function(){clearInterval(int);}, 1000);
}
将它放在drawScreen
功能之前,并在致电document.onkeydown
后立即从drawScreen
处理程序中调用它。显然,您还需要从drawScreen
函数中删除动画代码:
function drawScreen() {
// Tile map
for (var rowCtr = 0; rowCtr < mapRows; rowCtr += 1) {
for (var colCtr = 0; colCtr < mapCols; colCtr += 1) {
var tileId = tileMap[rowCtr][colCtr] + mapIndexOffset;
var sourceX = Math.floor(tileId % tilesPerRow) * tileWidth;
var sourceY = Math.floor(tileId / tilesPerRow) * tileHeight;
context.drawImage(tileSheet, sourceX, sourceY, tileWidth,
tileHeight, colCtr * tileWidth, rowCtr * tileHeight, tileWidth, tileHeight);
}
}
/*tank animation was here*/
}