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=1786)

ЛысыЙ_Чук-Иванчук 25.10.2006 20:41

Дыры от ПУЛЬ !!!
 
Как можно сделать чтобы попала пуля в дверь остался след:) , затем пуля не просто сдыхает:) а перемещяется дальше и выходит из двери:) остоется след:) , попадает в бота и тот сдыхает:) . Всмысле мне не недо говорить как сделать след от пулиB) , А чтобы ана могла проходить с квозь стену и колизия работала.:dontknow:

И зачем нужна команда EntityBox:dontknow:

Raiter 25.10.2006 20:46

Re: Дыры от ПУЛЬ !!!
 
не понял. что тебе надо? если ты хочешь что-бы пуля проходила сквозь стену, то им не нужна колизия. дырки рисуй спрайтами. или я неправильно тебя понял....

ZanoZa 25.10.2006 21:04

Re: Дыры от ПУЛЬ !!!
 
да. дыры спрайтами, пулю,при соприкосновении с дверью, просто перемещаешь по траектори не много дальше(учитывая толщину двери) и всё.

impersonalis 25.10.2006 23:08

Re: Дыры от ПУЛЬ !!!
 
Зачем тогда коллизия?
Если хочешь фиксировать акт коллизи без реакции системы, то поставь в Collisions response в ложь.

ЛысыЙ_Чук-Иванчук 26.10.2006 09:37

Re: Дыры от ПУЛЬ !!!
 
Цитата:

Зачем тогда коллизия?
Если хочешь фиксировать акт коллизи без реакции системы, то поставь в Collisions response в ложь.
Незнаю чегото не получается.

Platon 26.10.2006 13:24

Re: Дыры от ПУЛЬ !!!
 
После определения коллизии пули со стенкой, ставь на нее спрайт дырки, потом отключай коллизию пули с помощью EntityType() - второй параметр на 0 поставь, потом двигай пулю вперед, потом опять ставь EntityType() такой, который был до этого. Ну и так с каждой стенкой, пока энергия пули не иссякнет :)

ЛысыЙ_Чук-Иванчук 26.10.2006 22:54

Re: Дыры от ПУЛЬ !!!
 
Принцип понял. Но после того как остается первая дыра пуля не проверяется на столкновение. Буду парится если так и не получится то буду просить помощи.

Nunan 27.10.2006 00:00

Re: Дыры от ПУЛЬ !!!
 
Я предлогаю другой принцип:
надо выпускать не одну а две пули (вторую можно просто - pivot), одна будет с колизией относительно стен, а другая относительно людей-ботов.
Когда эта двойная пуля летит то есть два варианта:
- она попадает в стену, одна остаётся, вторая летит дальше, и создаётся опять пуля(с колизией относительно стен)...
- когда пуля (с колизией относительно ботов) попадет в тело то делается необходимый просчет попадания (урон, спраиты всякие)... И можно сделать чтобы пуля после пробивания тела летела дольше...
При попаданиях пули (первой или второй) уменьшается число её силы и когда она очередной раз врезалась то просто удаляешь её.

Программа по моему типа такой:
(пуля состоит из двух частей пуля1 и пуля2 )
Пуля
Пуля1
Пуля2

For i=1 to (количество пуль)
if (пуля существует) then

if (пуля1 не существует) then (Создать пулю1)
if (пуля2 не существует) then (Создать пулю2)

if (пуля1 врезалась) then
(Поросчёт следвия попадания...)
(удалить пулю1)
end if
if (пуля2 врезалась) then
(Поросчёт следвия попадания...)
(удалить пулю2)
end if

MoveEntity (обе пули),0,0,+0.01

end if
next

Platon 27.10.2006 03:15

Re: Дыры от ПУЛЬ !!!
 
А вообще, лучше попадание пули проверять с помощью CameraPick(), так как скорость пули большая, и ею можно пренебречь. А например для крупнокалиберных снарядов (гранаты, ракеты) уже делать проверку коллизией.
Принцип действия с CameraPick() примерно такой же:
Код:

;Обнуляем стек стенок :)
;В который потом будем складывать все "прошитые" пулей стенки
Wall_Stack(0) = 0
;собственно пикаем
If MouseHit(1) Then
        ;Запоминаем координаты, куда мы пикнули
        mx = MouseX()
        my = MouseY()
        ;Пикаем по координатам
        Pick = CameraPick(Camera, mx,my)
;Метка для цикла проверки
.LoopPick
        ;Уменьшаем энергию пули
        Bullet_Energy = Bullet_Energy - 1
        ;Если энергия пули не иссякла
        If (Bullet_Energy > 0) Then
                ;Начинаем проверку того, во что попали
                ;Если это стенка
                If (Pick = Wall) Then
                        ;Здесь ставим спрайт дырки на стенку
                        ;Запоминаем "пикнутую" стенку в стек
                        ;Первый элемент массива используем как счетчик
                        ;Чтобы избежать лишних переменных
                        Wall_Stack(0) = Wall_Stack(0) + 1
                        Wall_Stack(Wall_Stack(0)) = Pick
                        ;Потом убираем проверку пика у всех стенок на пути следования пули
                        For i = 1 To Wall_Stack(0)
                                EntityPickMode(Wall_Stack(i), 0)
                        Next
                        ;Опять пикаем те же координаты
                        Pick = CameraPick(pPlayer\Head, mx,my)
                        ;Возвращаем проверку пика всем стенкам обратно
                        For i = 1 To Wall_Stack(0)
                                EntityPickMode(Wall_Stack(i), 2)
                        Next
                        ;возвращаемся обратно для проверки следующего "пикнутого" обьекта
                        Goto LoopPick
                ;Если же пикнутый обьект это бот
                ElseIf (Pick = Bot) Then
                        ;Уменьшаем энергию бота
                        Bot_Health = Bot_Health - 1
                        ;Тут можно всяких эффектов запихать
                EndIf
        EndIf
EndIf

Вобщем хреновое решение, но работает :)
А вообще тут необходимо использовать Типы вместе с Object\Handle, для быстрого доступа к ботам(для проверки) - он же не один будет я так понимаю.
Тоесть все стенки надо назвать Wall или как-нить подобно, и условие проверки будет такое
Код:

;.........................................
If EntityName(Pick) = "Wall"
        ;..................
Else
        pBot = Object.bot(EntityName(Pick))
        If (pBot <> Null) Then
                pBot\Health = pBot\Health - 1
        EndIf
EndIf
;.........................................

ЗЫ
Надеюсь меня за Goto здесь не убьют?:)

ЛысыЙ_Чук-Иванчук 29.10.2006 22:24

Re: Дыры от ПУЛЬ !!!
 
Спасибо за ответы:super: . Тот способ который предложил Nunan хорош, но этот способ не будет оставлять обратных следов. И я тут придумал способ который по моему мнению должен работать(буду делать утром(утора вечера мудренее:) ))

Допустим возьмем не мощную пулю, которая способна пробить лишь две стены, после того как пуля попала в стену, создаем ей детя которое перемещяем чуть чуть в перед, затем пускаем её в перед, если произошла коллизия, то оставляем след от попадания, но так как на выходе из стены она не проверяется на столкновение, то после того как она попала в стену или прошла максимальное расстояние своей жизни создаем ей детя и отправляем его обратно(и оно оставит обратный след).8)

Platon 30.10.2006 08:16

Re: Дыры от ПУЛЬ !!!
 
Зачем такой гемор?

"Пикаешь" стенку
Код:

CameraPick()
получаешь координаты дырки с одной стороны стенки
Код:

PX = PickedX()
PY = PickedY()
PZ = PickedZ()

Ставишь спрайт дырки
Дальше применяешь LinePick() по этим же координатам, только с другой стороны
Код:

LinePick(PX, PY, PZ - 100, PX, PY, PZ)
И получаешь новые координаты
Код:

PX = PickedX()
PY = PickedY()
PZ = PickedZ()

Эти координаты и будут координатами дырки с обратной стороны стенки.

ЛысыЙ_Чук-Иванчук 30.10.2006 19:04

Re: Дыры от ПУЛЬ !!!
 
Я понимаю, что мой метод содержит много гемора, но это даже лучше(помогает в изучении особенностей Блица);) . Как не странно но мой метод работает(уря хоть что-то я сделал сам:@ ).
Если кому нужен код то пожалуйста(кусок кода)B)
Цитата:


If EntityCollided(vvv\entity,TypeBAZA)
PROSTREL#=3
cx#=CollisionX( VVV\ENTITY,1 )
cy#=CollisionY( VVV\ENTITY,1 )
cz#=CollisionZ( VVV\ENTITY,1 )
;==================================

PositionEntity VVV\entity02,cx,cy,cz
RotateEntity VVV\entity02,EntityPitch(VVV\entity),EntityYaw(VVV \entity),0
MoveEntity vvv\entity02,0,0,PROSTREL
EntityType vvv\entity02,typepyl
EntityRadius vvv\entity02,.01

PositionEntity VVV\entity03,EntityX(vvv\entity02),EntityY(vvv\ent ity02),EntityZ(vvv\entity02)
RotateEntity VVV\entity03,EntityPitch(VVV\entity02),EntityYaw(V VV\entity02)+180,0
EntityType vvv\entity03,typepyl
EntityRadius vvv\entity03,.01
MoveEntity vvv\entity03,0,0,PROSTREL
MoveEntity vvv\entity02,0,0,400;если пуля прошла стену отровляем её дальше

;==================================
nx#=CollisionNX( VVV\ENTITY,1 )
ny#=CollisionNY( VVV\ENTITY,1 )
nz#=CollisionNZ( VVV\ENTITY,1 )
vvv\sprite=CopyEntity(vist)
PositionEntity VVV\sprite,cx,cy,cz
AlignToVector VVV\sprite,-nx,-ny,-nz,3
MoveEntity vvv\sprite,0,0,-.08
;==================================

ElseIf EntityCollided(vvv\entity,Typesteclo)
cx#=CollisionX( VVV\ENTITY,1 )
cy#=CollisionY( VVV\ENTITY,1 )
cz#=CollisionZ( VVV\ENTITY,1 )
nx#=CollisionNX( VVV\ENTITY,1 )
ny#=CollisionNY( VVV\ENTITY,1 )
nz#=CollisionNZ( VVV\ENTITY,1 )
vvv\sprite=CopyEntity(vist_02)
PositionEntity VVV\sprite,cx,cy,cz
AlignToVector VVV\sprite,-nx,-ny,-nz,3
MoveEntity vvv\sprite,0,0,-.08
vvv\sprite=CopyEntity(vist_02)
PositionEntity VVV\sprite,cx,cy,cz
AlignToVector VVV\sprite,nx,ny,nz,3
MoveEntity vvv\sprite,0,0,-.08
EndIf

;=================== Оброботка 2 пули
If EntityCollided(vvv\entity03,TypeBAZA)
cx#=CollisionX( VVV\ENTITY03,1 )
cy#=CollisionY( VVV\ENTITY03,1 )
cz#=CollisionZ( VVV\ENTITY03,1 )

nx#=CollisionNX( VVV\ENTITY03,1 )
ny#=CollisionNY( VVV\ENTITY03,1 )
nz#=CollisionNZ( VVV\ENTITY03,1 )
vvv\sprite=CopyEntity(vist)
PositionEntity VVV\sprite,cx,cy,cz
AlignToVector VVV\sprite,-nx,-ny,-nz,3
MoveEntity vvv\sprite,0,0,-.08
EndIf
If EntityCollided(vvv\entity02,TypeBAZA)
cx#=CollisionX( VVV\ENTITY02,1 )
cy#=CollisionY( VVV\ENTITY02,1 )
cz#=CollisionZ( VVV\ENTITY02,1 )

nx#=CollisionNX( VVV\ENTITY02,1 )
ny#=CollisionNY( VVV\ENTITY02,1 )
nz#=CollisionNZ( VVV\ENTITY02,1 )
vvv\sprite=CopyEntity(vist)
PositionEntity VVV\sprite,cx,cy,cz
AlignToVector VVV\sprite,-nx,-ny,-nz,3
MoveEntity vvv\sprite,0,0,-.08
EndIf


;

P.S....
Дыры остаются но они не прикрепляются к попавшим предметам(допустим дверь). Как лутше сделать чтобы пули присобачивались:) в попавший предмет.:-)
ЗЫ не ругайте за мелкий шрифт комп опять глючит(или это я глючу)
P.S. Админестрация почему я немогу в расширенном режиме менять настройки размера шрифта


jimon 30.10.2006 20:55

Re: Дыры от ПУЛЬ !!!
 

Цитата:

или это я глючу
ты прав однако

Platon 31.10.2006 02:25

Re: Дыры от ПУЛЬ !!!
 
Vlad
Ну и зря, нужно добиваться простого и эффективного кода, а не геморроя :-D
Насчет крепления дырок - просто припаренти ее после позиционирования с помощью EntityParent(). Тоесть если юзаешь коллизию, то узнаешь обьект с которым столкнулась пуля с помощью CollisionEntity() и парентишь спрайт дырки к нему. Перед удалением открепляешь.
ЗЫ
Проще надо быть ;)

ЛысыЙ_Чук-Иванчук 02.11.2006 19:46

Re: Дыры от ПУЛЬ !!!
 
Я делаю но они у меня как висели в воздухе так и весят.
Цитата:

Перед удалением открепляешь
Можно поподробней.


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

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