forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Вопрос про наболевшее - коллизии. (http://forum.boolean.name/showthread.php?t=5702)

HolyDel 08.02.2008 21:53

Ответ: Вопрос про наболевшее - коллизии.
 
Jimon имел ввиду секционную разбивку. которую в идеале надо делать. и кстати, как седлать ее в блице - хз. хотя я писал либу.

jimon 08.02.2008 21:57

Ответ: Вопрос про наболевшее - коллизии.
 
оффтоп на тему blitz3d :)

эх ... или блиц3д так отстал от жизни ... или я торможу ...
имхо я бы написал етот код так ... может я и не прав .. но я пишу на blitzmax

архитектурные условия :
1) пуля ето такой же TWorldObject как и нпс и все остальное
2) у нас есть WorldManager у которого есть CollisionManager
3) CollisionManager работает по запросам, все TWorldManager
кидают в него запросы, а потом он всё ето обрабатывает
и хранит список обработаных запросов
4) у TWorldManager есть метод RemoveObject(obj:TWorldObject)
5) у TBulletObject есть метод CreateBoom()

в таком окружении метод Update у TBulletObject будет так выглядеть :
Код:

Method Update()
 UpdatePhysic()

 Local collision:TCollisionRequest = WorldManager.GetCollisionRequest(...)
 if collision.objects.Count() > 0 then
  local obj:TWorldObject = TWorldObject(collision.objects.First())
  if obj.HpEnable = 1 then obj.Attack(BulletAtack)
  CreateBoom()
  WorldManager.RemoveObject(self)
  return
 end if

 if (Millisecs() - createdtime) > 5000 then
  WorldManager.RemoveObject(self)
  return
 end if
End Method

ну и при каких еще условиях надо удалять переменую, а ?

пуля в любых условиях существования удаляется в двух случаях :
1) c чем-то ударились
2) улетели далеко (на первой космической и вращаемся на орбите)

потому ИМХО их СВОИХ взглядов я не вижу смысла
вводить такую переменую удаления ...
а то пуля будет колизится с кучей обьектов и всех поубивает и только
потом удалится

с моей точки зрения такой примитивизм blitz3d показывает что ооп в blitzmax рулз :)

HolyDel 08.02.2008 22:09

Ответ: Вопрос про наболевшее - коллизии.
 
элементарно Ватсон, ввели какую нибудь магию которая удаляет ВСЕ пули в некотором радиусе.

tormoz 08.02.2008 22:34

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

ну и при каких еще условиях надо удалять переменую, а ?

пуля в любых условиях существования удаляется в двух случаях :
1) c чем-то ударились
2) улетели далеко (на первой космической и вращаемся на орбите)

потому ИМХО их СВОИХ взглядов я не вижу смысла
вводить такую переменую удаления ...
а то пуля будет колизится с кучей обьектов и всех поубивает и только
потом удалится

с моей точки зрения такой примитивизм blitz3d показывает что ооп в blitzmax рулз
Ерунду написал
На блитц3д без всяких ооп и так все работает быстро и четко если код грамотно построен
За один проход цикла она никак "всех поубивает"
На коллижн ставим стоп и удаляем
Какие проблемы ?

зы. все эти холливары исключительно от недостатка опыта и буйной фантазии. :))))

HolyDel 08.02.2008 22:51

Ответ: Вопрос про наболевшее - коллизии.
 
с коллизиями да. а если без них?

DEGABB 09.02.2008 00:26

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от jimon (Сообщение 76660)
оффтоп на тему blitz3d :)

эх ... или блиц3д так отстал от жизни ... или я торможу ...
имхо я бы написал етот код так ... может я и не прав .. но я пишу на blitzmax

архитектурные условия :
1) пуля ето такой же TWorldObject как и нпс и все остальное
2) у нас есть WorldManager у которого есть CollisionManager
3) CollisionManager работает по запросам, все TWorldManager
кидают в него запросы, а потом он всё ето обрабатывает
и хранит список обработаных запросов
4) у TWorldManager есть метод RemoveObject(obj:TWorldObject)
5) у TBulletObject есть метод CreateBoom()

в таком окружении метод Update у TBulletObject будет так выглядеть :
Код:

Method Update()
 UpdatePhysic()

 Local collision:TCollisionRequest = WorldManager.GetCollisionRequest(...)
 if collision.objects.Count() > 0 then
  local obj:TWorldObject = TWorldObject(collision.objects.First())
  if obj.HpEnable = 1 then obj.Attack(BulletAtack)
  CreateBoom()
  WorldManager.RemoveObject(self)
  return
 end if

 if (Millisecs() - createdtime) > 5000 then
  WorldManager.RemoveObject(self)
  return
 end if
End Method

ну и при каких еще условиях надо удалять переменую, а ?

пуля в любых условиях существования удаляется в двух случаях :
1) c чем-то ударились
2) улетели далеко (на первой космической и вращаемся на орбите)

потому ИМХО их СВОИХ взглядов я не вижу смысла
вводить такую переменую удаления ...
а то пуля будет колизится с кучей обьектов и всех поубивает и только
потом удалится

с моей точки зрения такой примитивизм blitz3d показывает что ооп в blitzmax рулз :)

Ой-ой-ой! Что тут началось, из-за того, что я не полностью описал проблему. Ситуация гораздо проще:
1) Вид сверху! (Почти 2D), поэтому ни про какую траекторию пули не надо заморачиваться.
2) Скорость пули тоже постоянна.
3) Боты двигаются в одной плоскости с пулей (т.е. почти земле), поэтому она всегда врежется либо в бота, либо в ограждение уровня, либо в другую пулю. При любом столкновении (как это написать?) она исчезнет.
4) Говорят, что при движении и ботов, и пули следует создавать 2 коллизии: бот-пуля и пуля-бот, так вот! ещё и не понятно, почему иногда срабатывает одна, иногда - другая коллизия? :(
5) Все боты относятся к типу tank и двигаются-думают в цикле:
For bot.tank=Each tank
.....
Next
Где лучше проверять коллизию? В Этом цикле или в общем "игровом" цикле?
6) Даже на такую строчку (неважно, где она написана, либо внутри цикла ботинков, либо внутри игрового цикла):
If (EntityDistance# (player1\bul,bot\ent))<2 Then Stop
BB выдаёт ошибку "переменная должна быть типом"

[player1\bul - сам кубик пули, созданный примитивным
player1\bul=CreateCube()
а вот bot\ent созданна через
bot.tank=New tank
bot\ent=CreateCube()
где
Type tank
Field ent; entity
Field dir; direction-направление
Field sp#; скорость
End Type
и ничего больше]

Вобщем, как при попадании пули в бота убивать НУЖНОГО бота,
в то время как пуля должна сама исчезнуть при ЛЮБОМ попадании?

Ух! Вроде б вопрос-то несложный, но что-то запарился уже.

И ещё вопросик: почему обещанный HideEntity, который скрывает объект от глаз и КОЛЛИЗИЙ, иногда всё-таки срабатывает на коллизии EntityCollided?

dimond 09.02.2008 02:02

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от tormoz (Сообщение 76553)
используй не массивы, а типы (удобнее)

Но человек просил с массивом! не в моих принципах отвечать типа: чувак используй типы, они круче всех. А если ему Надо_было_только_с_массивом?
Вот я и набросал как это можно сделать, хочя и знал что лучше сделать через типы.

-=SCiP=- 09.02.2008 02:12

Ответ: Вопрос про наболевшее - коллизии.
 
Люди есть вариант. Не знаю как вы одобрите.!
Если сделать через EntityPickMode типа прицел направлен на объект. Сразу определяется в Dim какой это объект. И при нажатии выстрела просто вылетает пуля а объект удаляется. Это все без коллизии.
Но пуля должна двигается быстро чтоб не получилась объект удалился а пуля только настигла его!

tormoz 09.02.2008 02:14

Ответ: Вопрос про наболевшее - коллизии.
 
Блин
Делай с коллизиями без всяких дистанций- быстрее работает

Если хочешь дистанции, то придется обрабатывать внутри цикла пуль цикл ботов:

Код:

For o.shot=Each shot
 MoveEntity o\ent,0,0,o\speed
 
CollidedBot(o.shot)
o\time=o\time+1

If o\time>=400
  FreeEntity o\ent
  Delete o
endIf
Next

Function CollidedBot(o.shot)
For bot.tank=Each tank
 dist#=EntityDistance(o\ent,bot\ent)
 If dist<5
  BigBang(bot\ent) ;взрыв танка
  bot\del=1 ;флаг удаления танка
  o\time=400 ;флаг удаления пули
 endif
Next
End Function


dimond 09.02.2008 04:08

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от tormoz (Сообщение 76553)
Ерунда, а не код
высавил коллизию пуля-танк, а проверяешь танк-пуля

Обьясни в чем разница. Ведь работало правильно, поэтому не обратил особого внимания.

tormoz 09.02.2008 05:22

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от dimond (Сообщение 76697)
Обьясни в чем разница. Ведь работало правильно, поэтому не обратил особого внимания.

Collisions type_1,type_2,1,1

Коллизия происходит между первым и вторым типом
То есть, если движется первый тип, то коллизия будет, а если только второй - то нет

Твой код работал только тогда, когда танки двигались
Компрене ?

dimond 09.02.2008 05:47

Ответ: Вопрос про наболевшее - коллизии.
 
В том то и дело что не двигались. я просто натыкал неподвижных обьектов в пространстве. вот еще раз проверил, проверка всеравно срабатывает так.
---
При перемене местами типов коллизия не срабатывает.
так что зря ты это так поспешил с выводами.
возможно дело в том что счетчик для массива, а не как принято:
For s.shot=Each shot
...
if EntityCollided(s\entity,BOT_C) ...
...
Next
но я могу ошибаться

HolyDel 09.02.2008 17:20

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

Raiter 09.02.2008 19:16

Ответ: Вопрос про наболевшее - коллизии.
 
ы? я тоже думал что дистанс быстрее коллизии 0.о

tormoz 09.02.2008 20:08

Ответ: Вопрос про наболевшее - коллизии.
 
Цитата:

Сообщение от Raiter (Сообщение 76772)
ы? я тоже думал что дистанс быстрее коллизии 0.о

Проверь
Коллизия сфера-сфера работает быстрее дистанса
Особенно если много объектов - это заметно


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

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