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

Maxxx.!!!. 09.12.2007 17:37

Проверка попадания в бота.
 
Такой вопрос. Есть FPS, есть 10 ботов (Bot1, Bot2... Bot9). Как реализовать попадание из оружия в ботов. А как это сделать? Я пробовал LinePick, но он только изредка выдает вместо "0" какие-то цифры, как я понял, это имя объекта, а как его из цифр преобразовать в имя переменной? А можно сделать вот так? Например, создать бокс, который бы повторял радиус и дальность поражения от оружия, привязать его к стволу. А потом проверять на столкновение с ботами, но чтобы он возвращал имя объекта, с которым столкнулся. Только у меня все боты сидят на одном EntityType.

Как бы это все реализовать по-проще. Заранее благодарен.

impersonalis 09.12.2007 17:54

Re: Проверка попадания в бота.
 
http://www.boolean.name/showthread.php?t=15

Horror 09.12.2007 18:03

Re: Проверка попадания в бота.
 
чета не понял у тебя боты это перменые?
жуть)
попробуй с типами

простой пример:

Type TBot
field ent ;модель бота
filed hp ; колво жизни
end type

;создаем 10 ботов в случайных позициях:
for i=1 to 10
bt.TBot=new TBot
bt\ent=createcube()
bt\hp=100 ;вначаеле у бото 100 единиц здоровия
entitypickmode bt\ent,2 ;чтобы можно было пикать по ботам
positionentity bt\hp,rnd(-10,10),0,rnd(-10,10)
next


главный цикл:
pick=camerapick(cam,mousex(),mousey())
;перебираем всех ботов
for bt.TBot=each TBot
;если кликнул на мыш и наведена мыш на бота то отнимаем у бота 10 хп
if mousehit(1) and pick=bt\ent then bt\hp=bt\hp-10
;если жизни меньше(равно 0) то уничтожаем бота
if bt\hp<=0 then freeentity bt\ent : delete bt
next


это простой пример и не оч оптимезированный
ну вроде понятный!
ПС писал прям на форуме мог наврать...

Maxxx.!!!. 09.12.2007 18:10

Re: Проверка попадания в бота.
 
Цитата:

Сообщение от Horror
чета не понял у тебя боты это перменые?
жуть)
попробуй с типами

простой пример:

...

Ну, так: Bot1=LoadAnimMesh("zzz")

Меня в дрожь берет от этих типов. Ну ладно, попробую с ними. Но можно этот код и без типов сделать?

Bagration 09.12.2007 18:15

Re: Проверка попадания в бота.
 
Куда ж ты без типов-то... все равно придется их использовать.

Trilliput 09.12.2007 18:26

Re: Проверка попадания в бота.
 
Скажи если тебе 100 ботов понадобяться ты тоже будеш писать bot1,bot2,..bot99,bot100? ручки не отвадяться?

Horror 09.12.2007 18:43

Re: Проверка попадания в бота.
 
ну мошь и массивами
ну типы имхо круче!

сделай тутор от импера все поймешь
он очень хороший

Maxxx.!!!. 09.12.2007 18:49

Re: Проверка попадания в бота.
 
Цитата:

Сообщение от Horror
простой пример:

главный цикл:
pick=camerapick(cam,mousex(),mousey())
;перебираем всех ботов
for bt.TBot=each TBot
;если кликнул на мыш и наведена мыш на бота то отнимаем у бота 10 хп
if mousehit(1) and pick=bt\ent then bt\hp=bt\hp-10
;если жизни меньше(равно 0) то уничтожаем бота
if bt\hp<=0 then freeentity bt\ent : delete bt
next

Не исчезают боты после того, как у них жизни кончаются. Т.е. pick не работает. Почему?

P.S. Отвечаю всем - ну, у меня не 100 ботов, а 10. Но, спорить не буду, - типы это весело. Только сложно все это.

tormoz 09.12.2007 19:23

Re: Проверка попадания в бота.
 
EntityPickMode go to help !!!

Maxxx.!!!. 09.12.2007 19:25

Re: Проверка попадания в бота.
 
Цитата:

Сообщение от tormoz
EntityPickMode go to help !!!

Был я в хелпе, все правильно. Толку то. Может с CameraPick что-нибудь?

tormoz 09.12.2007 21:11

Re: Проверка попадания в бота.
 
Блин я тебя не зря в хелп послал
Аниммеш - не меш а контейнер для меша
на него НЕ ставится пицкмоде на полигоны
Нужно перебирать все чайлды и ставить на каждый

а ваще делай обычным радиусом и не мороч голову с полигонами.
пикай по эллипсу (ссответственно и пицкмде на сферу ставь)

Учись работать с типами - это очень просто и эффективно

ABTOMAT 09.12.2007 21:24

Re: Проверка попадания в бота.
 
[blitz]For i= 1 To CountChildren(entity)
Baby = GetChild(entity,i)
EntityPickMode Baby, 2
Next [/blitz]

Цитата:

Меня в дрожь берет от этих типов
Бугага, жжош)) Ты можешь бытро кликами мышки создать 200 врагов? Нет? А я могу) Перебарывай дрожь и кури хелп по типам.

HolyDel 09.12.2007 21:30

Re: Проверка попадания в бота.
 
ABTOMAT, может не прокатить
Function AnimEntityPickMode(aent,mode)
EntityPickMode aent,mode,0
For i=1 To CountChildren(aent)
AnimEntityPickMode(GetChild(aent,i),mode)
Next
End Function
вот так идеологически правильнее.

Maxxx.!!!. 09.12.2007 22:41

Re: Проверка попадания в бота.
 
У меня боты идут одним чайлдом, насколько я помню. Я пробовал в EntityPickMode ставить сферу, но тоже не работало. Т.е. мне надо создать поверх ботов сферу, скрыть ее и по ней проверять Pick?

Horror 09.12.2007 22:51

Re: Проверка попадания в бота.
 
ну можно и создать "оболочку"
НО меня напрягли слова
Цитата:

скрыть ее
ты как скрываешь?
Hideentity ))
если да то так не прокатит)
пиши entityalpha obochka,0

выкинь весь код а то трудно понять , что не таке

ABTOMAT 09.12.2007 22:55

Re: Проверка попадания в бота.
 
Maxxx.!!!., го курить хелп!
HolyDel, твоя идеологически правильнее, моя - адекватнее.
Пример:
У скина 40 костей. Нафига каждому ставить пик мод? ИМХО и мешам хватитю...

tormoz 09.12.2007 23:37

Re: Проверка попадания в бота.
 
Цитата:

Сообщение от Horror
ну можно и создать "оболочку"
НО меня напрягли слова

ты как скрываешь?
Hideentity ))
если да то так не прокатит)
пиши entityalpha obochka,0

выкинь весь код а то трудно понять , что не таке

Какую еще оболочку ?
ЖжОте
Трудно поставить на модель радиус ?
EntityPickMode entity,1
EntityRadius entity,x,y

Maxxx.!!!. 09.12.2007 23:41

Re: Проверка попадания в бота.
 
Про entityalpha я знаю. EntityRadius я пробовал - он ругается, что не может использовать в этой команде типы.

Код пока не выкину, т.к. исходника под рукой сейчас нет.

ABTOMAT 10.12.2007 00:12

Re: Проверка попадания в бота.
 
Цитата:

Код пока не выкину
Ой не нада!
Кури хелп все вопросы сами собой исчезнут!

IGR 10.12.2007 17:04

Re: Проверка попадания в бота.
 
Цитата:

сделай тутор от импера все поймешь
он очень хороший
+1
и я научился юзайть типы по этому тутору !!

меня тож раньше в дрож бросало от типов !!
но шас я ети типы сую куда попало, везде применяю где только можно !!

Так что Maxxx.!!!., разберись в туторе и будет тебе счастье !! ;)

Maxxx.!!!. 10.12.2007 19:03

Re: Проверка попадания в бота.
 
Не получается

Type TBot
Field Ent
Field Hp
Field EntS
End Type

For i=1 To 10
bt.TBot=New TBot
bt\EntS=CreateSphere (5)
bt\ent=LoadAnimMesh ("Enemy/Bot1.b3d",bt\EntS)
ScaleEntity bt\ent, 0.7,0.7,0.7
ScaleEntity bt\entS, 0.7,0.7,0.7
bt\hp=100
EntityPickMode bt\entS,1
EntityRadius bt\entS,2,2
PositionEntity bt\entS,Rnd(-25,25),2,Rnd(-25,25)
Animate bt\ent,1,0.2
Next

Цикл

pick=CameraPick(cam,MouseX(),MouseY())
For bt.TBot=Each TBot
If MouseHit(2) And pick=bt\entS Then bt\hp=bt\hp-50
If bt\hp<=0 Then FreeEntity bt\entS : FreeEntity bt\ent :Delete bt
Next

Поставил поверх ботов сферы, и все-равно pick не срабатывает. Иногда срабатывет, когда мышь вообще куда-нибудь в пустоту повернута и когда сто раз на нее нажмешь.

Цитата:

Сообщение от IGR
разберись в туторе

Тутор этот я еще давно смотрел. Но эти типу - это ужас. Это же Сишные приколы с этими типами, а сишный синтаксис это ужас. Меня от него в дрожь берет, поэтому я на бейсиках с детства сижу. :) С QB еще начинал, у меня даже сайт про него свой остался: http://quitbasic.narod.ru

tormoz 10.12.2007 22:17

Re: Проверка попадания в бота.
 
MHIT2=MouseHit(2)

For bt.TBot=Each TBot
If MHIT2
pick=CameraPick(cam,MouseX(),MouseY())
If pick=bt\entS
bt\hp=bt\hp-50
endif
endif
If bt\hp<=0 Then FreeEntity bt\entS : FreeEntity bt\ent :Delete bt
Next

ВНИМАНИЕ
MouseHit(2) - применять в коде один раз !!!!!!!!!!
ВСЕ опросы клавиш и мышки делать один раз и сохранять в переменные.

Maxxx.!!!. 10.12.2007 23:28

Re: Проверка попадания в бота.
 
Цитата:

Сообщение от tormoz
MHIT2=MouseHit(2)

For bt.TBot=Each TBot
If MHIT2
pick=CameraPick(cam,MouseX(),MouseY())
If pick=bt\entS
bt\hp=bt\hp-50
endif
endif
If bt\hp<=0 Then FreeEntity bt\entS : FreeEntity bt\ent :Delete bt
Next

Никакого результата.

Maxxx.!!!. 11.12.2007 20:22

Re: Проверка попадания в бота.
 
Никто не знает, в чем дело? Я сделал в точности, как тут говорили. А все-равно pick мерзский не срабатывает.

tormoz 11.12.2007 20:49

Re: Проверка попадания в бота.
 
весь исходник с ресурсами пакуй в архив и выкладывай
мы не телепаты.
у тебя 100 % ошибка алгоритма
чудес не бывает

Maxxx.!!!. 11.12.2007 21:07

Re: Проверка попадания в бота.
 
Вложений: 2
Да я не спорю, что дело в алгоритме. Кстати, когда "стреляешь издалека", то он иногда "попадает" в бота, причем в пик всегда какие-то цифры есть, когда мышь на бота наведена.

Вот исходник.

IGR 11.12.2007 21:08

Re: Проверка попадания в бота.
 
Цитата:

EntityPickMode bt\entS,1
EntityRadius bt\entS,2,2
ты наверно просто НЕ попадаеш в область сферы !!
поставь:EntityPickMode bt\entS,2 и проверь !! ;)
или радиус постав 10000 !! :-)

Maxxx.!!!. 11.12.2007 21:10

Re: Проверка попадания в бота.
 
Цитата:

Сообщение от IGR
ты наверно просто НЕ попадаеш в область сферы !!
поставь:EntityPickMode bt\entS,2 и проверь !! ;)

Еще как попадаю. Переменная, где хранится значение CameraPick, когда мышь наведена на бота, всегда имеет какое-то значение. Так что с этим все впорядке.

H@NON 11.12.2007 21:25

Re: Проверка попадания в бота.
 
тебе же написали, нажатие клавиш хранить в переменных. И вообще в твоем коде получается анимация выстрела проигрывается когда жмешь левую кнопку, а стреляешь когда кликнул на правую кнопку.
Код:

global MHIT2

For bt.TBot=Each TBot
TranslateEntity bt\entS,0,G#,0
If MHIT2;MouseHit(2)
CamP=CameraPick(CAM,MouseX(),MouseY())
;pick=CameraPick(CAM,MouseX(),MouseY())
If CamP=bt\entS
SndPlay(1)
bt\hp=bt\hp-50
EndIf
EndIf
If bt\hp<=0 Then FreeEntity bt\entS : Delete bt
Next
//основной цикл
MHIT2=MouseHit(2)
//энд


Maxxx.!!!. 11.12.2007 22:19

Re: Проверка попадания в бота.
 
H@NON :super: , ты гений. Все заработало. А то я так писал Global MHIT2=MouseHit(2), и ни фига не работало. А сейчас все пашет, но я до сих пор не понимаю, почему не пашет тот вариант, к-й в исходнике. :dontknow:

H@NON 11.12.2007 22:29

Re: Проверка попадания в бота.
 
А смысл писать в глобале Global MHIT2=MouseHit(2)? проверка же должна идти в цикле, так у тебя сначало присвоилось переменной значение MouseHit(2), а когда ты уже в цикле прогоняешь ситуацию с нажатием клавиши и он у тебя все время выдает 0, то есть то значение что было присвоено при инициализации графики.

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

FrankH 16.12.2007 13:49

Re: Проверка попадания в бота.
 
У меня тоже проблема с сабжем, только другого плана: использование CameraPick дает точную точку попадания в бота, однако при тех же условиях LinePick не возвращает ничего, отобразил на экране линию, чтобы проверить что она на месте, все равно при попадании на линию бот не пикается. Тут неоднократно говорилось, что LinePick глючит, не могли бы вы поделиться при каких условиях это происходит, и как с этим бороться?

Diplomat 16.12.2007 14:28

Re: Проверка попадания в бота.
 
Цитата:

при каких условиях это происходит, и как с этим бороться?
При любых. Никак.
Просто используй EntityPick().

HolyDel 16.12.2007 14:37

Re: Проверка попадания в бота.
 
При любых. Никак.
Или математику можешь использовать. (если определить пересечение отрезка со сферой - проблема, то тогда юзай EntityPick(), как сказано выше)

FrankH 16.12.2007 15:02

Re: Проверка попадания в бота.
 
А если мне необходимо просчитать попадание лазера в меш (НЕ в сферу), тут математикой не обойтись(без просчета положения вертексов), и ЕнтитиПик() помоему не поможет.. И камерапик юзать не могу, вид от третьего лица.. Можно ли это как-то решить?

HolyDel 16.12.2007 16:05

Re: Проверка попадания в бота.
 
FrankH, да, конечно.
но в 99% случаев можно отделаться сферой.
а если у тебя 100 ботов на 5к поликов каждый?
тогда игра будет тормозить жутко.
выход - сначала проверять на сферу, потом на меш (тормозным pick методом).

FrankH 16.12.2007 16:25

Re: Проверка попадания в бота.
 
Спасибо, я наконец разобрался КАК работает ЭнтитиПик!(нашел пояснения насчет Z направления), до этого был уверен что берется близжайший обьект вообще, а не по направлению.. Проверил в коде - все работает!:super:
HolyDel, если бы блитц с моими руками такое потянул..:pardon:
Представляю космический симулятор с таким кол-вом ботов.. :wallbash::crazy:
Поликов пока не более 1к на юнит.. (кстати странно, в максе фейсов почти в два раза меньше чем в блитце трисов:dontknow:)

HolyDel 16.12.2007 16:31

Re: Проверка попадания в бота.
 
FrankH, я где то на форуме выеладывал либу, которая считает, пересекает отрезок сферу или нет. причем считает очень быстро.


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

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