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.


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

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