Страницы

Поиск по вопросам

среда, 5 декабря 2018 г.

движение персонажа на JavaScript

Сделал функцию, которая двигает персонажа в разные стороны, вот пример:
function handleInput() { window.addEventListener("keydown", function(event) { if (event.keyCode == 65) ractive.set({'playerX': ractive.get( 'playerX' ) - 1}); if (event.keyCode == 68) ractive.set({'playerX': ractive.get( 'playerX' ) + 1}); if (event.keyCode == 87) ractive.set({'playerY': ractive.get( 'playerY' ) - 1}); if (event.keyCode == 83) ractive.set({'playerY': ractive.get( 'playerY' ) + 1}); });
не буду вдаваться в подробности, из примера видно, что движение осуществляется при событии keyDown - таким образом, при нажатии и удерживании клавиши, сначала игрок смещается на 1 пиксель, и только потом - через долю секунды - продолжает двигаться дальше, не знаю можно ли решить проблему, но мне эта реализация кажется не совсем верной. Как правильно реализовать передвижение спрайта? Может у кого-то есть ссылки на полезные статьи по этому поводу?


Ответ

Просили написать ответ тут. В общем там много косяков лень все править, писал на скорую руку в основном копи пастом из того примера что в комментах писал, по этому много дублирующих методов и переменных, но я как бы на работе так что извиняйте =)
Это ссыль http://codepen.io/korolariya/pen/WxbPJo
(function($) {
$(document).ready(function() {
function keydown(event) {
if (player.pressed.indexOf(event.which) === -1) { switch (event.which) { case 37: // left player.vec_add(player.velocity, { x: -1, y: 0 }); break;
case 38: // top player.vec_add(player.velocity, { x: 0, y: -1 }); break;
case 39: // right player.vec_add(player.velocity, { x: 1, y: 0 }); break;
case 40: // bottom player.vec_add(player.velocity, { x: 0, y: 1 }); break; }
player.pressed.push(event.which); } }
function keyup(event) { var index; if ((index = player.pressed.indexOf(event.which)) >= 0) { player.pressed.splice(index, 1); switch (event.which) { case 37: // left player.vec_sub(player.velocity, { x: -1, y: 0 }); break;
case 38: // top player.vec_sub(player.velocity, { x: 0, y: -1 }); break;
case 39: // right player.vec_sub(player.velocity, { x: 1, y: 0 }); break;
case 40: // bottom player.vec_sub(player.velocity, { x: 0, y: 1 }); break; } } } window.addEventListener("keydown", keydown, false); window.addEventListener("keyup", keyup, false); var player = { selector: $('#player'), position: { x: 110, y: 110 }, target: { x: 0, y: 0 }, click: { x: 0, y: 0 }, normal: { x: 0, y: 0 }, way: { x: 0, y: 0 }, speed: 3, collapse: 5, pressed: [], velocity: { x: 0, y: 0 }, vec_add: function(a, b) { a.x += b.x; a.y += b.y; }, vec_sub: function(a, b) { a.x -= b.x; a.y -= b.y; }
};
player.move = function(pos) { if (pos != undefined) { this.position.x = pos.x; this.position.y = pos.y; } this.selector.css("left", (this.position.x - 5) + 'px'); this.selector.css("top", (this.position.y - 5) + 'px'); }; player.normalMove = function() { this.countWay(); this.position.x = this.position.x + (this.normal.x * this.speed); this.position.y = this.position.y + (this.normal.y * this.speed); this.move(); }; player.keyMove = function() { if(this.velocity.x || this.velocity.y != 0){ var normal = {x:0,y:0}; normal.x = this.speed * this.velocity.x / Math.sqrt(Math.pow(this.velocity.x, 2) + Math.pow(this.velocity.y, 2)); normal.y = this.speed * this.velocity.y / Math.sqrt(Math.pow(this.velocity.x, 2) + Math.pow(this.velocity.y, 2)); this.vec_add(this.position, normal); this.move(); } }; player.setNormal = function(e) { this.click.x = e.clientX; this.click.y = e.clientY; this.target.x = this.click.x - this.position.x; this.target.y = this.click.y - this.position.y; this.normal.x = this.target.x / Math.sqrt(Math.pow(this.target.x, 2) + Math.pow(this.target.y, 2)); this.normal.y = this.target.y / Math.sqrt(Math.pow(this.target.x, 2) + Math.pow(this.target.y, 2)); this.countWay(); }; player.untilgo = function() { return this.way.x > this.collapse || this.way.y > this.collapse; };
player.countWay = function() { //тут можно вычислять расстояние // Math.sqrt(Math.pow(this.position.x - this.click.x)+Math.pow(this.position.y - this.click.y)); this.way.x = Math.abs(this.position.x - this.click.x); this.way.y = Math.abs(this.position.y - this.click.y); };
player.move(); var timer; var fps = 60;
function step() { setTimeout(function() { requestAnimationFrame(step); if (player.untilgo()) { player.normalMove(); } player.keyMove();
}, 1000 / fps); } step(); $(document).click(function(e) { player.setNormal(e); });
});
}) (jQuery);

Комментариев нет:

Отправить комментарий