forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Вопрос про наболевшее - коллизии. (http://forum.boolean.name/showthread.php?t=5702)

DEGABB 08.02.2008 02:14

Вопрос про наболевшее - коллизии.
 
Есть игрок с возможностью стрелять снарядами (их полёт виден) и боты, каждый из которых входит в массив типа tank.
Как определить, при обработке коллизий "снаряд-бот", кто из ботов столкнулся со снарядом, если все они относятся к одному типу коллизий (CONST BOT_C=1).
Т.е. при столкновении снаряда и объекта типа BOT_C возникает коллизия с ботом, но как узнать кто из целого массива ботов её создал (и затем удалить только этого бота)?

dimond 08.02.2008 03:32

Ответ: Вопрос про наболевшее - коллизии.
 
Собрал простенькую программулину (все не выкладываю только основные моменты).

Код:


Const BOT_C%=111

Dim Tank(10)

For i=0 To 9
  Tank(i)=CreateCube()
  PositionEntity Tank(i),Rand(-10,10),0,Rand(-10,10)
EntityType Tank(i),BOT_C
Next

Collisions TSHOT,BOT_C,3,1

в цикле

Код:


For i=0 To 9
  If EntityCollided(Tank(i),TSHOT) Then FreeEntity Tank(i)
Next

проверено, удаляется только "подстреленый" элемент массива.

tormoz 08.02.2008 04:24

Ответ: Вопрос про наболевшее - коллизии.
 
Ерунда, а не код
высавил коллизию пуля-танк, а проверяешь танк-пуля
По сабжу:
используй не массивы, а типы (удобнее)

EntityCollided(пуля,тип_танка) возвратит тебе ентити. с которым произошла коллизия

Доступ к элементу типа ты можешь получить либо простым перебором (сравнивая полученный ентити с ентити танка из типа), либо с помощью команды Object

Код:

t.tank=New tank
t\en=CopyEntity(tank_mesh)
NameEntity t\en,Handle(t)
------------------------

ent=EntityCollided(shot\en,BOT_C)
If ent<>0
 t.tank=Object.tank(EntityName(ent))
 If t<>Null
  Тут мы получили доступ к элементу типа и делаем с ним что хотим
 EndIf
EndIf


Raiter 08.02.2008 04:31

Ответ: Вопрос про наболевшее - коллизии.
 
А можно вообще не юзать коллизию, а юзать EntityDistance

HolyDel 08.02.2008 10:58

Ответ: Вопрос про наболевшее - коллизии.
 
Да, согласен с Raiter -ом. вот тока так по хитрому (через object/handle) уже не выбереш нужный элемент. придется перебирать.

moka 08.02.2008 12:46

Ответ: Вопрос про наболевшее - коллизии.
 
Проблемка возникнет с быстрыми объектами :)
Если будет юзаться физ движок, (PhysX), тогда триггерами проверять.
И можно без перебора получить будет объект, в которого попали.

HolyDel 08.02.2008 12:54

Ответ: Вопрос про наболевшее - коллизии.
 
Я вообще бы рекомендовал проверять на пересечение отрезка со сферой. давно выкладывал ф-ии.

IGR 08.02.2008 13:13

Ответ: Вопрос про наболевшее - коллизии.
 
tormoz, спасиб !! :super:
меня этот код направил на очень умную мисль !!

Crystal 08.02.2008 14:54

Ответ: Вопрос про наболевшее - коллизии.
 
Кусок моего кода

Код:

    For a.bot=Each bot
   
    If EntityDistance(a\entity,o\pulka)<10 Then
   
    a\HP#=a\HP#-4
    o\Delet=1

    End If
   
    If a\HP#<1 Then
    FreeEntity a\entity
    Delete a
    End If
   
    Next
   
    If o\Delet
    FreeEntity o\pulka
    Delete o             
    EndIf

    Next


HolyDel 08.02.2008 15:10

Ответ: Вопрос про наболевшее - коллизии.
 
этот кусок был выдран небрежно.
почему без цикла o ?

Crystal 08.02.2008 15:53

Ответ: Вопрос про наболевшее - коллизии.
 
Почему небрежно? Нафиг ему он нужен?
Он вообще по видимому уже реализовал выстрел.
Код показывает как удалить бота вместе с патроном.
Ну если очень надо могу и всю функцию выложить:

Код:

    For o.s=Each s
        If o\upt=-1
            o\upt=MilliSecs()
        EndIf
        dt=MilliSecs()-o\upt
        o\upt=MilliSecs()
        MoveEntity o\pulka,0,0,dt*1
           
                   
        If EntityDistance(o\pulka,User)>50000
       
        o\Delet=1
                   
        EndIf

   
    For a.bot=Each bot
   
    If EntityDistance(a\entity,o\pulka)<10 Then
   
    a\HP#=a\HP#-4
    o\Delet=1

    End If
   
    If a\HP#<1 Then
    FreeEntity a\entity
    Delete a
    End If
   
    Next
   
    If o\Delet
    FreeEntity o\pulka
    Delete o             
    EndIf

    Next


HolyDel 08.02.2008 15:59

Ответ: Вопрос про наболевшее - коллизии.
 
вот почему:
Код:

    For a.bot=Each bot
   
    If EntityDistance(a\entity,o\pulka)<10 Then
   
    a\HP#=a\HP#-4
    o\Delet=1

    End If
   
    If a\HP#<1 Then
    FreeEntity a\entity
    Delete a
    End If
   
    Next
   
    If o\Delet
    FreeEntity o\pulka
    Delete o             
    EndIf


    Next

все что выделено - непонятно что к чему.

jimon 08.02.2008 16:29

Ответ: Вопрос про наболевшее - коллизии.
 
Blitzerg
1) пуля летит отсилы 2 км, в реальном случае - 400 метров
2) ограничивать полет лутче по времени чем по растоянию до игрока
3) у тебя перебор O(N^2), надо юзать деревья разбивки,
хотя бы по сегментно
4)
Код:

  If EntityDistance(a\entity,o\pulka)<10 Then
   
    a\HP#=a\HP#-4
    o\Delet=1

    End If
   
    If a\HP#<1 Then
    FreeEntity a\entity
    Delete a
    End If
   
    Next
   
    If o\Delet
    FreeEntity o\pulka
    Delete o             
    EndIf

проще написать так да ?
Код:

If EntityDistance(a\entity,o\pulka)<10 Then
 a\HP = a\HP - 4
 if a\HP < 1 then
  FreeEntity a\entity
  Delete a
 end if
 FreeEntity o\pulka
 Delete o             
End If


HolyDel 08.02.2008 16:43

Ответ: Вопрос про наболевшее - коллизии.
 
jimon, ты издеваешся?
как будет не_программер писать деревья разбивки?

Цитата:

проще написать так да ?
нет. цикл перейдет на следующую ветку обработки врага и вылетит (так как эта пулька уже удалена, и сравнивать не с чем)

moka 08.02.2008 16:51

Ответ: Вопрос про наболевшее - коллизии.
 
Дык, добавь перед последним Endif, Exit.

Crystal 08.02.2008 17:03

Ответ: Вопрос про наболевшее - коллизии.
 
Ну это пули юзера.
А пули ботов ограничены по времени.
(но я думаю перевести это дело на расстояние, не нравится мне эта куйня с временем)

Добавил:
Пересмотрел. Шо это за фигню ты написал? Конечно не проще.
У меня в конце прописано удалять пулю если o\delet=1
Это бывает в 2 случаях: 1. если пуля улетела далеко от юзера. 2 если пуля подлетела близко к боту.
А у тебя получается что пуля должна удаляться только тогда когда подлетит к боту.
Ты мне код не проще сделал, а наоборот усложнил, придётся отдельно дописывать удаление при дистанции от юзера. Тобиш пулю удалять надо в двух разных случаях, а не только когда o\delet равен одному.

HolyDel 08.02.2008 17:06

Ответ: Вопрос про наболевшее - коллизии.
 
впринципе да. exit-ом можно решить. но он вроде выведет тока за один цикл. а надо за оба.

moka 08.02.2008 17:10

Ответ: Вопрос про наболевшее - коллизии.
 
Тогда ставим ещё одно условие, на проверку наличия объектов, если отсутствуют - лепим Exit.

tormoz 08.02.2008 17:18

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

счетчик времени :
о\тайм=о\тайм+1
ент=ЕнтитуКоллидед(о\ент,тип_бот)
ент2=ЕнтитуКоллидед(о\ент,тип_уровень)
Иф ент ор ент2
о\тайм=401
ендиф


Иф о\тайм=>400
Иф о\тайм=401
БольшойБум(о\ент)
ЕндИф
ФрееЕнтити о\ент
Делете о
ЕндИф

HolyDel 08.02.2008 17:23

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Тогда ставим ещё одно условие, на проверку наличия объектов, если отсутствуют - лепим Exit.
вот. это работать будет.
теперь смотри - мы просто вводим поле обозначающее удаленность объекта, и проводим всякие проверки, потом, в самом конце, если удален стоит метка то удаляем ентити и объект. зато так можно "удалять" пульку в любом месте, ошибки не будт.

jimon 08.02.2008 17:54

Ответ: Вопрос про наболевшее - коллизии.
 
tormoz
Цитата:

или пули в танках, либо танки в пулях

ой что-то меня ето расмешило :lol:


HolyDel
упс, не заметил :)

Blitzerg
чувак, представь что ты строчку o\delet = 1 замениш на удаление пули
кода меньше ! ... в любом случае ты делаешь ДВЕ проверки
и еще одну проверку o\delet = 1 .. в итоге три проверки ...
а так будет две .. где сложности ? не вижу ...

Crystal 08.02.2008 18:27

Ответ: Вопрос про наболевшее - коллизии.
 
А если у меня 20 разных видов ботов, ещё земля, ещё дома, ещё предметы.
Чё мне каждый раз писать:

Код:

if событие then
FreeEntity o\pulka
Delete o 
end if

????????

Не проще ли мне писать if событие then o\delet=1 ??

Не кажется ли тебе, что я туеву хучу строк экономить буду?

moka 08.02.2008 18:38

Ответ: Вопрос про наболевшее - коллизии.
 
Blitzerg, О! Я кстать недавно об этом задумался, и понял, экономия строк, порой - плохо. Смотри, у тебя будет лишнея переменная, :) А условие, всёравно выполнится ;)

HolyDel 08.02.2008 18:47

Ответ: Вопрос про наболевшее - коллизии.
 
уууу!!!
Код:

if entitydistance(o\pulka,vrag1) then
FreeEntity o\pulka
Delete o 
end if

if entitydistance(o\pulka,vrag2) then ;вопрос на засыпку. что будет здесь, если выполнится предыдущие условие?
FreeEntity o\pulka
Delete o 
end if


Crystal 08.02.2008 19:07

Ответ: Вопрос про наболевшее - коллизии.
 
Ошипко!
Пулё не найдено, идите накуй.
Думаю такое будет?

HolyDel 08.02.2008 19:13

Ответ: Вопрос про наболевшее - коллизии.
 
угу. такое и будет. именно поэтому (а не из за экономии строчек, или экономии памяти) надо завести свою перменную с состоянием "удаленности"

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

Crystal 08.02.2008 19:14

Ответ: Вопрос про наболевшее - коллизии.
 
Ну да. Так и есть )
Собсно по этому она там и поставлена.
Про экономию я сморозил.
Просто изложил в теории еслиб предложение джимона работало то это было бы не экономно )

Taugeshtu 08.02.2008 19:33

Ответ: Вопрос про наболевшее - коллизии.
 
перебор в данном случае не рулит. Рулит парабола-триггер как mesh, скалящийся в зависимости от угла выстрела (если уж совсем реализм и пули летают по навесной) или же бокс-цилиндр-извращенно_скаленный_шарик с проверкой на коллизию. Особенно в данном случае рулит сторонний физ. двиг.

по поводу реально летящих в данном случае пуль (особенно медленнолетящих) - мы знаем, что пуля летит всю свою траекторию за 700 с буем мс. А дальше проверяем коллизию триггера, если бот словил ее, то проверка на то, сколько процентов траектории (ее максимальная длина также изначально определена) пульк0 пролетела, и если бот стоит примерно ("допуск" обязателен - мс не будут топать точно по n штук после каждой команды!) на этом промежутке - хит по нему, через обжект ессно, удаляем бота и после ставим флажок удаления пульке.

jimon 08.02.2008 20:42

Ответ: Вопрос про наболевшее - коллизии.
 
HolyDel
мне это сводить к знаниям не_программиста или ты издеваешся ?
есно что если я напишу какой-то бред который даже логически
не пашет то и в компиляторе он не запашет

Crystal 08.02.2008 21:19

Ответ: Вопрос про наболевшее - коллизии.
 
Какой бред?
Твой вариант кода не предпологает, что пулю надо будет удалять
в множестве различных событий.
Так как если пуля будет удалена при определённом событии, и после этого
будет другая проверка пули а пули то уже нет, то будет ошибка кода,
и игра вылетит.
Холи это какрас и продемонстрировал своим вопросом.

HolyDel 08.02.2008 21:53

Ответ: Вопрос про наболевшее - коллизии.
 
Jimon имел ввиду секционную разбивку. которую в идеале надо делать. и кстати, как седлать ее в блице - хз. хотя я писал либу.

jimon 08.02.2008 21:57

Ответ: Вопрос про наболевшее - коллизии.
 
оффтоп на тему blitz3d :)

эх ... или блиц3д так отстал от жизни ... или я торможу ...
имхо я бы написал етот код так ... может я и не прав .. но я пишу на blitzmax

архитектурные условия :
1) пуля ето такой же TWorldObject как и нпс и все остальное
2) у нас есть WorldManager у которого есть CollisionManager
3) CollisionManager работает по запросам, все TWorldManager
кидают в него запросы, а потом он всё ето обрабатывает
и хранит список обработаных запросов
4) у TWorldManager есть метод RemoveObject(obj:TWorldObject)
5) у TBulletObject есть метод CreateBoom()

в таком окружении метод Update у TBulletObject будет так выглядеть :
Код:

Method Update()
 UpdatePhysic()

 Local collision:TCollisionRequest = WorldManager.GetCollisionRequest(...)
 if collision.objects.Count() > 0 then
  local obj:TWorldObject = TWorldObject(collision.objects.First())
  if obj.HpEnable = 1 then obj.Attack(BulletAtack)
  CreateBoom()
  WorldManager.RemoveObject(self)
  return
 end if

 if (Millisecs() - createdtime) > 5000 then
  WorldManager.RemoveObject(self)
  return
 end if
End Method

ну и при каких еще условиях надо удалять переменую, а ?

пуля в любых условиях существования удаляется в двух случаях :
1) c чем-то ударились
2) улетели далеко (на первой космической и вращаемся на орбите)

потому ИМХО их СВОИХ взглядов я не вижу смысла
вводить такую переменую удаления ...
а то пуля будет колизится с кучей обьектов и всех поубивает и только
потом удалится

с моей точки зрения такой примитивизм blitz3d показывает что ооп в blitzmax рулз :)

HolyDel 08.02.2008 22:09

Ответ: Вопрос про наболевшее - коллизии.
 
элементарно Ватсон, ввели какую нибудь магию которая удаляет ВСЕ пули в некотором радиусе.

tormoz 08.02.2008 22:34

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

ну и при каких еще условиях надо удалять переменую, а ?

пуля в любых условиях существования удаляется в двух случаях :
1) c чем-то ударились
2) улетели далеко (на первой космической и вращаемся на орбите)

потому ИМХО их СВОИХ взглядов я не вижу смысла
вводить такую переменую удаления ...
а то пуля будет колизится с кучей обьектов и всех поубивает и только
потом удалится

с моей точки зрения такой примитивизм blitz3d показывает что ооп в blitzmax рулз
Ерунду написал
На блитц3д без всяких ооп и так все работает быстро и четко если код грамотно построен
За один проход цикла она никак "всех поубивает"
На коллижн ставим стоп и удаляем
Какие проблемы ?

зы. все эти холливары исключительно от недостатка опыта и буйной фантазии. :))))

HolyDel 08.02.2008 22:51

Ответ: Вопрос про наболевшее - коллизии.
 
с коллизиями да. а если без них?

DEGABB 09.02.2008 00:26

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от jimon (Сообщение 76660)
оффтоп на тему blitz3d :)

эх ... или блиц3д так отстал от жизни ... или я торможу ...
имхо я бы написал етот код так ... может я и не прав .. но я пишу на blitzmax

архитектурные условия :
1) пуля ето такой же TWorldObject как и нпс и все остальное
2) у нас есть WorldManager у которого есть CollisionManager
3) CollisionManager работает по запросам, все TWorldManager
кидают в него запросы, а потом он всё ето обрабатывает
и хранит список обработаных запросов
4) у TWorldManager есть метод RemoveObject(obj:TWorldObject)
5) у TBulletObject есть метод CreateBoom()

в таком окружении метод Update у TBulletObject будет так выглядеть :
Код:

Method Update()
 UpdatePhysic()

 Local collision:TCollisionRequest = WorldManager.GetCollisionRequest(...)
 if collision.objects.Count() > 0 then
  local obj:TWorldObject = TWorldObject(collision.objects.First())
  if obj.HpEnable = 1 then obj.Attack(BulletAtack)
  CreateBoom()
  WorldManager.RemoveObject(self)
  return
 end if

 if (Millisecs() - createdtime) > 5000 then
  WorldManager.RemoveObject(self)
  return
 end if
End Method

ну и при каких еще условиях надо удалять переменую, а ?

пуля в любых условиях существования удаляется в двух случаях :
1) c чем-то ударились
2) улетели далеко (на первой космической и вращаемся на орбите)

потому ИМХО их СВОИХ взглядов я не вижу смысла
вводить такую переменую удаления ...
а то пуля будет колизится с кучей обьектов и всех поубивает и только
потом удалится

с моей точки зрения такой примитивизм blitz3d показывает что ооп в blitzmax рулз :)

Ой-ой-ой! Что тут началось, из-за того, что я не полностью описал проблему. Ситуация гораздо проще:
1) Вид сверху! (Почти 2D), поэтому ни про какую траекторию пули не надо заморачиваться.
2) Скорость пули тоже постоянна.
3) Боты двигаются в одной плоскости с пулей (т.е. почти земле), поэтому она всегда врежется либо в бота, либо в ограждение уровня, либо в другую пулю. При любом столкновении (как это написать?) она исчезнет.
4) Говорят, что при движении и ботов, и пули следует создавать 2 коллизии: бот-пуля и пуля-бот, так вот! ещё и не понятно, почему иногда срабатывает одна, иногда - другая коллизия? :(
5) Все боты относятся к типу tank и двигаются-думают в цикле:
For bot.tank=Each tank
.....
Next
Где лучше проверять коллизию? В Этом цикле или в общем "игровом" цикле?
6) Даже на такую строчку (неважно, где она написана, либо внутри цикла ботинков, либо внутри игрового цикла):
If (EntityDistance# (player1\bul,bot\ent))<2 Then Stop
BB выдаёт ошибку "переменная должна быть типом"

[player1\bul - сам кубик пули, созданный примитивным
player1\bul=CreateCube()
а вот bot\ent созданна через
bot.tank=New tank
bot\ent=CreateCube()
где
Type tank
Field ent; entity
Field dir; direction-направление
Field sp#; скорость
End Type
и ничего больше]

Вобщем, как при попадании пули в бота убивать НУЖНОГО бота,
в то время как пуля должна сама исчезнуть при ЛЮБОМ попадании?

Ух! Вроде б вопрос-то несложный, но что-то запарился уже.

И ещё вопросик: почему обещанный HideEntity, который скрывает объект от глаз и КОЛЛИЗИЙ, иногда всё-таки срабатывает на коллизии EntityCollided?

dimond 09.02.2008 02:02

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от tormoz (Сообщение 76553)
используй не массивы, а типы (удобнее)

Но человек просил с массивом! не в моих принципах отвечать типа: чувак используй типы, они круче всех. А если ему Надо_было_только_с_массивом?
Вот я и набросал как это можно сделать, хочя и знал что лучше сделать через типы.

-=SCiP=- 09.02.2008 02:12

Ответ: Вопрос про наболевшее - коллизии.
 
Люди есть вариант. Не знаю как вы одобрите.!
Если сделать через EntityPickMode типа прицел направлен на объект. Сразу определяется в Dim какой это объект. И при нажатии выстрела просто вылетает пуля а объект удаляется. Это все без коллизии.
Но пуля должна двигается быстро чтоб не получилась объект удалился а пуля только настигла его!

tormoz 09.02.2008 02:14

Ответ: Вопрос про наболевшее - коллизии.
 
Блин
Делай с коллизиями без всяких дистанций- быстрее работает

Если хочешь дистанции, то придется обрабатывать внутри цикла пуль цикл ботов:

Код:

For o.shot=Each shot
 MoveEntity o\ent,0,0,o\speed
 
CollidedBot(o.shot)
o\time=o\time+1

If o\time>=400
  FreeEntity o\ent
  Delete o
endIf
Next

Function CollidedBot(o.shot)
For bot.tank=Each tank
 dist#=EntityDistance(o\ent,bot\ent)
 If dist<5
  BigBang(bot\ent) ;взрыв танка
  bot\del=1 ;флаг удаления танка
  o\time=400 ;флаг удаления пули
 endif
Next
End Function


dimond 09.02.2008 04:08

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от tormoz (Сообщение 76553)
Ерунда, а не код
высавил коллизию пуля-танк, а проверяешь танк-пуля

Обьясни в чем разница. Ведь работало правильно, поэтому не обратил особого внимания.

tormoz 09.02.2008 05:22

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от dimond (Сообщение 76697)
Обьясни в чем разница. Ведь работало правильно, поэтому не обратил особого внимания.

Collisions type_1,type_2,1,1

Коллизия происходит между первым и вторым типом
То есть, если движется первый тип, то коллизия будет, а если только второй - то нет

Твой код работал только тогда, когда танки двигались
Компрене ?

dimond 09.02.2008 05:47

Ответ: Вопрос про наболевшее - коллизии.
 
В том то и дело что не двигались. я просто натыкал неподвижных обьектов в пространстве. вот еще раз проверил, проверка всеравно срабатывает так.
---
При перемене местами типов коллизия не срабатывает.
так что зря ты это так поспешил с выводами.
возможно дело в том что счетчик для массива, а не как принято:
For s.shot=Each shot
...
if EntityCollided(s\entity,BOT_C) ...
...
Next
но я могу ошибаться

HolyDel 09.02.2008 17:20

Ответ: Вопрос про наболевшее - коллизии.
 
О_о коллизия работает быстрее?
это точно?
я чесно сказать не проверял, но ведь при коллизии еще дофига всего проверяется, точка коллизии, смещение объекта, который коллизится куда-нибудь, еще наверное какие нибудь рассчеты?

Raiter 09.02.2008 19:16

Ответ: Вопрос про наболевшее - коллизии.
 
ы? я тоже думал что дистанс быстрее коллизии 0.о

tormoz 09.02.2008 20:08

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от Raiter (Сообщение 76772)
ы? я тоже думал что дистанс быстрее коллизии 0.о

Проверь
Коллизия сфера-сфера работает быстрее дистанса
Особенно если много объектов - это заметно

Taugeshtu 09.02.2008 20:54

Ответ: Вопрос про наболевшее - коллизии.
 
Да, быстрее, я как-то проверял.
Теперь интересное: почему.
Процесс перебора + дистанс с точки зрения запущеного экзешника:
грузится двиг блитца.
Скрипт-двиг трейсит код, и натыкается на мейн-луп.
В нем находит переход на функцию вложенного перебора.
Запускает поиск внешнего элемента (пули) среди всех. (EACH)
Возвращает в ОЗУ все положенные данные из полей
Запускает поиск внутреннего элемента (танка)
Опять забивает ОЗУ
И только сейчас, имея на руках в памяти через к примеру bullet\entity и tank\entity он получает запрос на дистанс.

Как думаешь, быстро?

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

грузится двиг блитца.
Скрипт-двиг трейсит код, и натыкается на мейн-луп.
В нем находит переход на функцию вложенного перебора.
Запускает поиск внешнего элемента (пули) среди всех. (EACH)
Возвращает в ОЗУ все положенные данные из полей
Ловит запрос на коллизии с методом STOP. Начинает внутри своих данных руководствуясь группами коллизий (EntityType) перебор, проверяя по сути тот же Distance и... ничего не делая, кроме как останавливая объект, т.е. никакие доп. вычисления траектории обтекания и пр. не происходят!

А теперь вопрос на засыпку: на(забанено) мучать скрипт-машину блитца лишние n раз, да еще и вложенным перебором? (;

FrankH 10.02.2008 01:52

Ответ: Вопрос про наболевшее - коллизии.
 
Кто пробовал, заметен прирост на деле, при например обработке 50ти пуль? Стоит ли пробовать менять на коллизию?

tormoz 10.02.2008 02:37

Ответ: Вопрос про наболевшее - коллизии.
 
Стоит


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot