forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   EntityCollided, при движущихся навстречу друг другу объектах (http://forum.boolean.name/showthread.php?t=8866)

ELIAS 09.08.2009 20:58

EntityCollided, при движущихся навстречу друг другу объектах
 
В игре физ-двиг полностью основан на блитц-коллизиях. Меня они полностью устраивают - удобные, не тормозят, а по возможностям как-раз то что необходимо для моего сромненького проекта.
Единственное пока я не могу замутить на них, это определять столкновение, когда объекты движутся НАВСТРЕЧУ ДРУГ ДРУГУ!

Ну а надо делать движущиеся препятствия, двигающиеся колючки, враги в конце концов. Как-то можно обойтись кончено и entitydistance`ом. Но это очень ограничивает меня! А если припятствие вытянутое, или вообще форма какая-нибудь непростая + с отверстиями.

А блитц-коллизии глючат лично у меня в выше описанном случае. Наверно надо как-нибудь выдумывать искусственный метод обхода такой четровщины. Хотелось бы узнать если кто с этим встречался, то что получилось изобрести на этот счет. Или просто мнение каждого из вас что может быть полезнам в этом случае?..

Использовать сторонние ДЛЛ крайне не желательно. Ведь такая казалось ерунда осталось, а так весь физ-двиг уже готов. :(

BlackDragon 09.08.2009 22:10

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
1) В 1-м кадре перемещай врагов, во втором угрока - в итоге получаем коллизию со статичными обьектами.
2) На сильновытянутых обьектах можно расставить виртуальные точки (если лень перещитывать координаты, или в уровне мало энтити, то можно использовать пивоты), и измерять дистанцию между ними и игроком.
3) Чтото пока больше ниче в голову не приходит

ELIAS 29.08.2009 18:18

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Не получилось ничего(((
Вот семпл-код

Код:

Graphics3D 800, 600, 16, 2

lit=CreateLight()

cam=CreateCamera()


Collisions 1,2,2,3

player=CreateSphere() : ScaleMesh player, 50,50,50
EntityRadius player, 50 : EntityType player, 1

enemy=CreateCube() : ScaleMesh enemy, 50,50,50
EntityType player, 2
MoveEntity enemy, 0,0, 300

PositionEntity cam, 0,700,00
PointEntity cam, player




Repeat
       
        If KeyDown(200) Then MoveEntity player,0,0,1
       
        If KeyDown(208) Then MoveEntity enemy,0,0,-1
       
       
       
        UpdateWorld
        RenderWorld
       
       
        If EntityCollided(player,2)>0 Then Text 20,20, "Игрок сколлизился с врагом!"
        If EntityCollided(enemy,1)>0 Then Text 20,40, "Враг сколлизился с игрком!"
       
        Flip 60
       
Until KeyHit(1)

End

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

существует три основных ситуации:
1) враг стоит, игрок движется на него.
2) враг движется на игрока, игрок стоит.
3) враг и игрок движутся навстречу друг другу.

Ну и надо чтобы в любом из этих случаев безошибочно определялся момент когда игрок и враг сколлизились. В дангом семпле нужно чтобы высвечивались соотвествующие надписи.
В этом семпле, странно, вообще чего то не получилось...((( А в игре у меня коллизии определяются в 1 и 3 случаях, а вот во 2, если игрок стоит - то враг проходит сквозь игрока - и ничего:(((


Ну вообщем, прошу поправить код таким образом, чтобы все три случая определялись. Пользоваться внешними длл - нельзя, только блитц коллижн.

Заранее спасибо!

tormoz 29.08.2009 21:08

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Код:

Graphics3D 800, 600, 16, 2

lit=CreateLight()

cam=CreateCamera()




player=CreateSphere()
ScaleMesh player, 50,50,50
EntityRadius player, 50
EntityType player, 1

enemy=CreateCube() : ScaleMesh enemy, 50,50,50
EntityType enemy, 2
EntityRadius enemy, 50
MoveEntity enemy, 0,0, 300

PositionEntity cam, 0,700,00
PointEntity cam, player

Collisions 1,2,2,3
Collisions 2,1,2,3

Repeat
        UpdateWorld
        If KeyDown(200) Then MoveEntity player,0,0,1
       
        If KeyDown(208) Then MoveEntity enemy,0,0,-1
       
       
       
       
        RenderWorld
       
       
        If EntityCollided(player,2)>0 Then Text 20,20, "Игрок сколлизился с врагом!"
        If EntityCollided(enemy,1)>0 Then Text 20,40, "Враг сколлизился с игрком!"
       
        Flip 60
       
Until KeyHit(1)

End


ELIAS 30.08.2009 00:00

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
tormoz, спасибо, но мне нужно чтобы враг по полигонам просчитывался... это ту простой пример - а на деле будут враги не совсем правильной формы + в большей части это даже будет использоваться для различных колючек - ну а они уж будут совсем разнообразной формы и при этом ещё будут двигаться.

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

Ещё могут быть варианты, или при таком раскладе это уже выходит за границы блитца???


Мне кстати понравилась идея ЧерногоДракона про
1) В 1-м кадре перемещай врагов, во втором угрока - в итоге получаем коллизию со статичными обьектами.
Но у меня не получилось сделать такое, к примеру этот же самый код, как бы я реализовывал идею ЧерногоДракона:

Код:

Graphics3D 800, 600, 16, 2

lit=CreateLight()

cam=CreateCamera()


Collisions 1,2,2,3

player=CreateSphere() : ScaleMesh player, 50,50,50
EntityRadius player, 50 : EntityType player, 1

enemy=CreateCube() : ScaleMesh enemy, 50,50,50
EntityType player, 2
MoveEntity enemy, 0,0, 300

PositionEntity cam, 0,700,00
PointEntity cam, player




Repeat
        val=Not val
       
        If KeyDown(200) And val=0 Then MoveEntity player,0,0,1
       
        If val=1 Then MoveEntity enemy,0,0,-1
       
       
       
        UpdateWorld
        RenderWorld
       
       
        If EntityCollided(player,2)>0 Then Text 20,20, "Игрок сколлизился с врагом!"
        If EntityCollided(enemy,1)>0 Then Text 20,40, "Враг сколлизился с игрком!"
       
        Flip 60
       
Until KeyHit(1)

End

вот так. ну почему то не работает. почему??? у меня по этому поводу вообще идей нет!!! что за странности...

MiXaeL 30.08.2009 00:07

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Коллизии для движущегося объекта в блитце всегда должны проверяться по сфере.
Если уж очень надо используй MeshesIntersect и упрощенные меши для своих моделей. А то тормозить будет.

BlackDragon 30.08.2009 00:21

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Код:

Collisions 1,2,2,3
Collisions 2,1,2,3    <-  Во-вторых, враг во время своего хода может поглотить сферу игрока и коллизи не будет

player=CreateSphere() : ScaleMesh player, 50,50,50
EntityRadius player, 50 : EntityType player, 1

enemy=CreateCube() : ScaleMesh enemy, 50,50,50
EntityType enemy, 2    <- Во-первых внимательнее надо быть
EntityRadius enemy, 50<-  Во-вторых, враг во время своего хода может поглотить сферу игрока и коллизи не будет

Ну а если враги очень сложной формы, то надо извратиться и написать свой коллижен детекше. Все зависит от конкретных условий.

UPD: Вообщем фигня какаято получается, подумай сам.

ELIAS 30.08.2009 12:04

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Спасибо, BlackDragon, а я совсем не так понимал раньше коллизии... я думал что они как раз и проверяют пересечение 3-х мерных фигур, теперь все ясно - теперь понятно почему код не работает...Именно из-за взаимного проникновения мешей... Да и невнимательность, особенно с копи-пастом - часто подводит:)))

MiXaeL, спасибо, за эту штуковину, я раньше и не знал о такой команде!!! MeshIntersect - вот мое спасение!!! В этом коде получилось все устроить как нужно, сейчас буду с игрой заниматься - посмотрим на сколько производительность упадет... надеюсь несильно. а насчет упрощенных мешей - это само собой понятно, ещё с моддерства на gta vice city это знаю и активно использую в игре - все что можно упрощаю:)))


Кстати вопрос...В блитце коллизиях вместо "сфера" говорится "эллипсоид" - ну а я так понял что сферу вытянуть в нем нельзя, хотя очень бы хотелось...

MiXaeL 30.08.2009 15:09

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Сферу коллизии можно вытягивать в блитце (с версии 1.69, если не ошибаюсь) но только по одной оси - Y. Почитай хелп к EntityRadius.

ELIAS 30.08.2009 16:54

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Точно! спасибо, михаил!

Dream 30.08.2009 23:16

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
хмм... а чегоэто тока по У?
EntityRadius entity,x_radius#,y_radius#
вытягивай хоть по х хоть по у
или я не прав О_О

ABTOMAT 31.08.2009 13:53

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Цитата:

или я не прав О_О
Первый параметр растягивает в двух осях - х и z
Т.е. вытянуть в сторону не получится

Dream 31.08.2009 15:06

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
ну если вытянуть по конкретно оси Х или З то получился коечно похожее на Х...

Ky3R_94 31.08.2009 16:38

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Оу, люди... Если вы не против... То у меня проблема аналогичного плана. Как сделать так чтобы один объект мог толкать другой? Ну например, как лифт поднимает игрока вверх. Вариант с проверкой коллизии и последующим движением игрока со скоростью лифта в соответствующем направлении не катит, так как возможно использование параллельно других типов объектов, типа каких нибудь поинтов висящих в воздухе. Да и вообще имхо маразм прицепиться к лифту сбоку и взмыть на небеса =^)

MiXaeL 31.08.2009 17:23

Ответ: EntityCollided, при движущихся навстречу друг другу объектах
 
Используйте физикс и не парьтесь зря)

Но если физикс совсем не хочется юзать, и круче лифтов ничего не надо, то можно посмотреть сюда - http://forum.boolean.name/showthread.php?t=38

УПД. Ссылка там битая, у Импера в личку попросите, если надо.


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

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