forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Создаём свой FPS (first person shooter) (http://forum.boolean.name/showthread.php?t=15)

Ins!de 19.08.2006 15:32

Re: Создаём свой FPS (first person shooter)
 
Ух ты, спасибо impersonalis! Полезная статья)

impersonalis 20.08.2006 23:14

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]
Можно полюбоватся (или поужасаться) уже: запускаем, колёскиом выбираем оружие из инвентаря, ЛКМ-ом стреляем.

impersonalis 20.08.2006 23:19

Re: Создаём свой FPS (first person shooter)
 
Вложений: 2
B)

GoodWin 21.08.2006 13:49

Re: Создаём свой FPS (first person shooter)
 

Цитата:

Field s&#91

а это, что за переменная такая... имя такое...или что-то особое?

impersonalis 21.08.2006 14:37

Re: Создаём свой FPS (first person shooter)
 
Это моя привычка ставить мало пробелов, в следствие чего, скрипт криво обработал конструкцию. Скачай аттач - там всё работоспособно.

smaller 21.08.2006 14:52

Re: Создаём свой FPS (first person shooter)
 
Молодец полезное дело делаешь!!!
Но у меня возник вопрос! Почему когда я двигаюсь навстречу БОТУ,я прохожу через него?

impersonalis 21.08.2006 15:06

Re: Создаём свой FPS (first person shooter)
 
Потому что Blitz3D не обрабатываеи коллизию с движущимся мешем
UPD:
что-то я сламерился (не в этом случае коллизия не работает)
спс alc'o'SHoLiK за то что тыкнул меня носом

Скоро исправлю

impersonalis 22.08.2006 01:39

Re: Создаём свой FPS (first person shooter)
 
Что ещё рассмотреть?

tormoz 22.08.2006 02:57

Re: Создаём свой FPS (first person shooter)
 
Цитата:

Потому что Blitz3D не обрабатываеи коллизию с движущимся мешем
Если выставить обоюдную коллизию и не злоупотреблять скоростями, то обрабатывает.

Тарас Шевченко 22.08.2006 03:05

Re: Создаём свой FPS (first person shooter)
 
Спасибо, ты делашь нужное дело и не называешь новичков ламерами. Щас нажму кнопку Thanks! А как сделать стаистику, ну типа чтобы на экране отображалось здоровье и уменьшалось когда надо? А и тоже самое с патронами, чтоб они не были бесконечными. Заранее спасибо.

impersonalis 22.08.2006 03:32

Re: Создаём свой FPS (first person shooter)
 
Вложений: 2
Эх.
Убедился в истине - программ без ошибок не бывает.
Пока правил коллизии (надо было поставиьт EntityRadius и сделать бота адекватных размеров) нарыл опечатку(!!! я в ужасе - этот мануал уже прочитало столько народу - в том числе и не славяноговрящего - а опечатка всё ещё жива была) и мат.ошибку в модели физики (любопытно- в параллельных проектах я её не допускал).
Вот поифкшенный код.
UPD:
У меня порой складывается ощущение, что своим туторам я себе помгаю,а не окружающим.
Ну что ж - зато теперь начинающие знают - как долго могут жить ошибки и как просты они могут быть.
Так сказть - не тутор, а реалити-шоу - пишу FPS.
UPD2:
так что не удивляйтесь - если черз пол-года я ещё найду ошибку в первых строках программы.
UPD3: да-да...

tormoz 22.08.2006 06:37

Re: Создаём свой FPS (first person shooter)
 
Я первый шуттер полгода писал - и все время что то исправлял.
Сейчас, как гляну на код - плохо становиться. штук 150 функций, и совершенно не помню что и зачем :)
А представьте проект класса АА на сях в 200 000 строк !

GoodWin 22.08.2006 11:59

Re: Создаём свой FPS (first person shooter)
 
стрелять ботов научи....
можно еще ограничить обзор у бота не только расстоянием, но и углом зрения...

пжл... ждемс...

да и еще... когда у игрока кончается жизнь надо с ним что-то сделать... :)

impersonalis 22.08.2006 20:58

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]
Теперь можно немного поуркашать картинку. /См. аттач/
Кроме того я ещё подправил физику ботов и игрока (прыжок и гравитацию).

impersonalis 22.08.2006 21:00

Re: Создаём свой FPS (first person shooter)
 
Вложений: 2
код+ресурсы


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

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