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

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

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

Регистрация: Dec 2011
Сообщений: 70
По умолчанию Проверка "видимости" объекта

Здравствуйте.
У меня есть сцена, на которой содержится много препятствий неправильной формы. Препятствия считаются непрозрачными. По сцене летает корабль, а в определенном месте сцены стоит пушка. Хочу сделать так, чтобы пушка стреляла только тогда, когда корабль и пушка находятся на прямой видимости (то есть прямой отрезок, соединяющий корабль и пушку, не пересечется ни с одним из препятствий). Можно ли такое сделать и если можно, то как?
Пока что придумал только такое решение: конвертировать препятствия в BitmapData, нарисовать линию (с прозрачностью 1%) между кораблем и пушкой и её тоже конвертировать в BitmapData, а потом использовать bitmapData.hitTest c порогом 1. Надеюсь, что есть более быстрый и менее извращенный вариант.

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Можно по двум точкам найти уравнение прямой, соединяющей пушку и игрока.
и проверить простым хиттестом столкновение этой прямой с баундинг боксом препятствий

Насчет проверки столкновения линии (по уравнению) и баундинг бокса объекта еще надо подумать

Старый 05.03.2013, 13:19
Александр Мостовой вне форума Посмотреть профиль Отправить личное сообщение для Александр Мостовой Посетить домашнюю страницу Александр Мостовой Найти все сообщения от Александр Мостовой
  № 3  
Ответить с цитированием
Александр Мостовой
 
Аватар для Александр Мостовой

Регистрация: Sep 2001
Адрес: Харьков
Сообщений: 305
Отправить сообщение для Александр Мостовой с помощью ICQ Отправить сообщение для Александр Мостовой с помощью Skype™
Уравнение прямой проходящей через 2 точки
A(x2 -x2) + B(y2- y1) = 0
У вас есть:
1. уравнение прямой
2. Координаты точек вершин многоугольника
из них не сложно получить уравнение строн прмоугольника.
Для того что бы найти пересекаются ли прямые нужно приравнять 2 уравнения прямой
A1(x2 -x2) + B1(y2- y1) = A2(xi -xj) + B2(yi- yj)
3. Находите точки пересечения каждой из сторон прямоугольника и проверяете что бы эта точка попадала в на отрезок прямой входящий в сторну многоугольника (т.е между вершинами, а не где-то в бесконечности)
4. Проделываете это для каждой стороны и как-только встречаете пересечение выходите из цикла



Если у вас случай где прямая горизонтальна, то все просто: смотрите что бы у координата была между верхней и нижней точкой многоугольника.
__________________
...

Старый 05.03.2013, 13:25
RigidFlasher вне форума Посмотреть профиль Отправить личное сообщение для RigidFlasher Найти все сообщения от RigidFlasher
  № 4  
Ответить с цитированием
RigidFlasher

Регистрация: Dec 2011
Сообщений: 70
Цитата:
Можно по двум точкам найти уравнение прямой, соединяющей пушку и игрока.
и проверить простым хиттестом столкновение этой прямой с баундинг боксом препятствий
Не совсем понял, зачем для HitTest именно уравнение прямой, на которой лежит отрезок. Я почему-то думал, что достаточно просто знать точку начала и точку конца отрезка.
В любом случае, такой вариант скорее всего не подойдет. Потому что будет очень много случаев, когда отрезок пересечет контейнер, но не пересечет само препятствие. Как я понимаю, я предложил очень похожее решение, которое более точное и менее производительное за счет использования BitmapData.

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Да, этот случай подходит, если препятствия представляют собой прямоугольники. Собственно, я и думал, что препятствия это прямоугольники, так как вы не указали ничего более конкретного)

В гугле кстати очень много результатов на запрос
Цитата:
as3 line of sight
Вот один из них, проблема очень похожа на вашу
http://stackoverflow.com/questions/7...hittest-object

Старый 05.03.2013, 13:37
RigidFlasher вне форума Посмотреть профиль Отправить личное сообщение для RigidFlasher Найти все сообщения от RigidFlasher
  № 6  
Ответить с цитированием
RigidFlasher

Регистрация: Dec 2011
Сообщений: 70
Цитата:
У вас есть:
2. Координаты точек вершин многоугольника
Я обязательно бы так и сделал, если бы препятствия были многоугольниками с известными координатами точек. Но препятствия нарисованы при помощи гладких кривых во FlashProfessional. Восстановить уравнение кривой Безье, из которой состоят фигуры, а потом проверить пересечение отрезка и кривой Безье - довольно трудоемкая задача. Думаю, что вариант, описанный мной в первом посте, все-таки немного проще.

Добавлено через 12 минут
Цитата:
Вот один из них, проблема очень похожа на вашу
http://stackoverflow.com/questions/7...hittest-object
Как я понял, тут тоже все основано на геометрических проверках, поэтому не подойдет.

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Вот это посмотрите, там есть алгоритмы и реализация на Haxe. Haxe, насколько я знаю, можно компилировать в AS3 и посмотреть

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

Регистрация: Dec 2011
Сообщений: 70
Цитата:
Вот это посмотрите, там есть алгоритмы и реализация на Haxe. Haxe, насколько я знаю, можно компилировать в AS3 и посмотреть
Спасибо, хорошая статья. Правда, в ней не рассмотрено в точности то, что мне нужно. Тут тоже работа с отрезками, координаты которых мне неизвестны. Пожалуй, попробую рассмотреть баундинг боксы вместо самих препятствий. Если это не будет сильно бросаться в глаза, то так и оставлю. Иначе придется делать свой вариант, опять же.

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

Регистрация: Sep 2001
Адрес: Харьков
Сообщений: 305
Отправить сообщение для Александр Мостовой с помощью ICQ Отправить сообщение для Александр Мостовой с помощью Skype™
Цитата:
Я обязательно бы так и сделал, если бы препятствия были многоугольниками с известными координатами точек. Но препятствия нарисованы при помощи гладких кривых во FlashProfessional. Восстановить уравнение кривой Безье, из которой состоят фигуры, а потом проверить пересечение отрезка и кривой Безье - довольно трудоемкая задача. Думаю, что вариант, описанный мной в первом посте, все-таки немного проще.
hitTest не очень хорошая штука как для производительности, так и для надежности. Он может проскакивать между кадрами при высокой скорости.
Самое простое это к графике со сложной формой добавить невидимые точки апроксиммировав линию в прямоугольник (вручную раставить на сцене спрайтики кружочки или алгоритмом)
__________________
...

Старый 05.03.2013, 16:04
RigidFlasher вне форума Посмотреть профиль Отправить личное сообщение для RigidFlasher Найти все сообщения от RigidFlasher
  № 10  
Ответить с цитированием
RigidFlasher

Регистрация: Dec 2011
Сообщений: 70
Цитата:
hitTest не очень хорошая штука как для производительности, так и для надежности. Он может проскакивать между кадрами при высокой скорости.
Самое простое это к графике со сложной формой добавить невидимые точки апроксиммировав линию в прямоугольник (вручную раставить на сцене спрайтики кружочки или алгоритмом)
Ясно. Спасибо за совет.
В любом случае, готовых решений "из коробки" нет, как я понимаю, поэтому придется пробовать разные варианты и искать определенный компромисс между сложностью решения и его точностью.

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

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

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


 


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


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