Как дать моему javascript-шару подвижную анимацию, когда он движется?
у меня есть следующий HTML-код:
<img src="game_files/ball.png" id="ball" />
Это div, содержащий изображение шара
(вид сверху шара)
этот шар я могу перемещать с помощью клавиш со стрелками и некоторых javacript, чтобы идти вверх, влево, вправо, вниз и т. д. Я делаю это с помощью этого кода:
var ball = function () {
var inited = false,
el,
xcheck = 50,
x = 50,
ycheck = 50,
y = 50,
xspeed = 0,
yspeed = 0,
power = 0.4,
friction = 0.99,
xwind = 0,
ywind = 0,
dead = true,
timer = function(keys) {
if (dead === true) {
return;
}
if (keys[38] === true) {
yspeed += power;
}
if (keys[40] === true) {
yspeed -= power;
}
if (keys[37] === true) {
xspeed += power;
}
if (keys[39] === true) {
xspeed -= power;
}
xspeed = xspeed * friction - xwind;
yspeed = yspeed * friction - ywind;
if (Math.abs(xspeed) < 0.004) {
xspeed = 0;
}
if (Math.abs(xspeed) < 0.004) {
xspeed = 0;
}
x -= xspeed;
y -= yspeed;
plane.move(x,y);
};
return {
init: function() {
if (inited != true) {
inited = true;
el = document.getElementById('ball');
roller.register(timer, 'time');
}
}
};
}();
Это все работает, но мяч не катится анимации! Изображение просто скользит влево или вправо, как я могу добавить это? Я нашел этот учебник: http://www.emanueleferonato.com/2007/06/10/creation-of-realistic-spheres-in-flash-with-textures-and-masking/
3 ответов
чтобы иметь тот же эффект, что и в Примере Flash, который вы связали, вам просто нужно добавить фон к элементу и переместить его соответственно.
Я заменил ваш элемент img На span и дал ему фоновое изображение через CSS и радиус границы, чтобы сделать его круглым. В вашем самолете.функцию я добавил следующую строку:
document.getElementById('ball').style.backgroundPosition = x + 'px ' + y +'px';
вуаля, тот же эффект, что и в Примере Flash:http://jsfiddle.net/dhUw5/1/
вы, вероятно, будете использовать HTML5 canvas. Вы бы обрезать часть изображения, используемого в качестве поверхности шара с помощью drawImage
а то Маска его, чтобы получить форму круга. Затем вы можете оживить его, перерисовав холст, с положением отсечения (sx, sy), измененным аналогично примеру flash, с которым вы связались. (Следующее Не тестируется; сделайте jsfiddle с исходным кодом, если вы хотите попробовать.)
// ... when the user moves
this.sy += yspeed;
this.sx += xspeed;
if (this.sx > textureSize) {
this.sx -= textureSize;
}
else if (this.sx < 0) {
this.sx += textureSize;
}
if (this.sy > textureSize) {
this.sy -= textureSize;
}
else if (this.sy < 0) {
this.sy += textureSize;
}
// ... redraw the ball once every frame
context.clearRect(0, 0, canvasWidth, canvasHeight); // clear the canvas
context.save();
context.beginPath();
context.arc(this.x, this.y, ballRadius, Math.PI * 2, false);
context.clip();
context.drawImage(ballImage, this.sx, this.sy,
ballDiameter, ballDiameter,
this.x, this.y,
ballDiameter, ballDiameter); // redraw the ball
context.restore();
В качестве альтернативы вы можете использовать div с текстуру в качестве фонового изображения и замаскируйте ее, чтобы сделать круг с помощью CSS3 или наложив другое изображение (см. лучший способ замаскировать изображение в HTML5). Затем вы измените координаты фонового изображения (текстуры), используя
ballElement.style.backgroundPosition = this.sx + 'px ' + this.sy + 'px';
Это довольно легко, если вы используете CSS-преобразований. В данном примере скорость вращения определяется в соответствии со скалярным значением скорости, с которой шар в данный момент движется:
var increment = Math.round(Math.sqrt(Math.pow(xspeed, 2) + Math.pow(yspeed, 2)));
if (!isNaN(increment)) {
currangle = currangle + ((xspeed < 0 ? 1 : -1) * increment);
}
$('#ball').css({
'-webkit-transform': 'rotate(' + currangle + 'deg)'
});
$('#ball').css({
'-moz-transform': 'rotate(' + currangle + 'deg)'
});
этот код идет в move
метод plane
. Вот демонстрация:http://jsfiddle.net/BahnU/show/