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

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

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

Регистрация: Oct 2009
Сообщений: 52
Wolsh, сейчас попробую то что вы написали, наверное, это именно то, что мне и нужно было. Попозже напишу: получилось или нет!

Добавлено через 12 минут
Только что протестил, конечно в одном вопросе-это мне помогло, но тот который я задавал, остался не решённым. Попробую грамотней изъяснить суть проблемы. Я написал код передвижения объекта. Код работает, но когда зажимаешь клавишу(по нажатию которой, движется объект). Изначально он перемещается на то количество пикселей, которое указано, а через пару секунд начинает двигаться непрерывно. А мне нужно, что бы он всегда двигался непрерывно(если это возможно!)

Старый 19.08.2012, 14:29
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 22  
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
В обработчике нажатия клавиши вы должны только выставить флаг "Нажата клавиша X" и все. Движение должно происходить отдельно в обработчике ENTER_FRAME или событий таймера, не важно. То что у вас происходит на данный момент связано с особенностями работы клавиатуры. Сперва возникает одиночное событие нажатия клавиши, а через определенное время (зависит от настроек драйвера в ОС) начинается его повтор.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 19.08.2012, 14:54
Nace вне форума Посмотреть профиль Отправить личное сообщение для Nace Найти все сообщения от Nace
  № 23  
Nace

Регистрация: Oct 2009
Сообщений: 52
Спасибо большое, это очень дельный совет, я попозже немного попробую, если получиться, то буду вам очень благодарен

Старый 19.08.2012, 15:23
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 24  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
 
	public class Main extends Sprite 
	{
		private var _auto:Sprite;
		private var _keyW:Boolean = false;
		private var _keyS:Boolean = false;
		private var _keyA:Boolean = false;
		private var _keyD:Boolean = false;
		private var _speed:Number = 2;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			//// рисуем "машинку"
			_auto = new Sprite();
			_auto.graphics.beginFill(0x666666);
			_auto.graphics.drawRoundRectComplex(0, 0, 50, 100, 10, 10, 0, 0);
			this.addChild(_auto);
			_auto.x = 250;
			_auto.y = 250;
			//// слушатели клавиатуры
			this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
			this.stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
			//// слушатель ентерфрейм
			this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
 
		private function enterFrameHandler(event:Event):void 
		{
			if (_keyA) _auto.x -= _speed;
			if (_keyD) _auto.x += _speed;
			if (_keyW) _auto.y -= _speed;
			if (_keyS) _auto.y += _speed;
		}
 
		private function keyUpHandler(event:KeyboardEvent):void 
		{
			switch(event.keyCode)
			{
				case Keyboard.W : _keyW = false;
				break;
				case Keyboard.S : _keyS = false;
				break;
				case Keyboard.A : _keyA = false;
				break;
				case Keyboard.D : _keyD = false;
				break;
			}
		}
 
		private function keyDownHandler(event:KeyboardEvent):void 
		{
			switch(event.keyCode)
			{
				case Keyboard.W : _keyW = true;
				break;
				case Keyboard.S : _keyS = true;
				break;
				case Keyboard.A : _keyA = true;
				break;
				case Keyboard.D : _keyD = true;
				break;
			}
		}
	}
}
__________________
Reality.getBounds(this);

Старый 19.08.2012, 15:38
Nace вне форума Посмотреть профиль Отправить личное сообщение для Nace Найти все сообщения от Nace
  № 25  
Nace

Регистрация: Oct 2009
Сообщений: 52
Wolsh спасибо, но я это уже понял. Но у меня возникла ещё одна проблема, у вас в коде используеться под кнопки 4 переменных, а представте их будет больше?? Тогда ваш код увеличиться в разы, и я, поэтому решил вводить в одну переменную разные значения. Создать переменную у меня не составило труда, а обратиться не знаю как!? Если вам не трудно подскажите.

Добавлено через 5 минут
Всё, я уже разобрался, всем спасибо) Больше пока нету вопросов)

Старый 19.08.2012, 15:49
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 26  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну, мой-то вряд ли увеличится))) Скорее уменьшится:
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
 
	public class Main extends Sprite 
	{
		private var _auto:Sprite;
		private var _keys:Vector.<Boolean> = new Vector.<Boolean>(256);
		private var _speed:Number = 2;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			//// рисуем "машинку"
			_auto = new Sprite();
			_auto.graphics.beginFill(0x666666);
			_auto.graphics.drawRoundRectComplex(0, 0, 50, 100, 10, 10, 0, 0);
			this.addChild(_auto);
			_auto.x = 250;
			_auto.y = 250;
			//// слушатели клавиатуры
			this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
			this.stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
			//// слушатель ентерфрейм
			this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
 
		private function enterFrameHandler(event:Event):void 
		{
			if (_keys[Keyboard.A]) _auto.x -= _speed;
			if (_keys[Keyboard.D]) _auto.x += _speed;
			if (_keys[Keyboard.W]) _auto.y -= _speed;
			if (_keys[Keyboard.S]) _auto.y += _speed;
		}
 
		private function keyUpHandler(event:KeyboardEvent):void 
		{
			_keys[event.keyCode] = false;
		}
 
		private function keyDownHandler(event:KeyboardEvent):void 
		{
			_keys[event.keyCode] = true;
		}
	}
}
__________________
Reality.getBounds(this);

Старый 19.08.2012, 15:54
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 27  
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Но у меня возникла ещё одна проблема, у вас в коде используеться под кнопки 4 переменных, а представте их будет больше??
Wolsh слегка утрировал. Вместо имени клавиши следует использовать имя действия. Например _moveUP вместо _keyW. Тогда, в случае когда для одного действия может использоваться несколько клавиш, достаточно будет просто добавить еще одно условие в switch, не теряя в логичности кода.
Код AS3:
switch(event.keyCode)
{
	case Keyboard.UP :
	case Keyboard.W : _moveUP = false;
	break;
	case Keyboard.DOWN :
	case Keyboard.S : _moveDown = false;
	break;
	case Keyboard.LEFT :
	case Keyboard.A : _moveLeft = false;
	break;
	case Keyboard.RIGHT :
	case Keyboard.D : _moveRight = false;
	break;
}
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 19.08.2012, 16:09
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 28  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Да я просто мысль пытался донести)) Словами не получается, значит кодом. Кроме того, автор упрямо скрывает детали задачи, отчего у нас уже три страницы на тему "как двигать квадратик". Вот теперь появилось "много клавиш", причем я это понимаю как "много клавиш для разных действий", а alatar — как много клавиш для тех же четырех действий. Я таки считаю что лучше хранить "слепок" клавиатуры в массиве или векторе, а логику движения разбирать там, где надо — в обработчике ентерфрейма. То есть проверка расширится, только и всего:
Код AS3:
private function enterFrameHandler(event:Event):void 
{
	if (_keys[Keyboard.A] || _keys[Keyboard.LEFT]) _auto.x -= _speed;
	if (_keys[Keyboard.D] || _keys[Keyboard.RIGHT]) _auto.x += _speed;
	if (_keys[Keyboard.W] || _keys[Keyboard.UP]) _auto.y -= _speed;
	if (_keys[Keyboard.S] || _keys[Keyboard.DOWN]) _auto.y += _speed;
}
__________________
Reality.getBounds(this);

Старый 19.08.2012, 17:26
Nace вне форума Посмотреть профиль Отправить личное сообщение для Nace Найти все сообщения от Nace
  № 29  
Nace

Регистрация: Oct 2009
Сообщений: 52
Спасибо вам всем, главное, я разобрался со своей проблемой. А то что вы написали про клавиши, немного не удобно. Не проще присваивать переменной значение клавиши, а дальше делать проверку?

Добавлено через 2 минуты
А да, я давно хотел спросить, а :void для чего писать нужно?

Старый 19.08.2012, 17:31
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 30  
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Зависит от конкретной задачи. В общем случае следует абстрагировать устройства ввода от команд, т.к. сегодня это клавиатура с мышью, а завтра тачскрин.

Добавлено через 3 минуты
Цитата:
А да, я давно хотел спросить, а :void для чего писать нужно?
Что бы указать, что функция не возвращает никакого значения.
__________________
משיח לא בא
משיח גם לא מטלפן

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

Теги
addeventlistener
Опции темы
Опции просмотра

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

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


 


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


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