Автомат в руки
Вот мне тут сообщают в ICQ, что дескать невозможно главгеру оружие вручить из-за моей модели представления... Странно...
Попробуем.
Смотрим в контакт-лист: ни одного моделлера в сети =/ кхым... Роль оружия будет выполнять цилиндр.
Global user
Global camera
Global GUN
ну скука прямо..
Function create_user(x#=0,y#=10,z#=0)
MidHandle pricel
MaskImage pricel,255,255,255
user=CreateSphere()
k#=3
ScaleEntity user,k#,k#,k#
EntityRadius user,k#
camera=CreateCamera(user)
CameraRange camera,0.1,10000
PositionEntity user,x#,y#,z#
EntityType user,USERT
GUN=CreateCylinder()
TurnEntity GUN,90,0,0
ScaleEntity GUN,.5,1,.5
EntityParent GUN,camera
PositionEntity GUN,0,-.4,0.4
End Function
Запускаем и любуемсЯ =)
Но недолго: если стрелять очередью, видно, что огонь ведётся не из ствола, а так сказать,
die Sonne scheint mir aus den Augen © RAMMSTEIN
|
Нам надо как-то сассоциировать место начала движения спрайта выстрела и начало ствола.
Если бы у меня была нормальная модель, то дельный моделлер просто разместил бы пивот на конце ствола. Сейчас мы сделаем то же самое, но ручками ^_^
Function create_user(x#=0,y#=10,z#=0)
MidHandle pricel
MaskImage pricel,255,255,255
user=CreateSphere()
k#=3
ScaleEntity user,k#,k#,k#
EntityRadius user,k#
camera=CreateCamera(user)
CameraRange camera,0.1,10000
PositionEntity user,x#,y#,z#
EntityType user,USERT
GUN=CreateCylinder()
TurnEntity GUN,90,0,0
ScaleEntity GUN,.5,1,.5
EntityParent GUN,camera
PositionEntity GUN,0,-.4,0.4
end_=CreatePivot()
NameEntity end_,"END"
EntityParent end_,GUN
PositionEntity end_,0,1.3,0
End Function
Так... Ну а теперь, перепишем событие - выстрел:
Local user_gun
If MouseHit(1) 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),EntityYaw(user),0)
*last_shot_time=MilliSecs()
EndIf
If MouseDown(2)
*user_gun=FindChild(GUN,"END")
*create_shot(EntityX(user_gun,1),EntityY(user_gun,1),EntityZ(user_gun,1),EntityPitch(camera),EntityYaw(user),0)
*
EndIf
Это мы в функции обновления игрока пишем.
Завершая тему личной обороны игрока, хотелось бы добавить вот что:
Graphics3D 800,600,32
SetBuffer BackBuffer()
SetFont LoadFont("Arial",21)
Color 255,0,0
Global user
Global camera
Global GUN
Следует, так же учесть - что точность выстрела после привязки выстрела к стволу немного снижается. Выход из проблемы (если это критично в вашей игре) не один, и зависит от контекста.