Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Javascript. Управление c клавиатуры.  (Прочитано 1882 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Atilla

  • Автор темы
  • Участник
  • *
  • Сообщений: 196
    • Просмотр профиля
Javascript. Управление c клавиатуры.
« : 10 Октября 2009, 19:06:20 »
Почему-то в игрушке управление "отрожателями" работает туго. Вот:
zaripov.nxt.ru/test/index.html.
В начале сдвигается, думает с полсекунды, и снова идет.
Код:

speed=4; // px/10ms
dead=0;
plSpeed=15;
time=2;
radius=5;
i=1;
function start () {
dead=document.getElementById('dead');
dead.number=0;

bool=document.getElementById('bool');
bool.left=500;
bool.top=200;
bool.destination=true;
bool.alpha=-0.3;
bool.move=function (x,y) {
bool.left+=x;
bool.top+=-y;
bool.style.left=Math.round(bool.left)+'px';
bool.style.top=Math.round(bool.top)+'px';
}

pl1=document.getElementById('pl1');
pl1.top=0;
pl1.height=100;
pl1.speed=30;
        // думаю что тут-то и загвоздка ;-)
pl1.move=function (destination) {
window.status=i;
pl1.top+=destination*plSpeed;
pl1.style.top=Math.round(pl1.top)+'px';
}

pl2=document.getElementById('pl2');
pl2.top=0;
pl2.height=100;
pl2.speed=30;
pl2.move=function (destination) {
window.status=i;
pl2.top+=destination*plSpeed;
pl2.style.top=Math.round(pl2.top)+'px';
}
play_status=false;
playPause();

documentWidht=1366;
documentHeight=580;

window.addEventListener('keydown', pressKey, false);
}
function pressKey(event) {
if (!event) event=window.event;
if (event.keyCode==40) pl2.move(1);
if (event.keyCode==38) pl2.move(-1);
if (event.keyCode==83) pl1.move(1);
if (event.keyCode==87) pl1.move(-1);
if (event.keyCode==80) playPause();
}
function game() {
if (bool.top<=0 | bool.top>=documentHeight) {
bool.alpha=-bool.alpha;
}
if (bool.destination) {
if ((bool.left+radius)>=(documentWidht-10))
if ((bool.top>=pl2.top) & (bool.top<=(pl2.top+100))) {
bool.destination=!bool.destination;
bool.alpha=3.14-bool.alpha;
}
else {
Dead();
playPause();
}
bool.move(speed*Math.cos(bool.alpha),-speed*Math.sin(bool.alpha));
}
else {
if ((bool.left+radius)<=10)
if ((bool.top>=pl1.top) & (bool.top<=(pl1.top+100))) {
bool.destination=!bool.destination;
bool.alpha=3.14-bool.alpha;
}
else {
Dead();
playPause();
}
bool.move(speed*Math.cos(bool.alpha),-speed*Math.sin(bool.alpha));
}
}
function playPause () {
if (!play_status) {
game_go=setInterval (game, 1);
document.getElementById('play').style.background='url(./images/pause.png)';
play_status=true;
} else {
clearInterval(game_go);
document.getElementById('play').style.background='url(./images/play.png)';
play_status=false;
}
}
function Dead() {
dead.number++;
dead.value=dead.number;
bool.destination=true;
bool.left=documentWidht/2;
bool.top=documentHeight/2;
bool.move(0,0);
bool.alpha=0;
}
« Последнее редактирование: 10 Октября 2009, 19:51:54 от Atilla »

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Javascript. Управление c клавиатуры.
« Ответ #1 : 10 Октября 2009, 19:45:24 »
Прежде всего запихай код в блок "Код", а этот блок уже в "Спойлер", если не трудно :)
   window.addEventListener('keydown', pressKey, false);
}
function pressKey(event) {
   if (!event) event=window.event;
   if (event.keyCode==40) pl2.move(1);
   if (event.keyCode==38) pl2.move(-1);
   if (event.keyCode==83) pl1.move(1);
   if (event.keyCode==87) pl1.move(-1);
   if (event.keyCode==80) playPause();
}
Здесь на страницу вешается датчик событий, а точнее, нажатия на клавишу. При нажатии вызывается функция pressKey, которая вызывает функции перемещения. Так вот при однократном нажатии на кнопку все отрабатывает нормально, но при удержании происходит эмуляция многократного нажатия. Эмулирует эти множественные тычки сама система, но спустя время, которое указанно в настройках самой системы. Так что "проблема" (?) в настройках клавиатуры.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Atilla

  • Автор темы
  • Участник
  • *
  • Сообщений: 196
    • Просмотр профиля
Re: Javascript. Управление c клавиатуры.
« Ответ #2 : 10 Октября 2009, 19:53:35 »
Как сделать так, чтобы на всех компах/системах/браузерах работало нормально?

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Javascript. Управление c клавиатуры.
« Ответ #3 : 10 Октября 2009, 19:58:02 »
Вызывать перемещение "отражателя" циклом, а не событием клавиатуры. Вызывать цикл по keydown, рвать цикл по keyup-у или же в каждой итерации проверять не отпустили ли кнопку. :)
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Atilla

  • Автор темы
  • Участник
  • *
  • Сообщений: 196
    • Просмотр профиля
Re: Javascript. Управление c клавиатуры.
« Ответ #4 : 10 Октября 2009, 20:19:19 »
А как проверить?

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Javascript. Управление c клавиатуры.
« Ответ #5 : 10 Октября 2009, 20:33:17 »
Повесь еще один датчик событий, только пусть он проверяет keyup. В цикле сделай проверку какой-нибудь переменной, которая меняет свое значение при отпускании кнопки. Типа так:
move_flag = 0;

window.addEventListener('keyup', stopMove, false);
window.addEventListener('keydown', startMove, false);

function stopMove () {
    move_flag = 0;
}

function startMove () {
    move_flag = 1;
    Move ();
}

function Move () {
    while (move_flag) {
        ............
        Move ();
    }
}
Работоспособность не гарантирую, потому что просто прикидка... :)

UPD: Звиняюсь за ашипки... Малость поправил :)
« Последнее редактирование: 10 Октября 2009, 21:04:56 от Protopopulus »
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Atilla

  • Автор темы
  • Участник
  • *
  • Сообщений: 196
    • Просмотр профиля
Re: Javascript. Управление c клавиатуры.
« Ответ #6 : 11 Октября 2009, 12:30:23 »
Чуток доработал:

       pl1.move=function (destination) {
pl1.top+=destination*plSpeed;
pl1.style.top=Math.round(pl1.top)+'px';
if (press_status) setTimeout ('pl1.move(destination)', 1);
}
...
function downKey(event) {
if (!event) event=window.event;
press_status=true;
if (event.keyCode==40) pl2.move(1);
if (event.keyCode==38) pl2.move(-1);
if (event.keyCode==83) pl1.move(1);
if (event.keyCode==87) pl1.move(-1);
if (event.keyCode==80) playPause();
}
function upKey() {
press_status=false;
}
Точно так же. Как еще можно доработать?

 

Страница сгенерирована за 0.019 секунд. Запросов: 21.