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

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

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

Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
Thumbs down Дёрганное перемещение по точкам.

Сделал старым дедовским способом перемещение по массиву точек. Но на каждой точке объект почему-то подтормаживается и движение получается дёрганым. Проверял FPS, всё норм.

Вот собственно функция перемещения (по событию ENTER_FRAME):
Код AS3:
private function moveMonster(event:Event):void
{
	if(distToCurPt() > thres)
	{
		this.x += xVel;
		this.y += yVel;
	}
	else
	{
		if(tgPoint < pathArray.length-1)
		{
			tgPoint+=1;
			var dir:Number = Math.atan2(pathArray[tgPoint].y - this.y,pathArray[tgPoint].x - this.x);
 
			xVel = Math.cos(dir)*speed;
			yVel = Math.sin(dir)*speed;
			this.rotation = dir/Math.PI*180;
		}
		else
		{
			removeEventListener(Event.ENTER_FRAME, moveMonster);
		}
	}
}
Вот то, как это выглядит: http://megaswf.com/serve/1377010
В чём может быть причина?


Последний раз редактировалось Parez; 27.11.2011 в 23:42.
Старый 28.11.2011, 00:14
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 2  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Код AS3:
if(distToCurPt() > thres)
Что это такое?
Такое впечатление что она двигается не каждый кадр, а через один-два кадра. (чтобы понять нужно увидеть процедуру distToCurPt() )

Если это действительно так то нужно пересмотреть логику так чтобы объект двигался каждый кадр в любом случае, а вот расстояние варьировалось при надобности.

Добавлено через 49 секунд
Или точек добавить.
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
Вот функция distToCurPt (вычисляет расстояние от текущего положения до целевой точки):
Код AS3:
private function distToCurPt():Number
{
	var dist:Number = Point.distance(new Point(this.x,this.y),pathArray[tgPoint]);
	return dist;
}
thres - погрешность. То есть скорость/2.

Цитата:
Или точек добавить.
Если добавить точек, всё будет выглядеть ещё печальнее...

И да, если попробовать нарисовать просто длинную прямую линию, движение будет гладким. Торможение происходит только на поворотах...


Последний раз редактировалось Parez; 28.11.2011 в 00:27.
Старый 28.11.2011, 00:28
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 4  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Торможение происходит только на поворотах...
Это потому что у вас происходит выбор: ИЛИ движение ИЛИ поворот.
Следует не разделять это а делать одновременно. Потому что там где есть поворот не происходит движение и объект затормаживает для того чтобы повернуться.

Но погрешности появятся я думаю. Он углы срезать начнет и в таком духе, но думаю это не критично.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 28.11.2011, 00:44
Parez вне форума Посмотреть профиль Отправить личное сообщение для Parez Найти все сообщения от Parez
  № 5  
Ответить с цитированием
Parez

Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
О, спасибо большое. Я как-то об этом даже не подумал. Дописал две строчки:

Код AS3:
private function moveMonster(event:Event):void
{
	if(distToCurPt() > thres)
	{
		this.x += xVel;
		this.y += yVel;
	}
	else
	{
		if(tgPoint < pathArray.length-1)
		{
			tgPoint+=1;
			var dir:Number = Math.atan2(pathArray[tgPoint].y - this.y,pathArray[tgPoint].x - this.x);
 
			xVel = Math.cos(dir)*speed;
			yVel = Math.sin(dir)*speed;
			this.rotation = dir/Math.PI*180;
 
                        //Вот эти заветные 2 строчки:
                        this.x += xVel;
			this.y += yVel;
		}
		else
		{
			removeEventListener(Event.ENTER_FRAME, moveMonster);
		}
	}
}
И теперь без всяких тормозов, да и углы не срезает, т.к. перемещение происходит уже после изменения направления)

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Убери верхнее условие вообще. Оно никакого функционала не несет теперь.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 28.11.2011, 01:03
Parez вне форума Посмотреть профиль Отправить личное сообщение для Parez Найти все сообщения от Parez
  № 7  
Ответить с цитированием
Parez

Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
Не скажите... Можно разве что изменить немного структуру if/then/else, но суть от этого не изменится.
Код AS3:
private function moveMonster(event:Event):void
{
	if(distToCurPt() < thres)
	{
		if(tgPoint < pathArray.length-1)
		{
			tgPoint+=1;
			var dir:Number = Math.atan2(pathArray[tgPoint].y - this.y,pathArray[tgPoint].x - this.x);
 
			xVel = Math.cos(dir)*speed;
			yVel = Math.sin(dir)*speed;
			this.rotation = dir/Math.PI*180;
 
		}
		else
		{
			removeEventListener(Event.ENTER_FRAME, moveMonster);
		}
	}
        this.x += xVel;
	this.y += yVel;
}
Вы это имели в виду?

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
примерно так
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

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

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


 


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


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