Re: Создаём свой FPS (first person shooter)
Ух ты, спасибо impersonalis! Полезная статья)
|
Re: Создаём свой FPS (first person shooter)
Инвентарь
Один из самых популярных вопросов. Инвентарь (как и многое другое) - как хочешь так и кодируй. Я предложу один из вариантов. Пишем тип: [highlight=blitzbasic] Type inventar Field s[10] Field current Field last_shot_time End Type [/highlight] создайм "один инвентарь" для игрока: [highlight=blitzbasic] Global user_inv.INVENTAR=New INVENTAR [/highlight] в Function create_user(x#=0,y#=10,z#=0) допишем: [highlight=blitzbasic] For i=0 To 10 user_inv\s[i]=0 Next user_inv\s[0]=1 user_inv\current=0 [/highlight] Global last_shot_time -удаляем из кода. В Function update_user() добавляем универсальности: [highlight=blitzbasic] If MouseHit(1) And MilliSecs()-user_inv\last_shot_time>shot_delay 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,0) user_inv\last_shot_time=MilliSecs() EndIf [/highlight] Обработчик ПКМ стираем. Неплохо бы сделать для каждого образца оружия своё время перезарядки (ожидания между выстрелами): [highlight=blitzbasic] Type SHOT_TYPE Field sprite Field damage Field max_dist Field v# Field reload_time End Type [/highlight] [highlight=blitzbasic] 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(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 [/highlight] Const shot_delay=1000 - нам больше не понадобится. [highlight=blitzbasic] If MouseHit(1) And MilliSecs()-user_inv\last_shot_time>shot_S(user_inv\current)\r eload_time [/highlight] Если юзер тыкнул ЛКМ и время с последнего выстрела прошло достаточно для перезарядки текущего оружия, то [highlight=blitzbasic] 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() [/highlight] [highlight=blitzbasic] If MilliSecs()-user_inv\last_shot_time<shot_S(user_inv\current)\r eload_time Text 10,10,"RELOAD..." 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 i\current=p End Function [/highlight] Вот такая вот фунЕция: i.inventar - инвентарь с которым мы будем работать move% -примает значения 1 и -1 -направление движения по инвентарю (след./пред.) В update_user() допишем: [highlight=blitzbasic] change_item(user_inv,MouseZSpeed()) [/highlight] А в Function create_user(x#=0,y#=10,z#=0): [highlight=blitzbasic] user_inv\s[0]=1 user_inv\s[1]=1;добавим [/highlight] Можно полюбоватся (или поужасаться) уже: запускаем, колёскиом выбираем оружие из инвентаря, ЛКМ-ом стреляем. |
Re: Создаём свой FPS (first person shooter)
Вложений: 2
B)
|
Re: Создаём свой FPS (first person shooter)
Цитата:
а это, что за переменная такая... имя такое...или что-то особое? |
Re: Создаём свой FPS (first person shooter)
Это моя привычка ставить мало пробелов, в следствие чего, скрипт криво обработал конструкцию. Скачай аттач - там всё работоспособно.
|
Re: Создаём свой FPS (first person shooter)
Молодец полезное дело делаешь!!!
Но у меня возник вопрос! Почему когда я двигаюсь навстречу БОТУ,я прохожу через него? |
Re: Создаём свой FPS (first person shooter)
Потому что Blitz3D не обрабатываеи коллизию с движущимся мешем
UPD: что-то я сламерился (не в этом случае коллизия не работает) спс alc'o'SHoLiK за то что тыкнул меня носом Скоро исправлю |
Re: Создаём свой FPS (first person shooter)
Что ещё рассмотреть?
|
Re: Создаём свой FPS (first person shooter)
Цитата:
|
Re: Создаём свой FPS (first person shooter)
Спасибо, ты делашь нужное дело и не называешь новичков ламерами. Щас нажму кнопку Thanks! А как сделать стаистику, ну типа чтобы на экране отображалось здоровье и уменьшалось когда надо? А и тоже самое с патронами, чтоб они не были бесконечными. Заранее спасибо.
|
Re: Создаём свой FPS (first person shooter)
Вложений: 2
Эх.
Убедился в истине - программ без ошибок не бывает. Пока правил коллизии (надо было поставиьт EntityRadius и сделать бота адекватных размеров) нарыл опечатку(!!! я в ужасе - этот мануал уже прочитало столько народу - в том числе и не славяноговрящего - а опечатка всё ещё жива была) и мат.ошибку в модели физики (любопытно- в параллельных проектах я её не допускал). Вот поифкшенный код. UPD: У меня порой складывается ощущение, что своим туторам я себе помгаю,а не окружающим. Ну что ж - зато теперь начинающие знают - как долго могут жить ошибки и как просты они могут быть. Так сказть - не тутор, а реалити-шоу - пишу FPS. UPD2: так что не удивляйтесь - если черз пол-года я ещё найду ошибку в первых строках программы. UPD3: да-да... |
Re: Создаём свой FPS (first person shooter)
Я первый шуттер полгода писал - и все время что то исправлял.
Сейчас, как гляну на код - плохо становиться. штук 150 функций, и совершенно не помню что и зачем :) А представьте проект класса АА на сях в 200 000 строк ! |
Re: Создаём свой FPS (first person shooter)
стрелять ботов научи....
можно еще ограничить обзор у бота не только расстоянием, но и углом зрения... пжл... ждемс... да и еще... когда у игрока кончается жизнь надо с ним что-то сделать... :) |
Re: Создаём свой FPS (first person shooter)
Линия жизни
Линию можно сделать прямоугольником (RECT) и отрисовывать ей при каждом обновлении экрана. Это медленно. Можно сделать картинкой (image) будет работать быстрее (насколько мне известно) - но тоже не лучший способ. Лучше и универсальнее всего (подумайте а различных разрешениях экрана) - делать через 3D - спрайтом. Чтобы не изобретать велик - возьмём готовую функцию Tormoz-а и немного модифицируем её (создав для этого специальный тип): [highlight=blitzbasic] Type xLine Field mesh Field texture End Type Function CreatePlane_m.xLine(File$,fl) xl.xLine=New xLine Local texture,scx#,scy# mesh=CreateMesh() surf=CreateSurface(mesh) AddVertex surf,-1,1,0,0,0:AddVertex surf,1,1,0,1,0 AddVertex surf,1,-1,0,1,1:AddVertex surf,-1,-1,0,0,1 AddTriangle surf,0,1,2:AddTriangle surf,0,2,3 UpdateNormals mesh texture=LoadTexture ( File$,fl) img=LoadImage(File$) scx#=ImageWidth (img) scy#=ImageHeight (img) ScaleMesh mesh,scx/256,scy/256,1 EntityTexture mesh,texture FreeImage img xl\mesh=mesh xl\texture=texture Return xl End Function [/highlight] Эта функция создаст квад необъодимых размеров - под картинку File$. [highlight=blitzbasic] Function create_user(x#=0,y#=10,z#=0) ..... sprite.xLine=CreatePlane_m("H.bmp",0) EntityParent sprite\mesh,camera EntityOrder sprite\mesh,-1 PositionEntity sprite\mesh,-1.65,1.45,2 EntityFX sprite\mesh,1 user_xline=sprite [/highlight] Создаём квад, привязываем его к камере. Устанавливаем порядок отрисовки (самым последним - поверх всех объектов). Позиционирцем. И ставим полноцветность (чтобы яркость изображения не зависела от текущего освещения). В папку с проектом кладём картинку - прямоугольник (у меня - размером 200 на 20). [highlight=blitzbasic] Global user_xline.xLine [/highlight] Ф-ция изменения состояния шкалы [highlight=blitzbasic] Function Change_H(xl.xLine,h) SetBuffer TextureBuffer(xl\texture) Color 0,0,0 Rect 0,0,TextureWidth(xl\texture),TextureHeight(xl\text ure) Color 255,0,0 Rect 0,0,Float(TextureWidth(xl\texture))/100*h,TextureHeight(xl\texture) SetBuffer BackBuffer() EntityTexture xl\mesh,xl\texture End Function [/highlight] Обработаем в Function update_bot(): [highlight=blitzbasic] user_H=user_H-Rand(1,7) Change_H(user_xline,user_H);новое a\last_damage_time=MilliSecs() [/highlight] удаляем: [highlight=blitzbasic] Text 10,40,"H="+user_H [/highlight] допишем красивости ради в Function create_user(x#=0,y#=10,z#=0) [highlight=blitzbasic] EntityAlpha sprite\mesh,0.6 [/highlight] Упростим и усовершенствуем процедуру изменеия тестуры квада: [highlight=blitzbasic] Color 0,0,0 xs=Float(TextureWidth(xl\texture))/100*(100-h) xp=TextureWidth(xl\texture)-xs Rect xp,0,xs,TextureHeight(xl\texture) [/highlight] Теперь можно немного поуркашать картинку. /См. аттач/ Кроме того я ещё подправил физику ботов и игрока (прыжок и гравитацию). |
Re: Создаём свой FPS (first person shooter)
Вложений: 2
код+ресурсы
|
Часовой пояс GMT +4, время: 17:33. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot