forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Старая песня о главном: Collision (http://forum.boolean.name/showthread.php?t=8808)

FLashMP 30.07.2009 18:47

Старая песня о главном: Collision
 
Перерыл много материала на форуме, но ответа так и не нашел. Возможно плохо искал, но все же прошу помощи, ибо уже 3й день мучусь...

есть коллизия:
Collisions CBullet,CEnemy,3,2 ;3,1;2,2 (пробовал разные варианты)
Collisions CEnemy,CBullet,3,3 ;3,1;2,2

есть анимированные модели, которые движутся на игрока:
enemy.Tenemy = New Tenemy
enemy\ent = CopyEntity(enemyTypes\ent)
EntityType enemy\ent,CEnemy,True
enemy\anim = FindChild(enemy\ent,"Sphere01")
Animate enemy\anim,1,2
Next

есть обработка коллизии:
Function OnCollision()
;for enemies
For enemy.TEnemy = Each TEnemy
If EntityCollided(enemy\ent,CBullet) Then
GameInfo\score=GameInfo\score+50
For bullet.Tbullet = Each TBullet
If EntityCollided( bullet\ent,CEnemy) Then
DeleteBullet()
DeleteEnemy()
EndIf
Next
EndIf
Next


;bullets to enemies
For bullet.Tbullet = Each TBullet
If EntityCollided( bullet\ent,CEnemy) Then
DebugLog "12345"
For enemy.TEnemy = Each TEnemy
If (EntityCollided(enemy\ent,CBullet)) Then
GameInfo\score=GameInfo\score+50
DeleteBullet()
DeleteEnemy()
;DebugLog "collided"
EndIf
Next
EndIf
Next

End Function

И пули и враги движутся одновременно.
Проблема в том, что это всё очень коряво работает, а именно: если пуля попадает в центр модели врага, то он с горем пополам удаляется и все работает. Но если же пуля проходит чуть сбоку, то начинает скользить по нему и коллизия вроде бы как и срабатывает (поскольку есть скольжение), но никакое удаление ни пули ни врага не происходит.
+ если одновременно в одного врага попадают 2 пули, выбивает ошибку, что не может удалить enemy\ent, поскольку его уже нет.
Не знаю что уже и делать с этим. Перепробовал много вариантов, но толку мало.
Если кто подскажет, как решить проблему или как обойтись без коллизии, буду очень благодарен.

IGR 30.07.2009 19:01

Ответ: Старая песня о главном: Collision
 
Цитата:

For bullet.Tbullet = Each TBullet
If EntityCollided( bullet\ent,CEnemy) Then
DebugLog "12345"
For enemy.TEnemy = Each TEnemy
If (EntityCollided(enemy\ent,CBullet)) Then
GameInfo\score=GameInfo\score+50
DeleteBullet()
DeleteEnemy()
;DebugLog "collided"
EndIf
Next
EndIf
Next
цикл в цикле не есть гуд !!
нада что то 1 перебирать !! :)

FLashMP 30.07.2009 20:23

Ответ: Старая песня о главном: Collision
 
Цитата:

Сообщение от IGR (Сообщение 112506)
цикл в цикле не есть гуд !!
нада что то 1 перебирать !! :)

согласен, что не есть гуд, но у меня масив пуль против масива врагов. Одним циклом никак не получится. :dontknow:

DeadElf 30.07.2009 20:55

Ответ: Старая песня о главном: Collision
 
а почему не объявляешь циклы прям сразу в начале функции? так глюков меньше.
и кстати, если удаляешь пулю, удалять её нужно вместе с её типом, насколько помню. также и с врагом, если его нужно удалять, тоже.
то есть:
FreeEntity СамаПуля
Delete ТипСПулями


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

FLashMP 30.07.2009 21:44

Ответ: Старая песня о главном: Collision
 
Цитата:

Сообщение от DeadElf (Сообщение 112536)
а почему не объявляешь циклы прям сразу в начале функции? так глюков меньше.

не совсем понял. У меня целая функция выделена под циклы с коллизией.

Цитата:

Сообщение от DeadElf (Сообщение 112536)
и кстати, если удаляешь пулю, удалять её нужно вместе с её типом, насколько помню. также и с врагом, если его нужно удалять, тоже.
то есть:
FreeEntity СамаПуля
Delete ТипСПулями

Я так и делаю, просто не хотел загромождать пример. :rolleyes:


Цитата:

Сообщение от DeadElf (Сообщение 112536)
и кстати, с анимированными моделями коллизии вообще штука проблемная. по крайней мере у меня никогда не срабатывало. может лучше объявить для модели бота вначале какой-нть пивот для столкновений?

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

FLashMP 30.07.2009 23:07

Ответ: Старая песня о главном: Collision
 
Реализовал сия проект через пивот. Эффект тот же: пуля почему-то скользит по поверхности врага, а обработку явления коллизии отловить не могу :( :( :(

FLashMP 30.07.2009 23:44

Ответ: Старая песня о главном: Collision
 
Получилось что-то правдоподобное лишь в случае 3-единости врага:
1. пивот - отвечает за перемещение, и служит перентом для остальных 2х:
2. бокс (прозрачный) - за коллизию
3. аниммированная модель - для красоты :))))

Если есть идеи получше, с удовольствием выслушаю :)

ABTOMAT 31.07.2009 00:33

Ответ: Старая песня о главном: Collision
 
Этот топ меня пугает, но пост №7 особенно

FrankH 31.07.2009 01:18

Ответ: Старая песня о главном: Collision
 
Цитата:

если одновременно в одного врага попадают 2 пули, выбивает ошибку, что не может удалить enemy\ent, поскольку его уже нет
Код:

    obi=(EntityCollided(all\mesh,2))
        If obi Then
          If obi<>all\parent Then

                If all\typ=1 LP#=GP1_power# Else If all\typ=2 LP#=GP2_power# Else If all\typ=3 LP#=GP3_power# Else If all\typ=4 LP#=GP4_power# Else If all\typ=5 LP#=GP5_power#
                u.Unit=Object.Unit(EntityName(obi))
                If u\pivot<>0 Then
                    tmpuron=(LP#*.01*(100-u\shield))
                    u\health#=u\health#-tmpuron;If u\plr=0
                    u\speed#=u\speed#*.6
                    If all\plr Then player_score=player_score+tmpuron
                    CrtPShotSpark(all\mesh,EntityYaw(all\mesh),EntityPitch(all\mesh),200,all\typ)
                    obx=1
                EndIf
            Else
                ResetEntity all\mesh
            EndIf
        EndIf

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

Damp 02.08.2009 17:03

Ответ: Старая песня о главном: Collision
 
Сложно сказать, много наворочено :)
Но проверять лучше пуля к боту, а бот об пулю ни к чему.
Если бот со скином, то нужно найти (FindChild) скин и ему назначать EntityType, это если нужно сфера к полигону. Если достаточно сфера к сфере, то коллизия будет по EntityRadius.
Вобщем есть смысл проверить все на кубиках ) , сразу найдешь что к чему.

Colossus 06.08.2009 09:24

Ответ: Старая песня о главном: Collision
 
да, шото странно) ведь у нас пуля с ботом коллизится а не бот с пулей) вот и вычисляй если пуля коснулась бота то убираем бота

FLashMP 07.08.2009 04:00

Ответ: Старая песня о главном: Collision
 
Цитата:

Сообщение от Terminator (Сообщение 113192)
да, шото странно) ведь у нас пуля с ботом коллизится а не бот с пулей) вот и вычисляй если пуля коснулась бота то убираем бота

Цитата:

Сообщение от Damp (Сообщение 112778)
Сложно сказать, много наворочено :)
Но проверять лучше пуля к боту, а бот об пулю ни к чему.

Эксперимент показывает, что еще даже как "к чему" :-D
если бы это был обычный расстрел ботов, то всё было бы хорошо. А так всё движется, всё коллизится - и всё глючит :-D

Цитата:

Сообщение от Damp (Сообщение 112778)
Если бот со скином, то нужно найти (FindChild) скин и ему назначать EntityType, это если нужно сфера к полигону. Если достаточно сфера к сфере, то коллизия будет по EntityRadius.
Вобщем есть смысл проверить все на кубиках ) , сразу найдешь что к чему.

С кубиками как раз всё работало нормально. А как только загрузил анимацию со скином и ее FindChild"ами, вот тут то всё и началось :crazy:

Ky3R_94 03.10.2009 18:11

Ответ: Старая песня о главном: Collision
 
А зачем так над пулями шутить? Я понимаю, если бы были ракеты. Имхо, если стреляешь пулями ты, то лучше реализовывать через CameraPick, а если наоборот (в тебя шмалят боты), то лучше/легче всего так, как ты делал.

Hurrit 10.10.2009 18:25

Ответ: Старая песня о главном: Collision
 
Блин, чувак ну ты и коды пишешь. Зачем проверять на коллизию пули и бота, когда просто с помощью entitypickmode, camerapick весь этот процесс сделать. Если захочется еще предельное расстояние для пули поставить, используй entitydistance. И пожалуйста, читай справку, там всё написано, не знаешь английского, ищи на форуме справку на русском, и тогда вопросов будет меньше

NitE 10.10.2009 21:54

Ответ: Старая песня о главном: Collision
 
это для реалистичной баллистики, в жизньи ведь пули летят по траекторий как пушечные ядра.


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

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