【问题标题】:Why is my animated character sliding left?为什么我的动画角色向左滑动?
【发布时间】: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 with issue

我已经部分解决了这个问题,但我仍然有点困惑。我从 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


【解决方案1】:

在解决此类问题时,您应该做的第一件事就是简化代码...

把它带到最基本的,然后开始使用构建每一帧的变量,是的,就像你发现每个精灵上有一个 6px 的填充,你可以在代码上补偿它,看看宽度的计算。

var character = new Image();
character.src = "https://i.stack.imgur.com/7uRCO.png";

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

var spriteWidth = 1632;
var columns = 11;

var width = (spriteWidth / columns) - 3;
var curFrame = 0;

function draw() {
  ctx.clearRect(0, 0, 900, 900);
  curFrame = ++curFrame % columns;
  ctx.drawImage(character, curFrame * width, 0, width, 200, 0, 0, width, 200);
}

setInterval(draw, 100);
&lt;canvas id="canvas" height=175&gt;&lt;/canvas&gt;

...为了记录,精灵并不是最好看的

【讨论】:

  • 谢谢。这很有帮助,因为您提供了一些上下文,并且我尝试从之前的宽度值中减去以进行补偿,但语法不太正确,我省略了括号。虽然我现在知道我对问题背后的想法是正确的。每天尽可能多地学习,我对 JavaScript 还是很陌生。我真的很感谢你的时间。这 900 个值是否代表目标 x 和 y 值?
  • @LarryYoung ctx.clearRect(0, 0, 900, 900); 中的 900 只是用来清除整个画布的东西,我可以使用 9999 比你的画布更大的东西,在解决精灵问题时很有用,而且需要担心的变量更少
  • 哦,好吧,它清除了。完美谢谢!祝您有美好的一天,再次感谢!
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多