【发布时间】:2018-08-28 21:34:43
【问题描述】:
我正在使用一个简单的 clearInterval 绘制动画来为 spritesheet 设置动画。我有两个动画,并为两者设置了相同的画布大小。我检查了精灵表的宽度以确保它是正确的。由于某种原因,动画执行了,但我的角色向左滑动,并且在重新开始动画之前,下一帧的一部分变得可见。我一遍又一遍地检查错误。希望只是错过了一些简单的事情。这是我的代码。有问题的 Spritesheet 发布在帖子底部的链接中。非常感谢。
// QUIZGAME ANIMATION
var canvasWidth = 200;
var canvasHeight = 250;
var canvas2Height = 250;
var canvas2Width = 200;
var canvas1 = document.getElementById("canvas1");
var canvas2 = document.getElementById("canvas2");
document.addEventListener("DOMContentLoaded", function(event) {
canvas1.width = canvasWidth;
canvas1.height = canvasHeight;
canvas2.height = canvas2Height;
canvas2.width = canvas2Width;
});
var spriteWidth = 605;
var spriteHeight = 200;
var sprite2Width = 1632;
var sprite2Height = 200;
var columns = 3;
var rows = 1;
var columns2 = 11;
var rows2 = 1;
var width = spriteWidth / columns;
var height = spriteHeight / rows;
var height2 = sprite2Height / rows2;
var width2 = sprite2Width / columns2;
var curFrame = 0;
var curFrame2 = 0;
var frameCount = 3;
var frameCount2 = 11;
var x = 0;
var y = 0;
var x2 = 0;
var y2 = 0;
var frameX = 0;
var frameY = 0;
var frameX2 = 0;
var frameY2 = 0;
var ctx = canvas1.getContext("2d");
var ctx2 = canvas2.getContext("2d");
var character = new Image();
var character2 = new Image();
character.src = "img/testanimation.png";
character2.src = "https://i.stack.imgur.com/7uRCO.png";
function changeFrameIndex() {
curFrame = ++curFrame % frameCount;
frameX = curFrame * width;
ctx.clearRect(x, y, width, height);
}
function changeFrame2Index() {
curFrame2 = ++curFrame2 % frameCount2;
frameX2 = curFrame2 * width2;
ctx2.clearRect(x2, y2, width2, height2);
}
function draw() {
//Updating the frame
changeFrameIndex();
//Drawing the image
ctx.drawImage(character, frameX, frameY, width, height, x, y, width, height);
}
function draw2() {
changeFrame2Index();
ctx2.drawImage(character2, frameX2, frameY2, width2, height2, x2, y2, width2, height2);
}
//setInterval(draw, 140); // disabled by editor because source is unavailable
setInterval(draw2, 100);
<canvas id="canvas1"></canvas>
<canvas id="canvas2"></canvas>
我已经部分解决了这个问题,但我仍然有点困惑。我从 spritesheet 的末尾裁剪了一些空白空间(使 sprite2Width = 1604 而不是原来的 1632),这有助于将运动减少到几乎没有,但由于某种原因,我仍然需要澄清 4-6 px 的宽度比实际的 png 短。在将 spritesheet 宽度裁剪为 1604px 并设置 sprite2Width = 1598; 后,动画现在正在工作。 (相对于 1604)。有人知道为什么这里有 6 px 的差异吗?可能与 CSS 相关?至少它正在工作。
【问题讨论】:
-
如果精灵表很小,并且您拥有它们(它们不是从游戏中提取的),请同时发布它们,以便我们重现问题。跨度>
-
它们是从 opengameart 网站上拉出来的,所以只要作者给出了信用,它们就应该开放使用。我会发布精灵表谢谢。
-
@zero298 好的,图片应该发布在原始帖子“spritesheet with issue”中的链接下,非常感谢
-
不确定您的 spriteWidth 和列编号是从哪里获得的,但如果您更改为
var width = 147;,这对您有用吗? -
@AndrewLohr simplifiedcoding.net/… 这是我试图遵循的教程。在这种情况下,我的印象 spriteWidth 将是精灵表的总宽度除以列数(或我猜的帧数)11。如果你能为我弄清楚逻辑,那将不胜感激。当我将宽度更改为 145 时,它使角色保持原位并且动画运行。上一帧的一部分显示在左侧,但它解决了主要问题。
标签: javascript canvas