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