Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.08.2014, 19:04
DearSanta вне форума Посмотреть профиль Отправить личное сообщение для DearSanta Найти все сообщения от DearSanta
  № 1  
Ответить с цитированием
DearSanta

Регистрация: Aug 2014
Сообщений: 1
Attention Не отслеживает зажатые клавиши

Всем привет, возникла такая вот проблема, хоть убей, не пойму что не так: если зажать одну клавишу, и через какое-то время нажать вторую, первая перестает работать, и вообще не отслеживается. Например, нужно создать персонажа, который двигается стрелочками влево-вправо, прыгает, и при нажатии стрелки и прыжка прыгать в сторону. Если нажать строго одновременно, то все работает, но если, например, зажать стрелку, а потом нажать прыжок, персонаж тупо останавливается, и больше не реагирует на стрелку, только на кнопку прыжка. А для того, чтобы он снова пошел в сторону, нужно отпустить стрелку, и нажать ее заново, что не очень удобно. Перепробовал все что только приходило в голову, в интернете ответа не нашел, узнал только что это может быть из-за плохой клавиатуры, но я сомневаюсь. Реализовано все самым простым и очевидным способом, через 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);
}

Старый 18.08.2014, 19:59
Rivexe вне форума Посмотреть профиль Отправить личное сообщение для Rivexe Найти все сообщения от Rivexe
  № 2  
Ответить с цитированием
Rivexe
 
Аватар для Rivexe

Регистрация: Jun 2013
Сообщений: 133
У вас при любом срабатывание события - KeyboardEvent.KEY_UP, происходит сброс всех ключей:
Код AS3:
left = false;
right = false;
jump = false;
из-за этого и происходит такой "эффект".

Старый 18.08.2014, 21:00
PsychoTech вне форума Посмотреть профиль Отправить личное сообщение для PsychoTech Найти все сообщения от PsychoTech
  № 3  
Ответить с цитированием
PsychoTech
 
Аватар для PsychoTech

Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
да у меня такое же было. Кодил кодил а потом оказалось что при отбрасывании в одном месте сбрасывалось все.

Старый 20.08.2014, 13:19
delphic вне форума Посмотреть профиль Отправить личное сообщение для delphic Найти все сообщения от delphic
  № 4  
Ответить с цитированием
delphic

Регистрация: Apr 2014
Сообщений: 215
Цитата:
Сообщение от DearSanta Посмотреть сообщение
Если нажать строго одновременно, то все работает, но если, например, зажать стрелку, а потом нажать прыжок, персонаж тупо останавливается, и больше не реагирует на стрелку, только на кнопку прыжка.
Код 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, время: 01:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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