Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не отслеживает зажатые клавиши (http://www.flasher.ru/forum/showthread.php?t=208720)

DearSanta 18.08.2014 19:04

Не отслеживает зажатые клавиши
 
Всем привет, возникла такая вот проблема, хоть убей, не пойму что не так: если зажать одну клавишу, и через какое-то время нажать вторую, первая перестает работать, и вообще не отслеживается. Например, нужно создать персонажа, который двигается стрелочками влево-вправо, прыгает, и при нажатии стрелки и прыжка прыгать в сторону. Если нажать строго одновременно, то все работает, но если, например, зажать стрелку, а потом нажать прыжок, персонаж тупо останавливается, и больше не реагирует на стрелку, только на кнопку прыжка. А для того, чтобы он снова пошел в сторону, нужно отпустить стрелку, и нажать ее заново, что не очень удобно. Перепробовал все что только приходило в голову, в интернете ответа не нашел, узнал только что это может быть из-за плохой клавиатуры, но я сомневаюсь. Реализовано все самым простым и очевидным способом, через KeyUp, KeyDown и enterFrame.

Сам код:

Код AS3:

import flash.events.Event;
 
var gravity:int = 20;
var left:Boolean = false;
var right:Boolean = false;
var jump:Boolean = false;
var count:Number = 0;
var speedX:int = 10;
var speedY:int = 100;
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, kd);
stage.addEventListener(KeyboardEvent.KEY_UP, ku);
stage.addEventListener(Event.ENTER_FRAME, ef);
 
function ef(e:Event):void{
        hero.y += gravity;
        if(hero.y >= 300){
        hero.y = 300;}
 
        if(left){
                hero.x -= speedX;
                hero.scaleX = +0.5;       
                hero.play();
        }
        if(right){
                hero.x += speedX;
                hero.scaleX = -0.5;
            hero.play();
 
        }
        if(jump && left){
                hero.x -= speedX;
                hero.y += speedY;
                        }
        if(jump && right){
                hero.x += speedX;
                hero.y += speedY;
                }
        if(jump){
                hero.y = speedY;
            stage.removeEventListener(KeyboardEvent.KEY_DOWN, kd);
                }
        if(count >= 1){
        jump = false;
}
 
}
 
function kd(e:KeyboardEvent){
 
        trace(e.keyCode)
        if(e.keyCode == 32){
        }
 
 
        if(e.keyCode == 37){
        left = true;
    }
 
        if(e.keyCode == 39){
        right = true;
    }
    if(e.keyCode == 32){
        jump = true;
        }
}
function ku(e:KeyboardEvent){
hero.gotoAndStop(1);
left = false;
right = false;
jump = false;
count = 0;
stage.addEventListener(KeyboardEvent.KEY_DOWN, kd);
}


Rivexe 18.08.2014 19:59

У вас при любом срабатывание события - KeyboardEvent.KEY_UP, происходит сброс всех ключей:
Код AS3:

left = false;
right = false;
jump = false;

из-за этого и происходит такой "эффект".

PsychoTech 18.08.2014 21:00

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

delphic 20.08.2014 13:19

Цитата:

Сообщение от DearSanta (Сообщение 1170830)
Если нажать строго одновременно, то все работает, но если, например, зажать стрелку, а потом нажать прыжок, персонаж тупо останавливается, и больше не реагирует на стрелку, только на кнопку прыжка.
Код AS3:

function ef(e:Event):void
        if(jump) вообще советую переносить скобки, так понятней где конец и где начало, во Flash кстати
можно настроить что бы перенос был автоматически
{
                hero.y = speedY;
            stage.removeEventListener(KeyboardEvent.KEY_DOWN, kd);
}
а зачем Вы тут стираете слушатель? конечно будет глюк с клавиатурой
function kd(e:KeyboardEvent)
{
        if(e.keyCode == 32)
      {
 
        }
}
зачем цифры? неудобно и непонятно, используйте import flash.ui.*; и тогда можно указывать название клавиши
например - if(e.keyCode == Keyboard.SPACE)
 
function ku(e:KeyboardEvent)
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, kd);
зачем вешаете слушатель опять?
}


советую доработать код,логику посмотреть, убрать ненужные слушатели
Не знаю как у вас одновременно работают несколько клавиш,скорей всего Flash надрывается и думает что вы все таки жмете, например я делал как вы раньше, но потом сделал такой опыт, например ставишь квадрат на сцену и видишь что это на самом деле не одновременное нажатие, особенно если частоту кадров уменьшить
лучше в духе таком
Код AS3:

                        if(e.keyCode == Keyboard.UP)
                        {
                                moveUp = true;
                        }
                        if(e.keyCode == Keyboard.RIGHT)
                        {
                                moveRight = true;
                        }

тогда вы заметите что управление куда податливей
также мой вам совет,да и все так скажут, названия понятливые давать а не ku и т.д
даже если вы это делаете в качестве теста, а тем более если рабочий проект со временем будет непонятен код, что за ku. Хотя мне тоже бывает лень писать название))).Я надеюсь это то что вам нужно, по крайней мере у меня работает эта система исправно.


Часовой пояс GMT +4, время: 21:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.