Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Пересечение 2 заранее неизвестных объектов (http://www.flasher.ru/forum/showthread.php?t=98013)

Gh >k 04.07.2007 21:17

Пересечение 2 заранее неизвестных объектов
 
Привет всем!
Вобщем ситуация такая :
Я создаю игру, где мне нужно проверять пересечение 2 объектов - пули с именем "gun"+gun_number где gun_number всегда меняется, и "enemy"+i где i тоже переменная. Как мне проверить их пересечение?????
Единственное что я придумал - это проверять их из самого клипа enemy на пересечение с клипом guns где куда и копируются все пули. Но код получается уж больно ресурсоёмкий.
Если кто делал что-то подобное помогите плиз.:wacko:

divinus 04.07.2007 21:28

Вот тут хорошо написано, но если лень разбираться, то почитай про функцию hitTest

Три Двери 04.07.2007 23:58

Попробуй использовать for...in.

CorC 05.07.2007 10:03

Я уже давал совет, написать код на хиттест внутри мувика пули. И не надо заморачиваться.

Gh >k 05.07.2007 22:48

2 diviniz : я не нашол иам для себя ничего полезного.
2 три двери : через цыклы это тоже слишком будет жрать память, врагов будет по 7-8 зараз, а пуль еще больше
2 CorC : я писал код внутри пули, но 1)Это слишком ресурсоёмко,2)нужно знать еще и с каким врагом столкнулась пуля.
Но всем спаибо за попытку помоч.

xintrea 06.07.2007 02:21

В любом случае, тебе придется проверять на столкновение координаты каждой пули с координатами каждого врага. Хоть ты это будешь делать в цикле, хоть это будет происходить автоматически через hitTest().

Хотя, чего там, ~8 врагов, ~20 пуль, всего 8 x 20 = 160 проверок, умножим на 4 потому что по OX две проверки делать и по OY две проверки, итого 640 проверок. Для флеша в таком количестве проверить number - вообще незаметно.

А формально, сделать менее ресурсоемко - это идти на ухищрения, группировать пули и объекты по условному месторасположению. Например разбить игровое поле на 9 условных прямоугольников 3x3

1 2 3
4 5 6
7 8 9

и для каждой пули и врага хранить номер зоны, в которой они находятся. И никогда не делать проверку для пули и врага, которые находятся в разных зонах. Проверять столкновения только тех пуль и врагов, которые принадлежат одной зоне. Алгоритм получится навороченней, но работать будет шустрее. При большом количестве объектов почуствуешь выигрышь.

Gh >k 06.07.2007 18:30

Спасибо, через недели мучений может и придумаю как это сделать)))
Если ты сам такое делал пожалуйста подскажи поподробнее.
У меня на 4 врага и 2 пули уже виснет. У мня азу 512 а проц 2.4, так что это не от компьютера.Может я со скриптом слегка намудрил, незнаю но виснет заметно очень.

xintrea 07.07.2007 04:59

Я такое только на сях делал. На флеше не пробовал. Но тебе тут каждый скажет, что ты что-то со скриптом намудрил. 4 врага и 2 пули - чего там тормозить то может?

Совет - запусти swf отдельно в флешплейере и посмотри, не увеличивается ли у процесса потребляемая память в ходе работы. Если все время растет - точно намудрил. Если не растет, то какие-то у тебя дикие циклы которые проверяют неизвестно что.

Gh >k 07.07.2007 18:10

Ну у меня не просто hitTest а поточечное сканирование.
У мня не виснет до появления 2 пули, а после её появления начинается.

Gh >k 08.07.2007 07:53

ну хоть ктонибудь ХЕЛП!!

Therion 08.07.2007 08:13

может сначало проверять расстояние пули к каждому врагу ,
и если пуля подлетела на довольно близкое расстояние к врагу, то начинать провирять с ним hitTest:)
помоему гениально:D

Torero 08.07.2007 10:29

Пули - они-ж ведь быстро летят..)) В момент выстрела определять жертв попадания не пробовал? (просто сопоставить траекторию пули координатам игроков). 1.Если нормально реализовать проверку, в ресурсы это вставать не будет.. 2.Не будет проблем с определением того, чья пуля попала в жертву. (хотя тут будет некоторая головная боль если 2 игрока одновременно стреляют в 3го - надо отследить кто из них его убьет.. + возможна проблема если несколько игроков или препятствия находятся на пути пули, но и это решаемо)

Gh >k 08.07.2007 23:23

2 Therion спасибо конечно но это тоже мозголомство, я даже не представляб себе код-ведь имя пули и имя объекта заранее неизвестны.
2 Torero Ну это мне придётся делать лазер вместо пуль,это изменит почти весь мой замысел ((
Но если не найду выхода тогда воспользубсь этим методом, так что спасиба!!!

Кстати, мой 1 вопрос остётся всиле )

Torero 09.07.2007 01:59

Цитата:

Сообщение от Gh >k
...это мне придётся делать лазер вместо пуль...

Вставляя код в каждую пулю, ты ее превращаешь в баллистическую ракету..)))))

Gh >k 09.07.2007 23:11

)))))Ага.
Но если серьёзно то я хотел по мере возрастания левела можно бало увелчивать скорость пуль и т.д.

xintrea 10.07.2007 03:16

Выложи исходник сюда чтоли

Gh >k 10.07.2007 09:33

Тут ещо одна проблемка, он невидит пересечение пули и врага, хотя по теории он должен, виснет какбудто проверяет коллизию, но всёравно невидит, объясните почему если кто знает. Код прописан в enemyline в библиотеке. Все враги копируются в ролик enemys а пули в ролик sh_guns для удобства проверки пересечений.
На графику несмотреть, это просто как схема ))
И ещё какая-то фигня - он весит 1 Мб, хотя так графики почти нет, это что код такой ??? Беспонятия почему так.

Gh >k 10.07.2007 09:42

Блин он нескидывается, превышает размер (((((

CorC 10.07.2007 09:44

File->Save and compact

Gh >k 10.07.2007 22:49

Ого !! Как это получилось???? Зачем сохранять в большом размере если можно настолько его сжать(вопрос к разработчикам)????
С размером всё получилось, но пишет "загрузка прошла неудачно"!!
ЧТО такое (((

Therion 10.07.2007 23:12

загрузка на форум уже давно не работает
загружайте кудато

etc 10.07.2007 23:37

Кто пишет?

Kikasso 11.07.2007 00:01

Цитата:

Сообщение от Gh >k
Зачем сохранять в большом размере если можно настолько его сжать(вопрос к разработчикам)????

Чтоб быстрее сохранялось.

Gh >k 11.07.2007 00:14

2 _etc надпись наверху такая, где раньше было "прикреплённые файлы"
2 therion а куда ещё можно??
2 kikasso ну разница будет максимум 3 секунды, а сэкономило 1 мб!!!

Kikasso 11.07.2007 00:34

Цитата:

Сообщение от Gh >k
а куда ещё можно??

http://flasher.ru/forum/showpost.php...7&postcount=31

Gh >k 11.07.2007 08:45

Спасибо, выложу туда, а как ссылки вставлять?
И как оформлять код и цитату? В квадратных скобках текст или после них???

etc 11.07.2007 09:17

Для цитат тег [quote], для кода — [code].

Kikasso 11.07.2007 09:40

Собственно, в "расширенном режиме" кнопочки есть.

Gh >k 11.07.2007 10:20

[quote это я просто пробую]
Это тоже пробная ссылка http://www.flasher.ru/

Сылка получилась а вот с цитатой като неочень )
Щас скину ссылку на исходник :
http://www.filefactory.com/file/0709c5/

У меня остаётся 2 вопроса: 1) Почему код невидит пересечение пуль(sh_guns) и врагов(enemys)??? 2)Как сделать менее ресурсоёмкий код, потому-что даже если я найду ошибку, код будет жрать память очень даже сильно????

iNils 11.07.2007 10:35

[quote]тут цитата[/quote]
[code]тут код[/code]
Также есть кнопка http://www.flasher.ru/forum/images/r...ttons/edit.gif, поэтому не надо создавать несколько сообщений подряд, надо исправить последнее в теме.

Gh >k 11.07.2007 23:10

Аа извините буду знать.
Так что с моей игрой, тема уже поменяла русло.

Доктор Глюк 21.07.2007 03:12

помне так зачем эти хиттэсты и поточечныеСканирования, я делаю проще смотри:
• пусть поле будет 500х400 кратно 5:4,
• короче например пуля размером с 4 пикселя
• тады делим на 4 координату пули и координату врага тож на 4 делим
• округляем чтоб без заусенец после запятой было,
• сравниваем не совпало ли,
• затем деалем выводы дальше...
• ...
вроде так... надо проверить

Gh >k 21.07.2007 22:29

О точно, надо попробывать, откуда такая идея - сам или у кого-то позаимствовал?

Доктор Глюк 21.07.2007 23:20

Сам, батенька, сам..
просто когда-то на спектьруме готовил процедурки для своей буждущей стратежки...

Только на ассемблере я делил не мат. функами а просто байт сдвигал на один или два бита тем самым делил на 2 или 4 а то и на 8 и 16 и т.п...

Gh >k 22.07.2007 22:51

Я так понял это через массивы, в них я чайник, немогбы дать хоть наводочку кода? я бы сэкономил 48 часов своей жизни )

Доктор Глюк 23.07.2007 20:20

интересно что именно тебе показалось через массивы:?
конечно же все координаты 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)
{звук:смерти;враг(№) -=1;очки +=100*стоимостьВрага(№)}

извените транскрипцией не особо владею, но принцип должен ясен

ещё можно замутить метод обнаружения нахождения в поле зрения объекта используя такую мат. формулу (поискать в учебниках) которая определяет а не попала ли точка в окружность если ответ уравнения 0 значит не попала. и тип того...

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

буду думать дальше... пока мыслей нет, временно занят другой областью творчества...

нашёл тут в начале ветки:
Цитата:

Сообщение от Gh >k
имя пули и имя объекта заранее неизвестны.

как неизвестны? это ж твой код и твои процедурки переваривают твои массивы и говорят тебе кто пересекается, если в процедуре всё понятно описано. значит все координаты и имена живых объектов известны всему мувику главное грамотно к ним обращатся.

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

надеюсь стрельбу из пулемёта ты сможешь написать используя вычисления 4х известных координат игрока и врага извлекая гипотенузу или ещё мождт какой угол и сравнивая это с действительным углом выстрела, проще наверное вычислить под каким углом лежит враг на плоскости относительно тебя и под каким углом ты стрелял, затем сравнить и если делёное и округлёное сравнение совпало, то всё получится.. если реально, то бери учёбник по геометрии или алгебре и ищи, найдёшь даже больше чем думал..

Gh >k 24.07.2007 19:15

На счот Имена неизвестны я имел ввиду что враги создаются через цыкл и имена у них enemy1,enemy2,enemy3......enemyN. Еслибы я их знал то могбы просто написать hitTest , но я незнаю их заранее, а твой способ подходит также если имена заранее известны.

Доктор Глюк 25.07.2007 06:43

ДЛЯ АДМИНИСТРАЦИИ
 
Интересно, а что это значит:
Код:

...
Последний раз редактировалось __etc, Вчера в 03:43

..подпись в моём предыдущем посте..

я так не подписываюсь,

господин админ соизвольте объяснить мне, что вы там правили ???
что не так, опять КОДЕ? нет, я коде где надо вставил, а где не надо соответственно не вставил.

.спасибо таксказать за внимание.

щас я вам плюс вышлю по почте :taunt:

Gh >k 25.07.2007 08:20

Так ты не знаешь способа?

CorC 25.07.2007 09:54

Что вы нас мучаете, мы предложили полный перебором цикл.
Мы же не знаем как у вас все устроено, может можно одну часть переписать так, что все имена будут известны. А обычно это так и бывает, так что ломайте свою голову и оптимизируйте а не задавайте 1 и тот же вопрос 20 раз.


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

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