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

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

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

Регистрация: Feb 2008
Сообщений: 72
По умолчанию Чем заменить isKeyDown?

Нашел примерно следующее:
Код AS3:
			var keyArray:Array = new Array();
			var i:Number;
			for (i=0; i<222; i++) {
				keyArray.push([i,false]);
			}
			stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeysDown);
			stage.addEventListener(KeyboardEvent.KEY_UP,checkKeysUp);
			function checkKeysDown(event:KeyboardEvent):void {
				keyArray[event.keyCode][1]=true;
			}
			function checkKeysUp(event:KeyboardEvent):void {
				keyArray[event.keyCode][1]=false;
			}
			function isKeyDown(X:Number) {
				return keyArray[X][1];
			}
но, почему-то, это решение меня смущает.. подскажите, пожалуйста, как более правильно заменить isKeyDown из AS2? И вообще не очень понятно, зачем разработчики убрали данную функцию? Хотя... раз они ее убрали, значит не хотели, чтоб ей пользовались, а значит писать надо как-то по другому... но как?

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

Регистрация: May 2003
Адрес: Tallinn
Сообщений: 3,182
Код:
package ee.cfco.darkness.model.userControls 
{
	
	import com.adobe.utils.ArrayUtil;
	
	public class KeyHandler 
	{
		public static var keysPressed:Array = new Array();
		public static var keyProcessed:Boolean;
		
		public static var movementEnabled:Boolean = true;
		
		public static function clear():void {
			keysPressed = new Array();
			keyProcessed = false;
		}
		
		public static function someKeyIsDown():Boolean {
			return KeyHandler.keysPressed.length > 0;
		}
		
		public static function isDown(key:int):Boolean {
			for each(var k:int in KeyHandler.keysPressed) {
				if (k == key) return true;
			}
			return false;
		}
		
		public static function keyDown(key:int):void {
			KeyHandler.keysPressed.push(key);
			KeyHandler.keysPressed = ArrayUtil.createUniqueCopy(KeyHandler.keysPressed);
		}
		
		public static function keyUp(key:int):void {
			ArrayUtil.removeValueFromArray(KeyHandler.keysPressed, key);
		}
		
	}
	
}
я на днях для игрушки сделал такой класс...может пригодится

Старый 24.11.2008, 13:53
AL.exe вне форума Посмотреть профиль Отправить личное сообщение для AL.exe Посетить домашнюю страницу AL.exe Найти все сообщения от AL.exe
  № 3  
Ответить с цитированием
AL.exe
 
Аватар для AL.exe

Регистрация: Jan 2004
Адрес: Net
Сообщений: 1,049
Отправить сообщение для AL.exe с помощью ICQ
А зачем ее использовать? Вижу смысл только в том случае, если вы хотите какую-то клавишу использовать в качестве модификатора.
__________________
Дело не в тебе

Старый 26.11.2008, 11:22
Smirnov48 вне форума Посмотреть профиль Отправить личное сообщение для Smirnov48 Найти все сообщения от Smirnov48
  № 4  
Ответить с цитированием
Smirnov48

Регистрация: Feb 2008
Сообщений: 72
CrazyFlasher - спасибо я правда тут еще один вариант нашел:
Код AS3:
package{
	import flash.events.KeyboardEvent;
	import flash.display.Stage;
	import flash.utils.Dictionary;
	public class KeyController{
		private var _keys:Dictionary;
		public function KeyController(stage:Stage) {
			_keys = new Dictionary();
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
			stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
		}
		public function isKeyDown(keyCode:uint):Boolean {
			return _keys[keyCode];
		}
		private function keyDownHandler(event:KeyboardEvent):void {
			_keys[event.keyCode] = true;
		}
		private function keyUpHandler(event:KeyboardEvent):void {
			_keys[event.keyCode] = false;
		}
	}
}
AL.exe - согласен, для модификаторов наверное самое лучшее применение. Но лично я хотел организовать с помошью isKeyDown - примерно такой игровой цикл:
Код:
	Обрабатываем нажатые клавиши(if (isKeyDown(...) и реакции на них.
	Перемещаем обьект на сцене.
	Обрабатываем столкновения.
Я не прав?

Старый 26.11.2008, 16:56
mort вне форума Посмотреть профиль Отправить личное сообщение для mort Найти все сообщения от mort
  № 5  
Ответить с цитированием
mort

Регистрация: Jun 2002
Сообщений: 391
Лишняя сущность.
По нажатиям можно сразу обрабатывать реакции, ну или сохранять их куда-нибудь, как вы сейчас это с клавишами делаете.

Старый 27.11.2008, 12:32
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 6  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
Если при нажатой клавише флешка потеряет фокус, то KEY_UP не сработает и клавиша "залипнет" в нажатом состоянии. Добавьте
Код:
stage.addEventListener(Event.DEACTIVATE, allKeyUpHandler);

private function allKeyUpHandler(event:Event):void {
	_keys = new Dictionary();
}
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 28.11.2008, 00:48
AL.exe вне форума Посмотреть профиль Отправить личное сообщение для AL.exe Посетить домашнюю страницу AL.exe Найти все сообщения от AL.exe
  № 7  
Ответить с цитированием
AL.exe
 
Аватар для AL.exe

Регистрация: Jan 2004
Адрес: Net
Сообщений: 1,049
Отправить сообщение для AL.exe с помощью ICQ
MerlinTwi, а если флешка потеряет фокус, а клавиша отжата не будет, то при возвращении фокуса ивент KEY_DOWN снова выстрелит?
__________________
Дело не в тебе

Старый 28.11.2008, 17:31
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 8  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
Нет, не выстрелит. Нужно будет отпустить и нажать клавишу снова. Что гораздо меньшая "потеря" нежели "залипшие" клавиши.
Такое вообще может произойти реально очень редко, чтобы юзер вернул фокус на флешку не отпуская кнопку
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 03.12.2008, 19:46
sinya вне форума Посмотреть профиль Отправить личное сообщение для sinya Посетить домашнюю страницу sinya Найти все сообщения от sinya
  № 9  
Ответить с цитированием
sinya
 
Аватар для sinya

Регистрация: Apr 2003
Адрес: Ukraine, Kiev
Сообщений: 189
Отправить сообщение для sinya с помощью ICQ
Привет. Сегодня впервые сел за АС3. Кое-что уже проясняется. Но вот не понял, как воспользоваться ф-цией isKeyDown() класса KeyController (описан выше) ? Я создаю отдельный класс KeyController.as, записываю его туда же, куда и основной класс. В основном классе пишу import KeyController; потом в одной из ф-ций основного класса пишу и так trace (isKeyDown(48)); и так trace (KeyController.isKeyDown(48)) - не работает. "Call to a possibly undefined method isKeyDown" . Да и на сам класс KeyController никакой реакции, пишу там что попало - ошибок не выдает. Как его подключить?
__________________
Платон мне друг, но истина в вине.


Последний раз редактировалось sinya; 03.12.2008 в 19:54.
Старый 03.12.2008, 20:24
musat вне форума Посмотреть профиль Отправить личное сообщение для musat Найти все сообщения от musat
  № 10  
Ответить с цитированием
musat
 
Аватар для musat

Регистрация: Jul 2007
Адрес: Дубна, Моск.обл.
Сообщений: 108
sinya
Надо создать экземпляр класса и передать ссылку на stage:
Код AS3:
var keyController:KeyController = new KeyController(stage);
trace(keyController.isKeyDown(48));

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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