Re: Создаём свой FPS (first person shooter)
Последний патрон
Модифицурем наш класс индикаторов [highlight=blitzbasic] Type xLine Field mesh Field texture Field max_count;масимальное значение индикатора End Type [/highlight] и обработчик индикатора соответственно: [highlight=blitzbasic] Function Change_H(xl.xLine,h) .... xs=Float(TextureWidth(xl\texture))/xl\max_count*(xl\max_count-h) .... [/highlight] Установим кол-во патронов в инвентаре для каждого типа оружия. Укажем величину шкалы жизни. [highlight=blitzbasic] Function create_user(x#=0,y#=10,z#=0) .... user_inv\s[0]=100 user_inv\s[1]=1000 .... sprite\max_count=100 ... [/highlight] Пользователь может стрелять, только если есть боеприпасы к данному виду вооружения. Отрицательную область оставим для оружия с неиссякаемым запасом. [highlight=blitzbasic] If MouseHit(1) And MilliSecs()-user_inv\last_shot_time>shot_S(user_inv\current)\r eload_time And user_inv\s[user_inv\current]<>0 user_gun=FindChild(GUN,"END") create_shot(EntityX(user_gun,1),EntityY(user_gun,1 ),EntityZ(user_gun,1),EntityPitch(camera),EntityYa w(user),0,user_inv\current) user_inv\last_shot_time=MilliSecs() user_inv\s[user_inv\current]=user_inv\s[user_inv\current]-1 EndIf [/highlight] Опишем максимально вохможное кол-во патронов для этого оружия: [highlight=blitzbasic] Type SHOT_TYPE Field sprite Field damage Field max_dist Field v# Field reload_time Field max End Type ...................... shot_S(0)\sprite=LoadSprite("sprite0.bmp") HideEntity shot_S(0)\sprite shot_S(0)\damage=95 shot_S(0)\max_dist=100 shot_S(0)\v=0.3 shot_S(0)\reload_time=1500 shot_S(0)\max=100; shot_S(1)\sprite=LoadSprite("sprite1.bmp") HideEntity shot_S(1)\sprite shot_S(1)\damage=10 shot_S(1)\max_dist=1000 shot_S(1)\v=0.1 shot_S(1)\reload_time=0 shot_S(1)\max=1000; .......................... [/highlight] Создадим индикатор [highlight=blitzbasic] Global user_b_xline.xLine [/highlight] Настроим его [highlight=blitzbasic] Function create_user(x#=0,y#=10,z#=0) .... ;= sprite.xLine=CreatePlane_m("BC.bmp",0) EntityParent sprite\mesh,camera EntityOrder sprite\mesh,-1 PositionEntity sprite\mesh,-1.9,0.7,2 RotateEntity sprite\mesh,0,0,90 EntityFX sprite\mesh,1 EntityAlpha sprite\mesh,0.6 sprite\max_count=shot_S(user_inv\current)\max user_b_xline=sprite ;= [/highlight] Обработаем при уменьшении патронов... [highlight=blitzbasic] If MouseHit(1) And MilliSecs()-user_inv\last_shot_time>shot_S(user_inv\current)\r eload_time And user_inv\s[user_inv\current]<>0 user_gun=FindChild(GUN,"END") create_shot(EntityX(user_gun,1),EntityY(user_gun,1 ),EntityZ(user_gun,1),EntityPitch(camera),EntityYa w(user),0,user_inv\current) user_inv\last_shot_time=MilliSecs() user_inv\s[user_inv\current]=user_inv\s[user_inv\current]-1 Change_H(user_b_xline,user_inv\s[user_inv\current]) EndIf [/highlight] .. и при смене вооружения [highlight=blitzbasic] Function change_item(i.inventar,move%) p=i\current While True p=p+move If p<0 p=9 If p>9 p=0 If i\s[p]<>0 Exit Wend Local bool=False If i\current<>p bool=True i\current=p Return bool End Function ... Function update_user() ... change_bool=change_item(user_inv,MouseZSpeed()) If change_bool user_b_xline\max_count=shot_S(user_inv\current)\ma x Change_H(user_b_xline,user_inv\s[user_inv\current]) EndIf End Function [/highlight] Аналогично привинчивается индикатор перезарядки. |
Re: Создаём свой FPS (first person shooter)
Вложений: 4
8) Что-то я разогнался. Интересно - много-ли ошибок :@
|
Re: Создаём свой FPS (first person shooter)
Круто! Но почему когда здоровье кончается перс не умирает, а патроны кончаются только тогда, когда пользуешься дробовиком?
|
Re: Создаём свой FPS (first person shooter)
Цитата:
Патроны кончаются всегда - просто для пистолета - их много больше, поэтому изменение незаметно |
Re: Создаём свой FPS (first person shooter)
Hi!
Нашел ошибку, когда патроны заканчиваются игра подвисает.... жду урок про стрельбу ботов.... |
Re: Создаём свой FPS (first person shooter)
БагФиксN
Вчера при модификации индикаторов забыл учесть ещё возможность прироста индикатора (шкала жизни была описана только для уменьшения). Короче говоря: [highlight=blitzbasic] Function Change_H(xl.xLine,h) tex=CreateTexture(TextureWidth(xl\texture),Texture Height(xl\texture)) CopyRect 0,0,TextureWidth(xl\texture),TextureHeight(xl\text ure),0,0,TextureBuffer(xl\texture),TextureBuffer(t ex) SetBuffer TextureBuffer(tex) Color 0,0,0 xs=Float(TextureWidth(xl\texture))/xl\max_count*(xl\max_count-h) xp=TextureWidth(xl\texture)-xs Rect xp,0,xs,TextureHeight(xl\texture) SetBuffer BackBuffer() EntityTexture xl\mesh,tex FreeTexture tex End Function [/highlight] Создаём текстуру tex с размерами текстуры-образца для данного индикатора (xl\texture). Затем копируем в новую текстуру образец (берём участок от 0,0 до ширина,высота образца и копируем его в новую тексу, начиная с координат 0,0). Затем проводим модификации с новой текстурой, накладываем её на квад и удаляем. |
Re: Создаём свой FPS (first person shooter)
Цитата:
|
Re: Создаём свой FPS (first person shooter)
Боевая система2
Добавил обоймы. Для этого в типе заряда сделал поле, отвечающее за кол-во патронов в обойме: [highlight=blitzbasic] Type SHOT_TYPE Field sprite Field damage Field max_dist Field v# Field reload_time Field InCartridge Field max End Type [/highlight] А в инвентаре - массив, хранящий текущее число выстрелов с момента последней перезарядки, и флаг перезарядки. [highlight=blitzbasic] Type inventar Field s[10] Field InC[10] Field current Field last_shot_time Field reload_flag End Type [/highlight] Для визуализации - я сделал индикатор. Причём он несёт двойную нагрузку: в процессе стрельбы он показывает расход патронов в обойме, в процессе перезарядки (клавиша R) - время, оставшееся до конца смены обоймы. [highlight=blitzbasic] Global user_reload_xline.xLine .... Function create_user(x#=0,y#=10,z#=0) .... sprite.xLine=CreatePlane_m("reload.bmp",0) EntityParent sprite\mesh,camera EntityOrder sprite\mesh,-1 PositionEntity sprite\mesh,-1.8,0.7,2 RotateEntity sprite\mesh,0,0,90 EntityFX sprite\mesh,1 EntityAlpha sprite\mesh,0.6 sprite\max_count=user_inv\InC[user_inv\current] user_reload_xline=sprite [/highlight] А дальше ужОс в обновлении игрока: [highlight=blitzbasic] If MouseHit(1) And user_inv\InC[user_inv\current]<>0 user_gun=FindChild(GUN,"END") create_shot(EntityX(user_gun,1),EntityY(user_gun,1 ),EntityZ(user_gun,1),EntityPitch(camera),EntityYa w(user),0,user_inv\current) user_inv\s[user_inv\current]=user_inv\s[user_inv\current]-1 Change_H(user_b_xline,user_inv\s[user_inv\current]) user_inv\InC[user_inv\current]=user_inv\InC[user_inv\current]-1 Change_H(user_reload_xline,user_inv\InC[user_inv\current]) EndIf [/highlight] Если текущая обойма не пуста - совершаем выстрел. Причём уменьшаем не только общее кол-во патронов, но икол-во патронов в обойме. Эти две величины в данной реализации независимы, поэтому надо строго следить за логикой. [highlight=blitzbasic] If KeyHit(19);reload user_inv\reload_flag=True user_inv\last_shot_time=MilliSecs() user_reload_xline\max_count=Shot_S(user_inv\curren t)\reload_time EndIf [/highlight] Если пользователь нажал R - ставим флаг перезарядки в истину, замеряем время и изменяем размер индикатора обоймы (как вы помните, теперь он несёт другую роль - указывать оставшееся до конца смены обоймы время). [highlight=blitzbasic] If MilliSecs()-user_inv\last_shot_time>shot_S(user_inv\current)\r eload_time And user_inv\reload_flag=True user_inv\reload_flag=False x=Shot_S(user_inv\current)\InCartridge If x>user_inv\s[user_inv\current] x=user_inv\s[user_inv\current] user_inv\InC[user_inv\current]=x user_reload_xline\max_count=Shot_S(user_inv\curren t)\InCartridge EndIf [/highlight] Если время перезарядки вышло и сам факт начала перезарядки был, то ставим флаг перезарядки в ложь. Смотрим - досаточно ли патрон на целую обойму данного оружия: если нет, то пихаем в обойму всё что осталось. Меняем размер инидикатора перезарядки - теперь он вновь исполняет старую функцию: указывает кол-во патрон в обойме. [highlight=blitzbasic] If user_inv\reload_flag=False change_bool=change_item(user_inv,MouseZSpeed()) Else Change_H(user_reload_xline,MilliSecs()-user_inv\last_shot_time) EndIf [/highlight] Если идёт перезарядка - запрещаем смену оружия и меняем показания индикатора в соответствии с прошедшим временем. [highlight=blitzbasic] If change_bool=True user_b_xline\max_count=shot_S(user_inv\current)\ma x Change_H(user_b_xline,user_inv\s[user_inv\current]) user_reload_xline\max_count=Shot_S(user_inv\curren t)\InCartridge Change_H(user_reload_xline,user_inv\InC[user_inv\current]) EndIf [/highlight] При смене оружия не забываем настроить индикатор на величину патронов в обойме у данного рода оружия, и указать текущее кол=во патронов в обойме. В общем - понять сложно, но можно. |
Re: Создаём свой FPS (first person shooter)
Вложений: 2
:vinsent: :killall:
|
Re: Создаём свой FPS (first person shooter)
ADD_N
Удобно написать функцию добавления данного кол-ва патронов в инвентарь: [highlight=blitzbasic] Function ADD_item(i.inventar,S,Count) i\s [ S ] =i\s [ S ] +Count If i\InC [ S ] =0 x=Shot_S(S)\InCartridge If i\s [ S ]<x x=i\s [ S ] i\InC [ S ]=x EndIf End Function [/highlight] Аргументы - инвентарь, слот (соответсвенно - тип оружия), кол-во патронов. Функция сама добавит патроны в инвентарь, проверит кол-во патронов в обойме и если оно равно нулю будет произведенена попытка заполнить имеющимся кол-вом обойму. [highlight=blitzbasic] Function create_user(x#=0,y#=10,z#=0) ... ADD_item(user_inv,0,100) ADD_item(user_inv,1,1000) [/highlight] |
Re: Создаём свой FPS (first person shooter)
БагФиксN+1
Благодаря GoodWin исправлена работа функци при пустом инвентаре. Заодно пофикшена обработка нулевого смещения по инвентарю. [highlight=blitzbasic] Function change_item(i.inventar,move%) If move%=0 Return Local size_inv=10 p=i\current iter=0 While True p=p+move iter=iter+1 If p<0 p=size_inv-1 If p>size_inv-1 p=0 If iter>size_inv Return False If i\s[p]<>0 Exit Wend Local bool=False If i\current<>p bool=True i\current=p Return bool End Function [/highlight] |
Re: Создаём свой FPS (first person shooter)
Вложений: 2
:teach:
|
Re: Создаём свой FPS (first person shooter)
Проблема в создании облаков:
Почему у меня, когда я зделал облака как всё было написано, было просто белое небо, я и пути к картинкам прописывал и всё равно вместо облаков чистое белое небо? |
Re: Создаём свой FPS (first person shooter)
Вывод: не всё сделал как написано, или же аппаратные проблемы с твоей стороны.
Скачай последний вариант кода с ихсодниками и проверь адекватность облаков в нём (без изменений). |
Re: Создаём свой FPS (first person shooter)
Что-то затихло, а я жду...жду....:)
|
Часовой пояс GMT +4, время: 21:17. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot