Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 08.02.2008, 02:14   #1
DEGABB
AnyKey`щик
 
Регистрация: 03.01.2007
Сообщений: 6
Написано 0 полезных сообщений
(для 0 пользователей)
Вопрос про наболевшее - коллизии.

Есть игрок с возможностью стрелять снарядами (их полёт виден) и боты, каждый из которых входит в массив типа tank.
Как определить, при обработке коллизий "снаряд-бот", кто из ботов столкнулся со снарядом, если все они относятся к одному типу коллизий (CONST BOT_C=1).
Т.е. при столкновении снаряда и объекта типа BOT_C возникает коллизия с ботом, но как узнать кто из целого массива ботов её создал (и затем удалить только этого бота)?
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 03:32   #2
dimond
Оператор ЭВМ
 
Регистрация: 14.09.2007
Сообщений: 27
Написано 2 полезных сообщений
(для 5 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

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

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
проверено, удаляется только "подстреленый" элемент массива.
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 04:24   #3
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

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

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
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
IGR (08.02.2008)
Старый 08.02.2008, 04:31   #4
Raiter
Гигант индустрии
 
Регистрация: 04.08.2006
Сообщений: 2,642
Написано 53 полезных сообщений
(для 92 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

А можно вообще не юзать коллизию, а юзать EntityDistance
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 10:58   #5
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

Да, согласен с Raiter -ом. вот тока так по хитрому (через object/handle) уже не выбереш нужный элемент. придется перебирать.
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 12:46   #6
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

Проблемка возникнет с быстрыми объектами
Если будет юзаться физ движок, (PhysX), тогда триггерами проверять.
И можно без перебора получить будет объект, в которого попали.
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 12:54   #7
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

Я вообще бы рекомендовал проверять на пересечение отрезка со сферой. давно выкладывал ф-ии.
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 13:13   #8
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

tormoz, спасиб !!
меня этот код направил на очень умную мисль !!
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 14:54   #9
Crystal
Терабайт исходников
 
Аватар для Crystal
 
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений
(для 5,374 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

Кусок моего кода

    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
__________________
Проект "Deathbring World - Rangers" и его финансовая поддержка:
https://boosty.to/deathbringrangers

Я на - TWITCH
Канал на YouTube
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 15:10   #10
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

этот кусок был выдран небрежно.
почему без цикла o ?
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 15:53   #11
Crystal
Терабайт исходников
 
Аватар для Crystal
 
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений
(для 5,374 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

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

    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
__________________
Проект "Deathbring World - Rangers" и его финансовая поддержка:
https://boosty.to/deathbringrangers

Я на - TWITCH
Канал на YouTube
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 15:59   #12
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

вот почему:
    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
все что выделено - непонятно что к чему.
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 16:29   #13
jimon
 
Сообщений: n/a
Ответ: Вопрос про наболевшее - коллизии.

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
 
Ответить с цитированием
Старый 08.02.2008, 16:43   #14
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

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

проще написать так да ?
нет. цикл перейдет на следующую ветку обработки врага и вылетит (так как эта пулька уже удалена, и сравнивать не с чем)
(Offline)
 
Ответить с цитированием
Старый 08.02.2008, 16:51   #15
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Вопрос про наболевшее - коллизии.

Дык, добавь перед последним Endif, Exit.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
коллизии в 2.5D cheaters-hater 2D-программирование 11 07.07.2009 00:33
Уже наболевшее.. Samarik 3D-программирование 41 20.07.2008 03:22
Вопрос про коллизии TG 3D-программирование 6 09.11.2007 01:39
Коллизии Stalnoy_Gvozd' 3D-программирование 6 30.08.2007 15:56
Вопрос по коллизии Fant 3D-программирование 24 03.11.2005 10:34


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com