Показать сообщение отдельно
Старый 22.08.2006, 22:44   #76
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
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]
Аналогично привинчивается индикатор перезарядки.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием