![]() |
Пересечение 2 заранее неизвестных объектов
Привет всем!
Вобщем ситуация такая : Я создаю игру, где мне нужно проверять пересечение 2 объектов - пули с именем "gun"+gun_number где gun_number всегда меняется, и "enemy"+i где i тоже переменная. Как мне проверить их пересечение????? Единственное что я придумал - это проверять их из самого клипа enemy на пересечение с клипом guns где куда и копируются все пули. Но код получается уж больно ресурсоёмкий. Если кто делал что-то подобное помогите плиз.:wacko: |
Вот тут хорошо написано, но если лень разбираться, то почитай про функцию hitTest
|
Попробуй использовать for...in.
|
Я уже давал совет, написать код на хиттест внутри мувика пули. И не надо заморачиваться.
|
2 diviniz : я не нашол иам для себя ничего полезного.
2 три двери : через цыклы это тоже слишком будет жрать память, врагов будет по 7-8 зараз, а пуль еще больше 2 CorC : я писал код внутри пули, но 1)Это слишком ресурсоёмко,2)нужно знать еще и с каким врагом столкнулась пуля. Но всем спаибо за попытку помоч. |
В любом случае, тебе придется проверять на столкновение координаты каждой пули с координатами каждого врага. Хоть ты это будешь делать в цикле, хоть это будет происходить автоматически через hitTest().
Хотя, чего там, ~8 врагов, ~20 пуль, всего 8 x 20 = 160 проверок, умножим на 4 потому что по OX две проверки делать и по OY две проверки, итого 640 проверок. Для флеша в таком количестве проверить number - вообще незаметно. А формально, сделать менее ресурсоемко - это идти на ухищрения, группировать пули и объекты по условному месторасположению. Например разбить игровое поле на 9 условных прямоугольников 3x3 1 2 3 4 5 6 7 8 9 и для каждой пули и врага хранить номер зоны, в которой они находятся. И никогда не делать проверку для пули и врага, которые находятся в разных зонах. Проверять столкновения только тех пуль и врагов, которые принадлежат одной зоне. Алгоритм получится навороченней, но работать будет шустрее. При большом количестве объектов почуствуешь выигрышь. |
Спасибо, через недели мучений может и придумаю как это сделать)))
Если ты сам такое делал пожалуйста подскажи поподробнее. У меня на 4 врага и 2 пули уже виснет. У мня азу 512 а проц 2.4, так что это не от компьютера.Может я со скриптом слегка намудрил, незнаю но виснет заметно очень. |
Я такое только на сях делал. На флеше не пробовал. Но тебе тут каждый скажет, что ты что-то со скриптом намудрил. 4 врага и 2 пули - чего там тормозить то может?
Совет - запусти swf отдельно в флешплейере и посмотри, не увеличивается ли у процесса потребляемая память в ходе работы. Если все время растет - точно намудрил. Если не растет, то какие-то у тебя дикие циклы которые проверяют неизвестно что. |
Ну у меня не просто hitTest а поточечное сканирование.
У мня не виснет до появления 2 пули, а после её появления начинается. |
ну хоть ктонибудь ХЕЛП!!
|
может сначало проверять расстояние пули к каждому врагу ,
и если пуля подлетела на довольно близкое расстояние к врагу, то начинать провирять с ним hitTest:) помоему гениально:D |
Пули - они-ж ведь быстро летят..)) В момент выстрела определять жертв попадания не пробовал? (просто сопоставить траекторию пули координатам игроков). 1.Если нормально реализовать проверку, в ресурсы это вставать не будет.. 2.Не будет проблем с определением того, чья пуля попала в жертву. (хотя тут будет некоторая головная боль если 2 игрока одновременно стреляют в 3го - надо отследить кто из них его убьет.. + возможна проблема если несколько игроков или препятствия находятся на пути пули, но и это решаемо)
|
2 Therion спасибо конечно но это тоже мозголомство, я даже не представляб себе код-ведь имя пули и имя объекта заранее неизвестны.
2 Torero Ну это мне придётся делать лазер вместо пуль,это изменит почти весь мой замысел (( Но если не найду выхода тогда воспользубсь этим методом, так что спасиба!!! Кстати, мой 1 вопрос остётся всиле ) |
Цитата:
|
)))))Ага.
Но если серьёзно то я хотел по мере возрастания левела можно бало увелчивать скорость пуль и т.д. |
Выложи исходник сюда чтоли
|
Тут ещо одна проблемка, он невидит пересечение пули и врага, хотя по теории он должен, виснет какбудто проверяет коллизию, но всёравно невидит, объясните почему если кто знает. Код прописан в enemyline в библиотеке. Все враги копируются в ролик enemys а пули в ролик sh_guns для удобства проверки пересечений.
На графику несмотреть, это просто как схема )) И ещё какая-то фигня - он весит 1 Мб, хотя так графики почти нет, это что код такой ??? Беспонятия почему так. |
Блин он нескидывается, превышает размер (((((
|
File->Save and compact
|
Ого !! Как это получилось???? Зачем сохранять в большом размере если можно настолько его сжать(вопрос к разработчикам)????
С размером всё получилось, но пишет "загрузка прошла неудачно"!! ЧТО такое ((( |
загрузка на форум уже давно не работает
загружайте кудато |
Кто пишет?
|
Цитата:
|
2 _etc надпись наверху такая, где раньше было "прикреплённые файлы"
2 therion а куда ещё можно?? 2 kikasso ну разница будет максимум 3 секунды, а сэкономило 1 мб!!! |
Цитата:
|
Спасибо, выложу туда, а как ссылки вставлять?
И как оформлять код и цитату? В квадратных скобках текст или после них??? |
Для цитат тег [quote], для кода — [code].
|
Собственно, в "расширенном режиме" кнопочки есть.
|
[quote это я просто пробую]
Это тоже пробная ссылка http://www.flasher.ru/ Сылка получилась а вот с цитатой като неочень ) Щас скину ссылку на исходник : http://www.filefactory.com/file/0709c5/ У меня остаётся 2 вопроса: 1) Почему код невидит пересечение пуль(sh_guns) и врагов(enemys)??? 2)Как сделать менее ресурсоёмкий код, потому-что даже если я найду ошибку, код будет жрать память очень даже сильно???? |
[quote]тут цитата[/quote]
[code]тут код[/code] Также есть кнопка http://www.flasher.ru/forum/images/r...ttons/edit.gif, поэтому не надо создавать несколько сообщений подряд, надо исправить последнее в теме. |
Аа извините буду знать.
Так что с моей игрой, тема уже поменяла русло. |
помне так зачем эти хиттэсты и поточечныеСканирования, я делаю проще смотри:
• пусть поле будет 500х400 кратно 5:4, • короче например пуля размером с 4 пикселя • тады делим на 4 координату пули и координату врага тож на 4 делим • округляем чтоб без заусенец после запятой было, • сравниваем не совпало ли, • затем деалем выводы дальше... • ... вроде так... надо проверить |
О точно, надо попробывать, откуда такая идея - сам или у кого-то позаимствовал?
|
Сам, батенька, сам..
просто когда-то на спектьруме готовил процедурки для своей буждущей стратежки... Только на ассемблере я делил не мат. функами а просто байт сдвигал на один или два бита тем самым делил на 2 или 4 а то и на 8 и 16 и т.п... |
Я так понял это через массивы, в них я чайник, немогбы дать хоть наводочку кода? я бы сэкономил 48 часов своей жизни )
|
интересно что именно тебе показалось через массивы:?
конечно же все координаты x y z угол_x угол_y угол_z ускорение_x ускорение_y ускорение_z скорость_x скорость_y скорость_z, состояния жизни, тип объекта, и прочие качества удобно хранить в массиве если нет прямого доступа к области памяти в оперативке, чтоб их быстро обработать и выдать на экран в готовом виде. насчёт байт расскажу вкратце: имеем байт с число координаты икс, он выглядит так: 00101101 = 45 сдвигаем вправо, т.е. делим на два, он уже будет таким: 00010110 = 22 тем самым поделил и округлил подробней например пуля почти в середине врага т.е. где-то в ухо попала: пуля: x=46 ;y=95 враг: x=50 ;y=99 делим всё на 8 или 12, 16, 24 как хочеш для точности. если на 8 то: пуля: x=6 ;y=12 враг: x=6 ;y=12 Код:
if (_х.пуля/8 == _х.враг/8 || _y.пуля/8 == _y.враг/8)ещё можно замутить метод обнаружения нахождения в поле зрения объекта используя такую мат. формулу (поискать в учебниках) которая определяет а не попала ли точка в окружность если ответ уравнения 0 значит не попала. и тип того... но это каждый раз просчитывать надо на столкновения, пересечения, я незнаю может есть такая функция типа onObjectRoll типа того, что когда другой объект находится под или над другим срабатывает этот евент, и тогда только происходит нужный расчёт кто с чем столкнулся... буду думать дальше... пока мыслей нет, временно занят другой областью творчества... нашёл тут в начале ветки: Цитата:
платформе всё заранее известно, только дело времени и расчётов необходимых человеку и то как он их собирается проводить, мат.путём илиже методом тыка в точку отрезками линий. надеюсь стрельбу из пулемёта ты сможешь написать используя вычисления 4х известных координат игрока и врага извлекая гипотенузу или ещё мождт какой угол и сравнивая это с действительным углом выстрела, проще наверное вычислить под каким углом лежит враг на плоскости относительно тебя и под каким углом ты стрелял, затем сравнить и если делёное и округлёное сравнение совпало, то всё получится.. если реально, то бери учёбник по геометрии или алгебре и ищи, найдёшь даже больше чем думал.. |
На счот Имена неизвестны я имел ввиду что враги создаются через цыкл и имена у них enemy1,enemy2,enemy3......enemyN. Еслибы я их знал то могбы просто написать hitTest , но я незнаю их заранее, а твой способ подходит также если имена заранее известны.
|
ДЛЯ АДМИНИСТРАЦИИ
Интересно, а что это значит:
Код:
...я так не подписываюсь, господин админ соизвольте объяснить мне, что вы там правили ??? что не так, опять КОДЕ? нет, я коде где надо вставил, а где не надо соответственно не вставил. .спасибо таксказать за внимание. щас я вам плюс вышлю по почте :taunt: |
Так ты не знаешь способа?
|
Что вы нас мучаете, мы предложили полный перебором цикл.
Мы же не знаем как у вас все устроено, может можно одну часть переписать так, что все имена будут известны. А обычно это так и бывает, так что ломайте свою голову и оптимизируйте а не задавайте 1 и тот же вопрос 20 раз. |
| Часовой пояс GMT +4, время: 04:04. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.