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

Сообщение от jimon Посмотреть сообщение
оффтоп на тему 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?

Последний раз редактировалось DEGABB, 09.02.2008 в 00:44.
(Offline)
 
Ответить с цитированием