|
3D-программирование Вопросы, касающиеся программирования 3D мира |
08.02.2008, 02:14
|
#1
|
AnyKey`щик
Регистрация: 03.01.2007
Сообщений: 6
Написано 0 полезных сообщений (для 0 пользователей)
|
Вопрос про наболевшее - коллизии.
Есть игрок с возможностью стрелять снарядами (их полёт виден) и боты, каждый из которых входит в массив типа tank.
Как определить, при обработке коллизий "снаряд-бот", кто из ботов столкнулся со снарядом, если все они относятся к одному типу коллизий (CONST BOT_C=1).
Т.е. при столкновении снаряда и объекта типа BOT_C возникает коллизия с ботом, но как узнать кто из целого массива ботов её создал (и затем удалить только этого бота)?
|
(Offline)
|
|
08.02.2008, 03:32
|
#2
|
Оператор ЭВМ
Регистрация: 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
|
Гигант индустрии
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.02.2008, 04:31
|
#4
|
Гигант индустрии
Регистрация: 04.08.2006
Сообщений: 2,642
Написано 53 полезных сообщений (для 92 пользователей)
|
Ответ: Вопрос про наболевшее - коллизии.
А можно вообще не юзать коллизию, а юзать EntityDistance
|
(Offline)
|
|
08.02.2008, 10:58
|
#5
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Вопрос про наболевшее - коллизии.
Да, согласен с Raiter -ом. вот тока так по хитрому (через object/handle) уже не выбереш нужный элемент. придется перебирать.
|
(Offline)
|
|
08.02.2008, 12:46
|
#6
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Вопрос про наболевшее - коллизии.
Проблемка возникнет с быстрыми объектами
Если будет юзаться физ движок, (PhysX), тогда триггерами проверять.
И можно без перебора получить будет объект, в которого попали.
|
(Offline)
|
|
08.02.2008, 12:54
|
#7
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Вопрос про наболевшее - коллизии.
Я вообще бы рекомендовал проверять на пересечение отрезка со сферой. давно выкладывал ф-ии.
|
(Offline)
|
|
08.02.2008, 13:13
|
#8
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: Вопрос про наболевшее - коллизии.
tormoz, спасиб !!
меня этот код направил на очень умную мисль !!
|
(Offline)
|
|
08.02.2008, 14:54
|
#9
|
Терабайт исходников
Регистрация: 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
|
(Offline)
|
|
08.02.2008, 15:10
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Вопрос про наболевшее - коллизии.
этот кусок был выдран небрежно.
почему без цикла o ?
|
(Offline)
|
|
08.02.2008, 15:53
|
#11
|
Терабайт исходников
Регистрация: 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
|
(Offline)
|
|
08.02.2008, 15:59
|
#12
|
☭
Регистрация: 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
|
|
Ответ: Вопрос про наболевшее - коллизии.
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
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Вопрос про наболевшее - коллизии.
jimon, ты издеваешся?
как будет не_программер писать деревья разбивки?
нет. цикл перейдет на следующую ветку обработки врага и вылетит (так как эта пулька уже удалена, и сравнивать не с чем)
|
(Offline)
|
|
08.02.2008, 16:51
|
#15
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Вопрос про наболевшее - коллизии.
Дык, добавь перед последним Endif, Exit.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
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, время: 19:09.
|