首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的坦克还没出现?

为什么我的坦克还没出现?
EN

Stack Overflow用户
提问于 2012-05-20 09:43:56
回答 2查看 119关注 0票数 1

我画了一张瓦片地图:

http://www.exeneva.com/html5/movingTankExample/

下面是我的启动代码:

代码语言:javascript
复制
function startUp() {
  drawScreen();   
  // Draw the tank
  context.drawImage(tileSheet, tankSourceX, tankSourceY, tileWidth, tileHeight, tankX, tankY, tileWidth, tileHeight);
}

drawScreen()绘制平铺地图。我想在瓷砖贴图之后绘制坦克,但不想将它放在drawScreen()中,因为我想稍后为坦克设置动画并移动它(而不必再次调用drawScreen()。

为什么我的坦克没出现?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-20 10:01:57

我猜你没有读到我在你最后一次回答时传给你的链接,然后偷看了另一个看起来最简单的人。tisk,tisk...

无论如何,为了解决这个问题,你必须像以前一样在drawScreen()方法中绘制你的坦克,但是你必须从关键点运动事件中调用坦克的动画函数。这样,坦克将在不移动时停止绘制,而在移动时绘制动画作为您的原始问题。

编辑:

我已经把你的全部代码放在我的机器上了,下面是解决你的问题的步骤,因为我已经给了你很多提示,现在我会给你你想要的代码:

1-反转负责初始化动画和选择要显示的动画帧的代码。在tankSourceXtankSourceY之前,需要初始化计数器frameIndex

代码语言:javascript
复制
// 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更改tankSourceXtankSourceY值:

代码语言:javascript
复制
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-您的绘图和动画函数可以由事件处理程序调用,也可以像开始时那样按时间间隔调用:

代码语言:javascript
复制
var animateInterval = setInterval(animateMoviment, 200);
var drawingInterval = setInterval(drawScreen, 200);

4-将变量初始化为坦克状态:

代码语言:javascript
复制
var tankState = "stopped";

5-在动画函数中,选中此变量以更改帧:

代码语言:javascript
复制
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

代码语言:javascript
复制
e = e?e:window.event;
tankState = "moving";
...

7-重置keyup事件上的tankState:

代码语言:javascript
复制
document.onkeyup = function(e) {
    tankMoveX = 0;
    tankMoveY = 0;
    tankState = "stopped";
}

当然,您可以在按键事件处理程序上调用animate和draw函数并消除间隔,但通过这种方式,您可以添加更多的动画在相同的函数上运行,而不需要等待玩家输入,如NPC(非编排字符)。

票数 2
EN

Stack Overflow用户

发布于 2012-05-20 09:56:57

在调用context.drawImage(tileSheet, ...时,您应该传递坦克图像,而不是tileSheet,我猜这就是地图本身。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10670159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档