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

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

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

Регистрация: Apr 2010
Сообщений: 27
По умолчанию столкновение объектов через радиус и расстояние

рисую круг делаю из него мувиклип с именем mc, засовываю в него круг (мувиклип)с меньшим радиусом с именем head. надо чтоб мувиклип ball(круг) сталкивался с mc.head.
Код AS3:
var Radiusball:Number = ball.width/2;//радиус ball
var Radiusmc:Number = mc.head.width/2;//Радиус head
 
var distance:Number = Math.sqrt(Math.pow(mc.head.x - ball.x,2) + Math.pow(mc.head.y - ball.y, 2));//расстояние между объектами
addEventListener(Event.ENTER_FRAME, go)
function go(e:Event):void
{
ball.y +=10;
if (Radiusmc+Radiusball >= distance)
{
 trace("all right");
}
}
не пойму почему не работает, пробовал делать так с mc - получается, а если с mc.head то не выходит
решил сделать не через hitTestObject.
вопрос вообще отличие будет видно в анимации между hitTestObject и таким методом?

Старый 30.01.2011, 15:55
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Как-то так.
Код AS3:
private var radiusCollision:int = 15;
...
private function go(e:Event):void {
	var dx:Number = ball.x - mc.head.x - mc.x;
	var dy:Number = ball.y - mc.head.y - mc.y;
	if (Math.sqrt(dx*dx + dy*dy) > radiusCollision) ball.y += 10;
	else trace("collision!");
}
Цитата:
вопрос вообще отличие будет видно в анимации между hitTestObject и таким методом?
hitTestObject, по идее кушает больше ресурсов, чем оптимизированная математическая логика.
__________________
тут я


Последний раз редактировалось КорДум; 30.01.2011 в 15:57.
Старый 30.01.2011, 15:56
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 3  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Сначала немного общих рекомендаций:

1. не используй pow для возведения в квадрат — только умножение
2. не вычисляй каждый раз корень — посчитай в самом начале сумму Radiusmc+Radiusball уже в квадрате

Что до твоего примера, то ball и mc имеют глобальные координаты (поэтому все работает), а head имеет координаты в контексте мувика mc, т.е. не глобальные. Можешь использовать localToGlobal, а можешь просто суммировать координаты mc и head.
__________________
Поймай яблоко 2!


Последний раз редактировалось Zebestov; 30.01.2011 в 15:58.
Старый 30.01.2011, 15:59
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
Что до твоего примера, то ball и mc имеют глобальные координаты (поэтому все работает), а head имеет координаты в контексте мувика mc, т.е. не глобальные. Чтобы не заморачиваться с localToGlobal, просто суммируй координаты mc и head.
Да, Zebestov прав, подправил свой пост. Сделайте тут тестовый компилятор, прям на форуме, а то коленка нередко подводит
__________________
тут я

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

Регистрация: Apr 2010
Сообщений: 27
спасибо все понял. hitTestObject требует больше ресурсов, т.е. лучше его обходить если возможно? или это не значительно?

Старый 30.01.2011, 16:19
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 6  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Если я себе правильно представляю работу hitTestObject, то он берет пересечение bounding box обоих мувиков и потом проходит по растрам этого результирующего прямоугольника в обоих изображениях до первого alpha1&&alpha2==true. При таком раскладе как ни крути — это просто ППЦ во сколько раз дольше твоей проверки.

Если же я ошибаюсь на предмет работы hitTestObject — вычеркните из памяти весь бред, что я написал выше )

P.S.
но в любом случае — hitTestObject дольше
__________________
Поймай яблоко 2!

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Код AS3:
if (Point.distance(new Point(ball.x, ball.y), new Point(ball2.x, ball2.y)) <= radiusCollision) {}
__________________
Reality.getBounds(this);

Старый 30.01.2011, 16:56
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 8  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Wolsh, очень компактно, но опять же — каждый раз корень считать.
__________________
Поймай яблоко 2!

Старый 30.01.2011, 17:35
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 9  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Это еще хуже - придется создавать 2 объекта Point, хоть они и легкие но это в разы дроже,
чем даже посчитать корень


Последний раз редактировалось expl; 30.01.2011 в 17:37.
Старый 30.01.2011, 20:13
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 10  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Да, с distance аж в 10 раз медленней, чем код, приведенный КорДумом. (143 vs 15)

Добавлено через 11 минут
А если корень вообще не вычислять, т.е. сравнивать заранее посчитанный квадрат radiusCollision с (dx*dx + dy*dy), то скорость выше еще в 1.5-2 раза.
__________________
Reality.getBounds(this);

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

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

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


 


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


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