Skip to content

Instantly share code, notes, and snippets.

@darosh
Last active October 16, 2015 17:04
Show Gist options
  • Save darosh/85db8bd68d666ee2446e to your computer and use it in GitHub Desktop.
Save darosh/85db8bd68d666ee2446e to your computer and use it in GitHub Desktop.
Scrolls Unit Animation
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="script.js"></script>
</body>
console.log('begin');
var url = 'https://cdn.rawgit.com/darosh/scrolls-and-decks/master/client/';
var id = 591;
var element = document.documentElement;
var attrs = {};
var canvas = document.createElement('canvas');
var zoom = 1;
var shift = 0;
canvas.width = 530 * zoom;
canvas.height = 490 * zoom;
element.appendChild(canvas);
var ctx = canvas.getContext('2d');
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.clearRect(0, 0, canvas.width, canvas.height);
var standDeferred = $.Deferred();
var standImg = new Image();
standImg.src = url + 'images/unitstand.png';
standDeferred.img = standImg;
standImg.onload = function() {
standDeferred.resolve(standDeferred);
};
var spritesImg = new Image();
var data;
data = $.ajax({
url: url + 'data/bundles/' + id + '/data.json',
});
var deferred = $.Deferred();
spritesImg.src = url + 'data/bundles/' + id + '/sprites.png';
spritesImg.onload = function() {
deferred.img = spritesImg;
deferred.resolve(deferred);
};
$.when(data, standDeferred, deferred).then(ready);
function ready(d) {
data = d[0];
console.log('ready');
var fps = 24;
var firstFrameTime = null;
function animate() {
window.requestAnimationFrame(function() {
var time = (new Date()).getTime();
var animation = data.animations.idle;
if (!firstFrameTime) {
firstFrameTime = time;
}
var elapsed = Math.round((time - firstFrameTime) / (1000 / fps));
var animated = true;
var inView = true;
var delay = (animated && inView) ? (1000 / 30) : (1000 / 3);
var frame = elapsed % animation.length;
if (inView || (elapsed === 0)) {
if ((frame !== previousFrame) && (animated || previousFrame === null)) {
previousFrame = frame;
renderFrame(animation[frame]);
}
}
setTimeout(function() {
animate();
}, delay);
});
}
var previousFrame = null;
animate(id);
}
function renderPart(part) {
if (part.length === 3) {
part.splice(1, 0, 1, 0, 0, 1);
}
var s = data.sprites[part[0]];
var e = 264 * zoom + part[5] / (s[4] / s[2]);
var f = 270 * zoom + shift + part[6] / (s[5] / s[3]);
ctx.setTransform(part[1], part[2], part[3], part[4], e, f);
ctx.drawImage(spritesImg, s[0], s[1], s[2], s[3], 0, 0, s[2], s[3]);
}
function clearFrame() {
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.clearRect(0, 0, canvas.width, canvas.height);
var w = standImg.width * 0.58;
var h = standImg.height * 0.58;
ctx.globalAlpha = 0.18;
ctx.drawImage(standImg, 0, 0, standImg.width, standImg.height, (canvas.width - w) / 2, 328 * zoom + shift, w, h);
ctx.globalAlpha = 1;
}
function renderFrame(frame) {
clearFrame();
frame.forEach(renderPart);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment