Jump to content
  • 0

Помогите с клавишами


ctpz
 Share

Question

22 answers to this question

Recommended Posts

  • 0

Это разрабатывается на компьютере. Есть вариант с onkeypress/onkeydown. Однако я не могу указать при каком коде клавиши передается true.

Вот код (но он почему-то нерабочий):


document.body.onkeypress = function(e) {
e = e || event;
var chr = getChar(e);
if (chr == null){return};
if (chr == 33){
space();
}
}

function getChar(event) {
if (event.which == null) {
if (event.keyCode < 32) return null;
return String.fromCharCode(event.keyCode)
}
if (event.which!=0 && event.charCode!=0) {
if (event.which < 32) return null;
return String.fromCharCode(event.which)
}
return null;
}

function space(){

}

Edited by ctpz
Link to comment
Share on other sites

  • 0

Делаю игру. Реализовал все, кроме передвижения персонажа. В идеале хотелось бы одну функцию, которая вычисляла бы код нажатой клавиши, а дальше просто можно было бы узнать например:

if(pressKeyCode() == 65){
goLeft();
}

Link to comment
Share on other sites

  • 0

var keys = {
LEFT: false,
RIGHT: false,
UP: false,
DOWN: false,
SPACE: false,
ENTER: false
};

function handleKeydown(e) {
e = e || window.event;
var key = e.which || e.keyCode;

if (key == 13) {
keys.ENTER = true;
}

if (key == 32) {
keys.SPACE = true;
}

if (key == 37) {
keys.LEFT = true;
}

if (key == 38) {
keys.UP = true;
}

if (key == 39) {
keys.RIGHT = true;
}

if (key == 40) {
keys.DOWN = true;
}
}

function handleKeyup(e) {
e = e || window.event;
var key = e.which || e.keyCode;

if (key == 13) {
keys.ENTER = false;
}

if (key == 32) {
keys.SPACE = false;
}

if (key == 37) {
keys.LEFT = false;
}

if (key == 38) {
keys.UP = false;
}

if (key == 39) {
keys.RIGHT = false;
}

if (key == 40) {
keys.DOWN = false;
}
}

document.onkeydown = function(e) {
handleKeydown(e);

if (keys.LEFT) console.log('left');
if (keys.UP) console.log('up');
if (keys.RIGHT) console.log('right');
if (keys.DOWN) console.log('down');
if (keys.ENTER) console.log('enter');
if (keys.SPACE) console.log('space');
}

document.onkeyup = function(e) {
handleKeyup(e);
}


  • Like 2
Link to comment
Share on other sites

  • 0

Не, switch дает выбрать только одну клавишу. А если я наискосок побежать хочу? Можно конечно убрать break, но тогда клавиши придется расставлять в порядке возрастания. Хотя, в принципе, можно и switch. По тексту чуток короче получится.

Link to comment
Share on other sites

  • 0


var keys = {
LEFT: false,
RIGHT: false,
UP: false,
DOWN: false,
SPACE: false,
ENTER: false
};

function handleKey(e) {
e = e || window.event;
var key = e.which || e.keyCode;

switch (key){
case 13: keys.ENTER = true; break;
case 32: keys.SPACE = true; break;
case 37: keys.LEFT = true; break;
case 38: keys.UP = true; break;
case 39: keys.RIGHT = true; break;
case 40: keys.DOWN = true; break;
}

console.debug( keys );
}

document.onkeydown = handleKey;
document.onkeyup = handleKey;

Улучшим чуток

Хотя, я не совсем понимаю, зачем нужно вешать обработчик на keyup, ведь невозможно отжать кнопку не нажав ее.

Хотя, нет, программно таки можно.

Link to comment
Share on other sites

  • 0

Это ухудшение. В таком случае нельзя обработать нажатие более одной кнопки одновременно. Например если это платформер и мне надо одновременно бежать и прыгать, или, например бежать наискосок. Я могу зажать одну кнопку и, не отпуская, нажать еще одну. Так же, я могу отпустить какую-то кнопку, но оставить нажатой другую.

Поэтому два независимых обработчика: на нажатие, на отпускание.

Link to comment
Share on other sites

  • 0

Это ухудшение. В таком случае нельзя обработать нажатие более одной кнопки одновременно. Например если это платформер и мне надо одновременно бежать и прыгать, или, например бежать наискосок. Я могу зажать одну кнопку и, не отпуская, нажать еще одну. Так же, я могу отпустить какую-то кнопку, но оставить нажатой другую.

Поэтому два независимых обработчика: на нажатие, на отпускание.

Мое предыдущее решение неправильное было. Забыл состояние менять.


var keys = {
LEFT: false,
RIGHT: false,
UP: false,
DOWN: false,
SPACE: false,
ENTER: false
};

function handleKey(e) {
e = e || window.event;
var key = e.which || e.keyCode;

var state = (e.type == "keydown");

switch (key){
case 13: keys.ENTER = state; break;
case 32: keys.SPACE = state; break;
case 37: keys.LEFT = state; break;
case 38: keys.UP = state; break;
case 39: keys.RIGHT = state; break;
case 40: keys.DOWN = state; break;
}

console.debug( keys );
}

document.onkeydown = handleKey;
document.onkeyup = handleKey;

На каждое нажатие кнопки срабатывает свое собственное событие. keyCode не массив и не может хранить более одной клавиши. Поэтому break тут работает как положено.

Запусти код и посмотри, что пишется в консоли


Object { LEFT=true, RIGHT=false, UP=false, more...}
Object { LEFT=true, RIGHT=false, UP=true, more...}
Object { LEFT=true, RIGHT=true, UP=true, more...}
Object { LEFT=true, RIGHT=false, UP=true, more...}
Object { LEFT=true, RIGHT=false, UP=false, more...}
Object { LEFT=false, RIGHT=false, UP=false, more...}

Обрати внимание на третью строку, там LEFT=true, RIGHT=true, UP=true

Edited by s0rr0w
Link to comment
Share on other sites

  • 0
В таком случае нельзя обработать нажатие более одной кнопки одновременно. Например если это платформер и мне надо одновременно бежать и прыгать, или, например бежать наискосок. Я могу зажать одну кнопку и, не отпуская, нажать еще одну. Так же, я могу отпустить какую-то кнопку, но оставить нажатой другую.

Поэтому два независимых обработчика: на нажатие, на отпускание.

ну да. Хотя для простых игр вроде этой я использовал один.

Link to comment
Share on other sites

  • 0
А вообще согласен, switch тут тоже подойдет.

Я бы сказал, что в данном случае он является предпочтительным.

Насчет стиля, пишу так:

switch( key ) {
case 13:
keys.ENTER = state;
break;
case 32:
keys.SPACE = state;
break;
case 37:
keys.LEFT = state;
break;
case 38:
keys.UP = state;
break;
case 39:
keys.RIGHT = state;
break;
case 40:
keys.DOWN = state;
break;
}

строчек больше, но воспринимаются они лучше (для меня).

Edited by nerv
Link to comment
Share on other sites

  • 0

2s0rr0w: да такой код рабочий. Правда менее понятен при чтении. А вообще согласен, switch тут тоже подойдет.

Ну, кто к чему привык. Тут уже от стилистики зависит. Преимущество моего подхода в том, что он написан один раз, а не два. При добавлении новых клавиш не потребуется его два раза записывать. Хотя опять же, это все очень субъективно. Идеальных решений не существует, бывают только компромисы и нюансы.

строчек больше, но воспринимаются они лучше (для меня).

В этот код не особо надо вчитываться, тут глаз воспринимает число и текст, написанный капсом. Все остальное - повторяемая служебная обвязка. Посему, с точки зрения юзабилити, мой код чуть плотнее, это минус, но компактность сыграет при расширении списка и при беглом просмотре. Но, как я уже сказал, я не навязываю свои правила.

Link to comment
Share on other sites

  • 0

Я конечно понимаю, что правила существуют для того чтобы их нарушать, но во всех книгах по программированию учат, что код надо писать как можно понятнее. Даже ценой компактности. Это облегчит его понимание в дальнейшем (когда откроешь свой код года через 2 или когда другой человек будет разбираться).

Так что свитч конечно хорошо, но вариант сорроу не самый наглядный.

Link to comment
Share on other sites

  • 0

Я конечно понимаю, что правила существуют для того чтобы их нарушать, но во всех книгах по программированию учат, что код надо писать как можно понятнее. Даже ценой компактности. Это облегчит его понимание в дальнейшем (когда откроешь свой код года через 2 или когда другой человек будет разбираться).

Так что свитч конечно хорошо, но вариант сорроу не самый наглядный.

:) Доля правды есть в словах.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy