Показать сообщение отдельно
Старый 19.08.2006, 01:48   #58
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Создаём свой FPS (first person shooter)

Боевая система
Сделаем несколько типов оружия. Модифицируем систему.
[highlight=blitzbasic]
Type shot
Field entity
Field dist#
Field time
Field class_id%;здесь будет хранится инфа о классе снаряда(патрона)
End Type
[/highlight]
Визуализация снаряда зависит от его класса
[highlight=blitzbasic]
Function create_Shot(x#,y#,z#,pitch#,yaw#,roll#,class%=1)
s.shot=New shot
s\class_id=class
Local shot_sprite_handle=shot_spriteS(s\class_id)
s\entity=CopyEntity(shot_sprite_handle)
PositionEntity s\entity,x#,y#,z#,1
EntityType s\entity,SHOTT
RotateEntity s\entity,pitch#,yaw#,roll#,1
Return True
End Function
[/highlight]
shot_spriteS - это будет наш массив с образцами спрайтов
[highlight=blitzbasic]
Global pricel=LoadImage("pricel.bmp")

Dim shot_spriteS(2);инициализация
For i=0 To 1;загрузка
shot_spriteS(i)=LoadSprite("sprite"+i+".bmp")
Next

Global orient_sprite=LoadSprite("orient.bmp")
[/highlight]
А вот это - нафик
[highlight=blitzbasic]
Function create_world()
light=CreateLight()
RotateEntity light,90,0,0

HideEntity shot_sprite; уже не катит
[/highlight]
Скрывать будем сразу после загрузки:
[highlight=blitzbasic]
For i=0 To 1
shot_spriteS(i)=LoadSprite("sprite"+i+".bmp")
HideEntity shot_spriteS(i)
Next
[/highlight]
Так теперь переименуйте файл со спрайтом выстрела в sprite0 и найдите ещё один (отличный от имеющегося) спрайт - назовите его sprite1.
Подправим функцию обновления игрока:
[highlight=blitzbasic]
If MouseHit(2) And MilliSecs()-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)
last_shot_time=MilliSecs()
EndIf
If MouseHit(1)
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,1)

EndIf
[/highlight]
В зависимости от того что нажато (ЛКМ или ПКМ), производится выстрел из 1ого или 2ого оружия.
Уже можно псмотреть результаты работы.
Далее.
И вот тут начинаешь задумываться: у различного оружия - разлиные характеристики (глубокая мысль).
Надо как-то оценивать дальность стрельбы, урон, особенности траектории и прочее... Эх - создаём ещё один информационный тип:
[highlight=blitzbasic]
Type SHOT_TYPE
Field sprite
Field damage
Field max_dist
Field v#
End Type
[/highlight]
Самое мерзкое (так делать не надо!) описываем в коде характеристики оружия.
В реальных играх это должно хранится в конфигурационных файлах и загружаться специальной функцией.
[highlight=blitzbasic]
Dim shot_S.SHOT_TYPE(2)

For i=0 To 1
shot_S(i)=New SHOT_TYPE
Next

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(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
[/highlight]
Характеристики зависят от конкретики игры ( можно хоть мат.дисперсию величины повреждения записать).
Не забудьте удалить старый код - с массивом под спрайты.
[highlight=blitzbasic]
Function create_Shot(x#,y#,z#,pitch#,yaw#,roll#,class%=1)
s.shot=New shot
s\class_id=class
s\entity=CopyEntity(shot_S(s\class_id)\sprite)
PositionEntity s\entity,x#,y#,z#,1
EntityType s\entity,SHOTT
RotateEntity s\entity,pitch#,yaw#,roll#,1
Return True
End Function
[/highlight]
ну и правим обновление снарядов:
[highlight=blitzbasic]
Function update_shot()

For a.shot=Each shot
;=
If a\time=0 a\time=MilliSecs()
new_time=MilliSecs()
delta_t=new_time-a\time
a\time=new_time
vs#=shot_S(a\class_id)\v*delta_t
;=
MoveEntity a\entity,0,0,vs#
a\dist#=a\dist#+vs#
Local copy_a_class_id=a\class_id

bot_h=EntityCollided(a\entity,BOTT)
If a\dist#>shot_S(a\class_id)\max_dist
FreeEntity a\entity
Delete a
ElseIf EntityCollided(a\entity,TERRT)<>0
FreeEntity a\entity
Delete a
ElseIf bot_h<>0
FreeEntity a\entity
Delete a
bhandle=EntityName(bot_h)
bc.bot=Object.bot(bhandle)
bc\Survivability=bc\Survivability-shot_S(copy_a_class_id)\damage
;=
PositionEntity bc\point,EntityX(user,1),EntityY(bc\point,1),Entit yZ(user,1)
;=
If bc\Survivability<=0
Delete bc
FreeEntity bot_h
create_bot(EntityX(user)+Rnd(-100,100),2,EntityZ(user)+Rnd(-100,100))
EndIf
EndIf
Next
End Function
[/highlight]
Запускаем - играем.
ГГ... Теперь даже тактика есть: заманить противника на себя из слабого быстроперезаряжаемого оружия а потом, вблизи, замочить из СуперПушки с одного залпа =)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием