Показать сообщение отдельно
Старый 23.08.2006, 14:52   #83
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
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]
При смене оружия не забываем настроить индикатор на величину патронов в обойме у данного рода оружия, и указать текущее кол=во патронов в обойме.

В общем - понять сложно, но можно.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием