|
30.07.2009, 18:47
|
#1
|
Оператор ЭВМ
Регистрация: 02.07.2007
Сообщений: 47
Написано 0 полезных сообщений (для 0 пользователей)
|
Старая песня о главном: 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, поскольку его уже нет.
Не знаю что уже и делать с этим. Перепробовал много вариантов, но толку мало.
Если кто подскажет, как решить проблему или как обойтись без коллизии, буду очень благодарен.
|
(Offline)
|
|
30.07.2009, 19:01
|
#2
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: Старая песня о главном: 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 перебирать !!
|
(Offline)
|
|
30.07.2009, 20:23
|
#3
|
Оператор ЭВМ
Регистрация: 02.07.2007
Сообщений: 47
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Старая песня о главном: Collision
Сообщение от IGR
цикл в цикле не есть гуд !!
нада что то 1 перебирать !!
|
согласен, что не есть гуд, но у меня масив пуль против масива врагов. Одним циклом никак не получится.
|
(Offline)
|
|
30.07.2009, 20:55
|
#4
|
ПроЭктировщик
Регистрация: 22.07.2009
Адрес: Московский Метрополитен)))
Сообщений: 100
Написано 25 полезных сообщений (для 31 пользователей)
|
Ответ: Старая песня о главном: Collision
а почему не объявляешь циклы прям сразу в начале функции? так глюков меньше.
и кстати, если удаляешь пулю, удалять её нужно вместе с её типом, насколько помню. также и с врагом, если его нужно удалять, тоже.
то есть:
FreeEntity СамаПуля
Delete ТипСПулями
и кстати, с анимированными моделями коллизии вообще штука проблемная. по крайней мере у меня никогда не срабатывало. может лучше объявить для модели бота вначале какой-нть пивот для столкновений?
|
(Offline)
|
|
30.07.2009, 21:44
|
#5
|
Оператор ЭВМ
Регистрация: 02.07.2007
Сообщений: 47
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Старая песня о главном: Collision
Сообщение от DeadElf
а почему не объявляешь циклы прям сразу в начале функции? так глюков меньше.
|
не совсем понял. У меня целая функция выделена под циклы с коллизией.
Сообщение от DeadElf
и кстати, если удаляешь пулю, удалять её нужно вместе с её типом, насколько помню. также и с врагом, если его нужно удалять, тоже.
то есть:
FreeEntity СамаПуля
Delete ТипСПулями
|
Я так и делаю, просто не хотел загромождать пример.
Сообщение от DeadElf
и кстати, с анимированными моделями коллизии вообще штука проблемная. по крайней мере у меня никогда не срабатывало. может лучше объявить для модели бота вначале какой-нть пивот для столкновений?
|
У меня оно тоже страшно глючит.
Раньше пытался двигать простым боксом и коллизить им же, а анимированную модель через parent приклеить. Тоже не особо получалось.
|
(Offline)
|
|
30.07.2009, 23:07
|
#6
|
Оператор ЭВМ
Регистрация: 02.07.2007
Сообщений: 47
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Старая песня о главном: Collision
|
(Offline)
|
|
30.07.2009, 23:44
|
#7
|
Оператор ЭВМ
Регистрация: 02.07.2007
Сообщений: 47
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Старая песня о главном: Collision
Получилось что-то правдоподобное лишь в случае 3-единости врага:
1. пивот - отвечает за перемещение, и служит перентом для остальных 2х:
2. бокс (прозрачный) - за коллизию
3. аниммированная модель - для красоты )))
Если есть идеи получше, с удовольствием выслушаю
|
(Offline)
|
|
31.07.2009, 00:33
|
#8
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Старая песня о главном: Collision
Этот топ меня пугает, но пост №7 особенно
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Эти 8 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
|
|
31.07.2009, 01:18
|
#9
|
Разработчик
Регистрация: 09.12.2007
Сообщений: 376
Написано 83 полезных сообщений (для 122 пользователей)
|
Ответ: Старая песня о главном: 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
Я сделал так, помимо того необходимо обрабатывать пули и врагов отдельно друг от друга, и удалять бота не в снарядах а в обработке ботов. Так и быстрее и бот не будет исчезать посреди обработки снарядов.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.08.2009, 17:03
|
#10
|
Знающий
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений (для 133 пользователей)
|
Ответ: Старая песня о главном: Collision
Сложно сказать, много наворочено
Но проверять лучше пуля к боту, а бот об пулю ни к чему.
Если бот со скином, то нужно найти (FindChild) скин и ему назначать EntityType, это если нужно сфера к полигону. Если достаточно сфера к сфере, то коллизия будет по EntityRadius.
Вобщем есть смысл проверить все на кубиках ) , сразу найдешь что к чему.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.08.2009, 09:24
|
#11
|
Разработчик
Регистрация: 12.10.2008
Адрес: Самара
Сообщений: 437
Написано 55 полезных сообщений (для 92 пользователей)
|
Ответ: Старая песня о главном: Collision
да, шото странно) ведь у нас пуля с ботом коллизится а не бот с пулей) вот и вычисляй если пуля коснулась бота то убираем бота
__________________
Пекарня: Intel Core i3 - 3240(3.40Ghz), ram 8 gb, video Gigabyte Nvidia GeForce GTX 650 1gb
Лэптоп : Intel Core i3 - 2365(1.40Ghz), ram 4gb, video Int Intel HD3000(512mb)
Мой набор: 3ds Max 9 + Xors3d(Blitz3d) + Photoshop
|
(Offline)
|
|
07.08.2009, 04:00
|
#12
|
Оператор ЭВМ
Регистрация: 02.07.2007
Сообщений: 47
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Старая песня о главном: Collision
Сообщение от Terminator
да, шото странно) ведь у нас пуля с ботом коллизится а не бот с пулей) вот и вычисляй если пуля коснулась бота то убираем бота
|
Сообщение от Damp
Сложно сказать, много наворочено
Но проверять лучше пуля к боту, а бот об пулю ни к чему.
|
Эксперимент показывает, что еще даже как "к чему"
если бы это был обычный расстрел ботов, то всё было бы хорошо. А так всё движется, всё коллизится - и всё глючит
Сообщение от Damp
Если бот со скином, то нужно найти (FindChild) скин и ему назначать EntityType, это если нужно сфера к полигону. Если достаточно сфера к сфере, то коллизия будет по EntityRadius.
Вобщем есть смысл проверить все на кубиках ) , сразу найдешь что к чему.
|
С кубиками как раз всё работало нормально. А как только загрузил анимацию со скином и ее FindChild"ами, вот тут то всё и началось
|
(Offline)
|
|
03.10.2009, 18:11
|
#13
|
Нуждающийся
Регистрация: 29.08.2009
Адрес: Україна, Донецьк
Сообщений: 71
Написано 13 полезных сообщений (для 45 пользователей)
|
Ответ: Старая песня о главном: Collision
А зачем так над пулями шутить? Я понимаю, если бы были ракеты. Имхо, если стреляешь пулями ты, то лучше реализовывать через CameraPick, а если наоборот (в тебя шмалят боты), то лучше/легче всего так, как ты делал.
|
(Offline)
|
|
10.10.2009, 18:25
|
#14
|
Мастер
Регистрация: 27.01.2008
Адрес: Россия, СКФО, ЧР, Грозный
Сообщений: 1,144
Написано 578 полезных сообщений (для 2,207 пользователей)
|
Ответ: Старая песня о главном: Collision
Блин, чувак ну ты и коды пишешь. Зачем проверять на коллизию пули и бота, когда просто с помощью entitypickmode, camerapick весь этот процесс сделать. Если захочется еще предельное расстояние для пули поставить, используй entitydistance. И пожалуйста, читай справку, там всё написано, не знаешь английского, ищи на форуме справку на русском, и тогда вопросов будет меньше
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.10.2009, 21:54
|
#15
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Старая песня о главном: Collision
это для реалистичной баллистики, в жизньи ведь пули летят по траекторий как пушечные ядра.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:49.
|