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

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

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

Регистрация: May 2013
Сообщений: 34
По умолчанию Почему объект ускоряется?

Здравствуйте. Есть код:
Код AS3:
package 
{
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
	import flash.utils.*;
	import flash.net.*;
	import flash.media.*;
	import flash.geom.*;
 
	public class list extends Sprite
	{
		public function list()
		{
			var list_new1:MiniList_new1 = new MiniList_new1();
			var list_new2:MiniList_new2 = new MiniList_new2();
			var list_new3:MiniList_new3 = new MiniList_new3();
			var list_new4:MiniList_new4 = new MiniList_new4();
			var list_new5:MiniList_new5 = new MiniList_new5();
			addChild(list_new1);
			list_new1.y = 0;
			addChild(list_new2);
			list_new2.y = 778.5;
			addChild(list_new3);
			list_new3.y = 1557;
			addChild(list_new4);
			list_new4.y = 2335.5;
			addChild(list_new5);
			list_new5.y = 3114;
		}
	}
}
Код AS3:
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;
import flash.net.*;
import flash.media.*;
import list;
var l:Boolean = false;
var mcList:list = new list();
var mouse_y:int;
var speed:Number = 0;
var dd:Number = new Number();
mcList.x = stage.stageWidth / 2;
mcList.y = 450;
addChild(mcList);
stage.addEventListener(Event.ENTER_FRAME, _enterFrame);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mcListDown);
stage.addEventListener(MouseEvent.MOUSE_UP, mcListUp);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mcListMove);
function _enterFrame(e:Event)
{
	if (mcList.y > 895)
	{
		mcList.y = 895;
	}
	if (mcList.y < -3088)
	{
		mcList.y = -3088;
	}
}
function mcListDown(e:MouseEvent)
{
	l = true;
}
function mcListUp(e:MouseEvent)
{
	l = false;
	for (var d:int = 0; d < 5; d++)
	{
 
		if (mcList.y > (450 + (-779 * d)) - 450 && mcList.y < (450 + (-779 * d)) + 450)
		{
			speed = 0;
			if (mcList.y < 450 + (-779 * d))
			{
				speed = 20;
			}
			if (mcList.y > 450 + (-779 * d))
			{
				speed = -20;
			}
			dd = d;
			stage.addEventListener(Event.ENTER_FRAME, _enterFrame);
			function _enterFrame(e:Event)
			{
				mcList.y +=  speed;
				if (speed == 20)
				{
					if (mcList.y > 450 + (-779 * dd))
					{
						speed = 0;
						mcList.y = 450 + (-779 * dd);
					}
				}
				if (speed == -20)
				{
					if (mcList.y < 450 + (-779 * dd))
					{
						speed = 0;
						mcList.y = 450 + (-779 * dd);
					}
				}
			}
		}
	}
}
function mcListMove(e:MouseEvent)
{
	if (l == true)
	{
		mcList.y +=  stage.mouseY - mouse_y;
	}
	mouse_y = stage.mouseY;
	e.updateAfterEvent();
}
Здесь на сцену добавляются 5 квадратов 745х745. Реализовывается перетаскивание контейнера в котором они находятся и квадрат который находится ближе всех к центру двигается к центру(то есть контейнер двигается так что бы нужный квадрат находился по центру).
Но вот в чём проблема здесь скорость движения 20 пикселей, но потом (через несколько перемещений) они ускоряются и перемещаются мнгновенно. Я не могу понять почему. Помогите.
Вложения
Тип файла: rar Исходники.rar (2.70 Мб, 12 просмотров)

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Исходник не смотрел, по коду скажу:
1. Зачем называть функции одинаково? Сами не путаетесь?
2. У Вас две подписки на ENTER_FRAME и ни одной отписки.
3. Вторая функция _enterFrame вложенная. Когда условие выполняется, происходит подписка с этим обработчиком, и он будет выполняться каждый кадр по крайней мере, пока существует объект. Параллельно с другой функцией _enterFrame. Вам правда так нужно? И Вы уверены, что подписали именно этот вложенный обработчик, а не тот что на уровне класса? Зачем усложнять себе жизнь?
__________________
Reality.getBounds(this);

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

Регистрация: May 2013
Сообщений: 34
Wolsh, спасибо! Сделал вот так:
Код AS3:
package 
{
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
	import flash.utils.*;
	import flash.net.*;
	import flash.media.*;
	import flash.geom.*;
 
	public class list extends Sprite
	{
		public function list()
		{
			var list_new1:MiniList_new1 = new MiniList_new1();
			var list_new2:MiniList_new2 = new MiniList_new2();
			var list_new3:MiniList_new3 = new MiniList_new3();
			var list_new4:MiniList_new4 = new MiniList_new4();
			var list_new5:MiniList_new5 = new MiniList_new5();
			addChild(list_new1);
			list_new1.y = 0;
			addChild(list_new2);
			list_new2.y = 778.5;
			addChild(list_new3);
			list_new3.y = 1557;
			addChild(list_new4);
			list_new4.y = 2335.5;
			addChild(list_new5);
			list_new5.y = 3114;
		}
	}
}
Код AS3:
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;
import flash.net.*;
import flash.media.*;
import list;
var timer:Timer = new Timer(1);
var l:Boolean = false;
var mcList:list = new list();
var mouse_y:int;
var speed:Number = 0;
var dd:Number = new Number();
mcList.x = stage.stageWidth / 2;
mcList.y = 450;
addChild(mcList);
stage.addEventListener(Event.ENTER_FRAME, _enterFrame);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mcListDown);
stage.addEventListener(MouseEvent.MOUSE_UP, mcListUp);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mcListMove);
function _enterFrame(e:Event)
{
	if (mcList.y > 895)
	{
		mcList.y = 895;
	}
	if (mcList.y < -3088)
	{
		mcList.y = -3088;
	}
	mcList.y +=  speed;
	if (speed == 20)
	{
		if (mcList.y > 450 + (-779 * dd))
		{
			speed = 0;
			mcList.y = 450 + (-779 * dd);
		}
	}
	if (speed == -20)
	{
		if (mcList.y < 450 + (-779 * dd))
		{
			speed = 0;
			mcList.y = 450 + (-779 * dd);
		}
	}
}
function mcListDown(e:MouseEvent)
{
	l = true;
}
function mcListUp(e:MouseEvent)
{
	l = false;
	for (var d:int = 0; d < 5; d++)
	{
 
		if (mcList.y > (450 + (-779 * d)) - 450 && mcList.y < (450 + (-779 * d)) + 450)
		{
			speed = 0;
			if (mcList.y < 450 + (-779 * d))
			{
				speed = 20;
			}
			if (mcList.y > 450 + (-779 * d))
			{
				speed = -20;
			}
			dd = d;
		}
	}
	timer.start();
}
function mcListMove(e:MouseEvent)
{
	if (l == true)
	{
		mcList.y +=  stage.mouseY - mouse_y;
	}
	mouse_y = stage.mouseY;
	e.updateAfterEvent();
}
Теперь всё нормально работает!

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

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

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


 


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


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