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

Смертный герой
Сегодня прикрутим показатель жизни игроку.
Как всегда код будет максимально простым - чтобы показать прицип работы. Конечная реализация зависит от вас.
В глобал:
[highlight=blitzbasic]
Global user_H
[/highlight]
в функцию create_user(x#=0,y#=10,z#=0)
[highlight=blitzbasic]
user_H=100
[/highlight]
в MAIN LOOP:
[highlight=blitzbasic]
Text 10,40,"H="+user_H
[/highlight]
Теперь опишем систему нанесения урона пользователю.
В функции update_bot() пишем:
[highlight=blitzbasic]
Function update_bot()
Rdist#=15
v#=0.01
For a.bot=Each bot
;=
If a\time=0 a\time=MilliSecs()
new_time=MilliSecs()
delta_t=new_time-a\time
a\time=new_time
;=
If EntityDistance(user,a\entity)<Rdist#
PointEntity a\entity,user
EntityColor a\entity,255,0,0
Else
EntityColor a\entity,255,255,255
If EntityDistance(a\entity,a\point)<2
PositionEntity a\point,EntityX(a\point)+Rnd(-40,40),EntityY(a\point),EntityZ(a\point)+Rnd(-40,40)
EndIf
PointEntity a\entity,a\point
EndIf
;===========новое
player=EntityCollided(a\entity,USERT)
If player<>0
user_H=user_H-1
EndIf
;======конец нового
MoveEntity a\entity,0,0,v#*delta_t
TranslateEntity user,0,-G#*delta_t,0
Next
End Function
[/highlight]
Если бот столкнулся с объектом, у которого стоит тип коллизии USERT, то убавить игроку жизнь на единицу.
Запустите и убедитесь в недостаточности этой конструкции. Жизнь уменьшается при каждом вызове функции, т.е. если у вас 60 ФПС, то за секунду прикосновения к вам бота у вас онимется 60 единиц здоровья.
Приступим.
[highlight=blitzbasic]
Type bot
Field entity
Field time
Field Survivability
Field point
Field last_damage_time
End Type
[/highlight]
Здесь будем хранить время последнего "удара".
Подправим функцию обеновления бота:
[highlight=blitzbasic]
;===========
player=EntityCollided(a\entity,USERT)
If player<>0
user_H=user_H-1
Else
a\ last_damage_time=0
EndIf
;======
[/highlight]
и далее в блоке If player<>0
[highlight=blitzbasic]
If a\last_damage_time=-1
a\last_damage_time=MilliSecs()
EndIf
[/highlight]
Если мы фиксируем акт соприкосновения первый раз (так сказать "локально" - т.е. в прошлом обновлении коллизии не было, а перед этим соприкосновений могло быть лююбое кол-во), то сохраняем в поле время, прошедшее с начала соприкосновения (а далее - время, с последнего обновления события, влекующего сосприкосновение - т.е. время прошлого "удара"). Вообще говоря, факт коллизии будет зафиксирован при вызове UpdateWorld(), т.е. время, прошедешее с акта коллизии до обработки этого факта в функции обновления бота весьма мало. Но всё же, не "пренебрежимо мало", особенно если частота UpdateWorld и функций обновления бота сильно разняться.
Но для данного примера это не критично (в описанном выше случае надо или логику вызвать вместе с UpdateWorld или искать иные пути - зависит от конкретики реализации стабилизации и логики мира)
[highlight=blitzbasic]
If MilliSecs()-a\last_damage_time>1000
user_H=user_H-1
a\last_damage_time=MilliSecs()
EndIf
[/highlight]
Ну и как завершающий штрих - сделаем силу урона произвольной (из диапазона):
[highlight=blitzbasic]
Function update_bot()
Rdist#=15
v#=0.01
For a.bot=Each bot
;=
If a\time=0 a\time=MilliSecs()
new_time=MilliSecs()
delta_t=new_time-a\time
a\time=new_time
;=
If EntityDistance(user,a\entity)<Rdist#
PointEntity a\entity,user
EntityColor a\entity,255,0,0
Else
EntityColor a\entity,255,255,255
If EntityDistance(a\entity,a\point)<2
PositionEntity a\point,EntityX(a\point)+Rnd(-40,40),EntityY(a\point),EntityZ(a\point)+Rnd(-40,40)
EndIf
PointEntity a\entity,a\point
EndIf
;===========
player=EntityCollided(a\entity,USERT)
If player<>0

If a\last_damage_time=-1
a\last_damage_time=MilliSecs()
EndIf
If MilliSecs()-a\last_damage_time>1000
user_H=user_H-Rand(1,7)
a\last_damage_time=MilliSecs()
EndIf
Else
a\ last_damage_time=-1
EndIf
;======
MoveEntity a\entity,0,0,v#*delta_t
TranslateEntity user,0,-G#*delta_t,0
Next
End Function


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