gpt4 book ai didi

Javascript Canvas 动画

转载 作者:行者123 更新时间:2023-11-29 22:07:09 25 4
gpt4 key购买 nike

我正在使用 javascript 和 Canvas 创建动画。我如何允许用户指定显示帧的顺序并更改它们的显示速度。这是我目前所拥有的

(function() {

var lastTime = 0;
var vendors = ['ms', 'moz', 'webkit', 'o'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
|| window[vendors[x]+'CancelRequestAnimationFrame'];
}

if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
};

if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}());

(function () {

var coin,
coinImage,
canvas;

function gameLoop () {

window.requestAnimationFrame(gameLoop);

coin.update();
coin.render();
}

function sprite (options) {

var that = {},
frameIndex = 0,
tickCount = 0,
ticksPerFrame = options.ticksPerFrame || 0,
numberOfFrames = options.numberOfFrames || 1;

that.context = options.context;
that.width = options.width;
that.height = options.height;
that.image = options.image;

that.update = function () {

tickCount += 1;

if (tickCount > ticksPerFrame) {

tickCount = 0;

// If the current frame index is in range
if (frameIndex < numberOfFrames - 1) {
// Go to the next frame
frameIndex += 1;
} else {
frameIndex = 0;
}
}
};

that.render = function () {

// Clear the canvas
that.context.clearRect(0, 0, that.width, that.height);

// Draw the animation
that.context.drawImage(
that.image,
frameIndex * that.width / numberOfFrames,
0,
that.width / numberOfFrames,
that.height,
0,
0,
that.width / numberOfFrames,
that.height);
};

return that;
}

// Get canvas
canvas = document.getElementById("coinAnimation");
canvas.width = 500;
canvas.height = 500;


// Create sprite sheet
coinImage = new Image();

// Create sprite
coin = sprite({
context: canvas.getContext("2d"),
width: 500,
height:72,
image: coinImage,
numberOfFrames: 10,
ticksPerFrame: 4
});

// Load sprite sheet
coinImage.addEventListener("load", gameLoop);
coinImage.src = "sprite.png";

} ());

最佳答案

Rq:您可以为不支持它的浏览器删除定义 requestAnimationFrame 的代码,因为 1) setTimeout 太不准确,以及 2) 支持 Canvas 的浏览器很可能会实现它,所以 polyfill 就足够了。

要更改您的硬币动画,您需要有一个带有时间参数(dt,自上一帧以来耗时)的 Sprite 更新。所以计算更新循环中的时间:让它计算游戏时间和当前帧的 dt(你为 rAF 所做的可以在这里重用)。

然后你需要一些方法来在你的 Sprite 中存储帧/帧持续时间数据。

您可以使用 { duration : , frame : } 对象的数组。
我个人喜欢这样的数组:[ duration1, frameIndex1, duration2, frameIndex2, ...] (更快,如果用 slice(0) 复制它就没有引用问题。)。

然后在硬币更新期间,您将必须处理当前时间位置而不是滴答计数,并使用您手头的 dt 尽可能多地“吃掉”持续时间以找到下一个框架。

现在回答您的问题,要编辑动画,我会在显示 Canvas 下方使用一个单独的 Canvas ,并使用一堆按钮来更改内容。我做了一个非常简单的 jsbin,它看起来像这样:

enter image description here

jsbin 在这里:http://jsbin.com/IjAtOxe/1/edit?js,output

关于Javascript Canvas 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com