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

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

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

Регистрация: Mar 2009
Сообщений: 30
Question Запоздалая реакция на MouseEvent.CLICK

Приветствую всех, кто заглянул в эту тему!

В стадии написания довольно шустрой игры обнаружил, что реакция на MouseEvent.CLICK слегка замедленна.
Для проверки написал обычный класс, в котором квадрат движется из стороны в сторону с шагом 10 раз в секунду. Если кликнуть в любом месте мышкой, то по идеи квадрат должен остановиться. Проблема в том, что квадрат продолжает двигаться дальше еще 1-3 шага. Есть ли выход из подобной ситуации?


Код AS3:
package {
 
	import flash.display.*;
	import flash.events.*;
	import flash.utils.*;
 
	public class Test extends Sprite {
 
		private var obj:Sprite;
		private var timer:Timer;
		private var flag:int = 0;
 
		public function Test () :void {
 
			addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
		}
 
		private function addedToStageListener(e:Event) :void {
			removeEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
 
			stage.scaleMode = "noScale";
			stage.align 	= "TL";
			stage.frameRate = 100;
 
			obj = new Sprite();
			obj.graphics.beginFill(0xFF0000);
			obj.graphics.drawRoundRect(0, 0, 25, 25, 10);
 
			addChild(obj);
 
			stage.addEventListener(MouseEvent.CLICK, start);
		}
 
		private function start (e:MouseEvent) :void {
			stage.removeEventListener(MouseEvent.CLICK, start);
			stage.addEventListener(MouseEvent.CLICK, stop);
 
			timer = new Timer(100, 0);
			timer.addEventListener(TimerEvent.TIMER, move);
			timer.start();
		}
 
		private function stop (e:MouseEvent) :void {
			timer.stop();
			timer.removeEventListener(TimerEvent.TIMER, move);
 
			stage.removeEventListener(MouseEvent.CLICK, stop);
			stage.addEventListener(MouseEvent.CLICK, start);
		}
 
		private function move (e:TimerEvent) :void {
			switch(flag) {
 
				case 0:
					if (obj.x >= 250) {
						obj.x -= obj.width;
						flag = 1;
					} else {
						obj.x += obj.width;
					}
					break;
				case 1:
					if (obj.x == 0) {
						obj.x += obj.width;
						flag = 0;
					} else {
						obj.x -= obj.width;
					}
					break;
			}
		}
	}
}

Старый 24.09.2011, 20:03
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
MouseEvent.CLICK - это нажатие и отжатие клавиши мыши. А между этими событиями проходит время, поэтому вам и кажется, что объект двигается после вызова stop, хотя он сработает только после того, как вы мышь отпустите.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 24.09.2011, 20:13
ded100let вне форума Посмотреть профиль Отправить личное сообщение для ded100let Найти все сообщения от ded100let
  № 3  
Ответить с цитированием
ded100let

Регистрация: Mar 2009
Сообщений: 30
пробую MouseEvent.CLICK.MOUSE_DOWN и результат тот же. Неужели нельзя осуществить мгновенную остановку?

Старый 24.09.2011, 20:15
stweet вне форума Посмотреть профиль Отправить личное сообщение для stweet Найти все сообщения от stweet
  № 4  
Ответить с цитированием
stweet
 
Аватар для stweet

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Ну да, в подобных случаях лучше использовать MouseEvent.MOUSE_DOWN.

Добавлено через 50 секунд
Цитата:
Сообщение от ded100let Посмотреть сообщение
MouseEvent.CLICK.MOUSE_DOWN
это где этому учат???
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 24.09.2011, 20:24
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 5  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
это где этому учат???
Очевидно же, что имелось в виду это: MouseEvent.CLICK / MOUSE_DOWN

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

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Цитата:
Сообщение от goodguy Посмотреть сообщение
MouseEvent.CLICK / MOUSE_DOWN
Извиняюсь за плавный переход на флуд но и такая манера написания меня пугает.

ded100let Что увидеть результат быстродействия кликов, измените делай на 5-10 а движение прибавляйте по 1-2 px и желательно в приёмник TimerEvent добавьте e.updateAfterEvent(); в конец блока.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 24.09.2011, 20:49
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 7  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от stweet Посмотреть сообщение
Что увидеть результат быстродействия кликов, измените делай на 5-10 а движение прибавляйте по 1-2 px и желательно в приёмник TimerEvent добавьте e.updateAfterEvent(); в конец блока.
Зачем? Два трейса в stop и move будет достаточно.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 24.09.2011, 20:55
ded100let вне форума Посмотреть профиль Отправить личное сообщение для ded100let Найти все сообщения от ded100let
  № 8  
Ответить с цитированием
ded100let

Регистрация: Mar 2009
Сообщений: 30
да, имелось ввиду MouseEvent.MOUSE_DOWN.

stweet, после изменения delay на 10 меняется скорость движения квадрата и количество шагов после нажатия кнопки мыши. Явного быстродействия не наблюдается. Квадрат не останавливается после клика мгновенно

Интересен тот факт, что в приемнике TimerEvent прописывал trace(время в миллисекундах) и в приемнике MouseEvent.MOUSE_DOWN тоже самое. В конечном итоге время в приемнике MouseEvent больше, чем в приемнике TimerEvent, но глазами я вижу, что передвижение квадрата еще осуществляется после нажатия кнопки.

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

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Цитата:
Сообщение от ded100let Посмотреть сообщение
да, имелось ввиду MouseEvent.MOUSE_DOWN.

stweet, после изменения delay на 10 меняется скорость движения квадрата и количество шагов после нажатия кнопки мыши. Явного быстродействия не наблюдается. Квадрат не останавливается после клика мгновенно

Интересен тот факт, что в приемнике TimerEvent прописывал trace(время в миллисекундах) и в приемнике MouseEvent.MOUSE_DOWN тоже самое. В конечном итоге время в приемнике MouseEvent больше, чем в приемнике TimerEvent, но глазами я вижу, что передвижение квадрата еще осуществляется после нажатия кнопки.
Вы хоть понимаете для чего делай и как он работает в таймере?
У вас и будит объект плавать т.к. расстояние между операциями у вас 100 - одна десятая секунды и шаг передвижения в ширину объекта.

Код AS3:
package  
{
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
 
	public class BoxMove extends Sprite 
	{
 
		public function BoxMove() 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// startup
 
			var setSide:Boolean = false;
 
			var timer:Timer  = new Timer(2);
				timer.addEventListener(TimerEvent.TIMER,
				function (e:TimerEvent):void {
					if (numChildren != 0) stage.getChildAt(0).x += 5;
				});
 
			stage.addEventListener(MouseEvent.MOUSE_DOWN,
			function (e:MouseEvent):void {
				if (setSide) timer.start();
				else timer.stop();
				setSide = !setSide;
			});
 
			addBoxToStage(50, 50);
 
			stage.getChildAt(0).x = 100;
			stage.getChildAt(0).y = 100;
		}
 
 
		private function addBoxToStage (w:int, h:int):void
		{
			var shape:Shape = new Shape();
				shape.graphics.beginFill(0, .5);
				shape.graphics.drawRect( -w / 2, -h / 2, w, h);
				shape.graphics.endFill();
			addChild(shape);
		}
	}
 
}
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 24.09.2011, 20:30
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 10  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
С MOUSE_DOWN все работает как надо.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

Теги
MouseEvent.CLICK , TimerEvent.TIMER

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

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


 


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


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