forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Создаём свой FPS (first person shooter) (http://forum.boolean.name/showthread.php?t=15)

impersonalis 08.10.2005 17:01

да? и откуда же ему браться. Тело приобретает ускорение при толчке от земли, а дальше, это ускорение падает до 0 (точка повисает над землёй) и падает ниже 0 (тело с ускорением движется вниз).

alcosholik 08.10.2005 17:35

В данном коде при прыжке игрок мгновенно перемещается в точку над землей, а потом с ускорением падает вниз. Говоря про ускорение при движении вверх, я имел в виду, что игрок не должен сразу перемещаться в точку над землей, он должен подпрыгнуть до нее. Т.е. игрок будет двигаться вверх с определенной скоростью, но так как ускорение направлено вниз, он постепенно остановится и начнет падать вниз.

Например: в файле ES_FPS_3.bb в функции update_user() заменить этот код:
Код:

        If pick_ent
 jump_bool=False
 user_vy=0
 TranslateEntity user,0,-1,0,True
        Else
 jump_bool=True
 user_vy#=user_vy#-G#*delta_t;v1=v2-a*t
        EndIf

;;;
        If KeyHit(57) And jump_bool=False Then user_vy#=1

на этот:
Код:

        If if_jumping=0
 If pick_ent
        jump_bool=False
        user_vy=0
        TranslateEntity user,0,-1,0,True
 Else
  jump_bool=True
  user_vy#=user_vy#-G#*delta_t;v1=v2-a*t
 EndIf
        Else
 jump_amount#=jump_amount#-G#*delta_t
 If jump_amount#<0 Then if_jumping=0
        End If

;;;
        If KeyHit(57) And jump_bool=False Then jump_amount#=.06: user_vy#=user_vy#+jump_amount#: if_jumping=1

при этом в начале объявив две переменные
Код:

Global if_jumping
Global jump_amount#

А значение G# я сделал равным 0.0005

impersonalis 08.10.2005 17:44

Мдя - понизь просто ускорение, движение в компьютерной эмуляции так или иначе состоит из рывков моментального перемещения. У меня игрок перемещается на х потом на ещё часть х и ещё - т.е. плавно до точки зависания. А скачкообразность первого перемещения на х зависит только от кол-ва ФПС и калибровки коэффициентов, при чём так или иначе приращения будут дискретны, а значит характер движения на dt не равномерным.

alcosholik 08.10.2005 17:49

Цитата:

У меня игрок перемещается на х потом на ещё часть х и ещё - т.е. плавно до точки зависания
Цитата:

If KeyHit(57) And jump_bool=False Then user_vy#=1
Не могу увидеть здесь плавного перемещения до точки зависания.

impersonalis 08.10.2005 17:51

А я вообще не вижу здесь перемещения :D

alcosholik 08.10.2005 18:10

Цитата:

У меня игрок перемещается на х потом на ещё часть х и ещё - т.е. плавно до точки зависания.
Цитата:

А я вообще не вижу здесь перемещения :D
:dontknow:

jimon 08.10.2005 18:35

нестал разбиратся в коде... но пишу что translateentity zzz,0,1,0 переместит обект не резко а плавно ! ;)

impersonalis 08.10.2005 19:08

Блин! по твоему, alcoSHoLiK, строка
If KeyHit(57) And jump_bool=False Then user_vy#=1
каким то таинственным образом двигает объект? Где здесь move,translate,position entity?!

alcosholik 08.10.2005 22:13

Я говорил что эта строка двигает объект? Нет.
Я говорил "мгновенно перемещает". Да, я украинец. Возможно, я не знаю русский. Тогда приведу синонимы: "мгновенно перемещает"="телепортирует"="переставляет из одной точки в другую". Т.е. само перемещение происходит фактически за 0 интервал времени.

Я утверждал, что строчка
If KeyHit(57) And jump_bool=False Then user_vy#=1
не передвигает объект по оси Y, а мгновенно перемещает(телепортирует) его в точку 1 по Y.
Но ведь в реальном мире при прыжке человек поднимается вверх, потом опускается. Он не телепортируется в точку над землей, он поднимается по оси Y до нее.
В оригинальном коде такого нет. Я привел пример, как это сделать, немного изменив оригинальный код.
Это все, о чем говорил. Никаких претензий к автору я не имею, просто показал, как можно сделать прыжок более реалистичным.

jimon 08.10.2005 23:56

мдя... все опять кричат что я читать не умею

сами вы читать неумеете

Цитата:

нестал разбиратся в коде... но пишу что translateentity zzz,0,1,0 переместит обект не резко а плавно !
теперь прочитайте ету строку еще пару раз пока не дойдет ...

alcosholik 09.10.2005 01:46

ДЖИМОН!
ТЫ БЫ В КОДЕ СНАЧАЛА РАЗОБРАЛСЯ, А ПОТОМ КОММЕНТАРИИ ОСТАВЛЯЛ!
Код:

TranslateEntity user,0,user_vy#*delta_t,user_vy#*0.01,True
Это строчка из оригинального кода. Характер перемещения игрока по оси Y зависит от переменной user_vy#. В рассматриваемом мной блоке кода я манипулировал значением переменной, а со следующим проходом цикла координата Y игрока изменится в зависимости от значения user_vy#.

УЧИСЬ ВНИКАТЬ В СУТЬ СПОРА!

impersonalis 09.10.2005 12:51

alcoSHoLiK, я лишь говорю, что перемещение на 1 можно заменить на 0.1 или 0.00001, добившись оного варьированием коэффициентов. И будет тебе плавное смещение. ТО есть , имхо, алгоритм тут не причём. А понятие "плавного движения"- здесь суть абстракция, и используется только на приближения - допустим, в космосиме с размерами порядка 500 скачок на 1 можно считать плавным и т.п.

Короче высказались все, порядочно и пофлудили.

impersonalis 03.02.2006 15:36

Вложений: 2
Жаль нет ружья...
Самое время сделать из нашего оружия ружьё (или дробовик - это кому как нравится).
Добавим задержку между выстрелами.
Как всегда, код будет максимально упрощён и носить чисто ознакомительный характер.
Топаем в константы и дописываем:
Код:

Const G#=0.001

Const shot_delay=1000; - вот это

Const USERT=1;for user

Нетрудно догадаться - это пауза между выстрелами в мс.
Код:

Global user_vy#
Global last_shot_time

пишем чуть ниже в глобалах.
Переходим в update_user().
Переписываем условие выстрела:
Код:

        If MouseHit(1) And MilliSecs()-last_shot_time>shot_delay
 *create_shot(EntityX(user),EntityY(user),EntityZ(user),EntityPitch(camera),EntityYaw(user),0)
 *last_shot_time=MilliSecs()
        EndIf

Ну и для большей наглядности визуализируем процесс перезарадки в MAIN LOOP:
Код:

;=
        If MilliSecs()-last_shot_time<=shot_delay
 Text 10,10,"RELOAD..."
        EndIf
;=


impersonalis 09.02.2006 19:09

Автомат в руки
Вот мне тут сообщают в 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

Следует, так же учесть - что точность выстрела после привязки выстрела к стволу немного снижается. Выход из проблемы (если это критично в вашей игре) не один, и зависит от контекста.

impersonalis 20.02.2006 21:20

Вложений: 2
Куда глаза глядят
Следующее что хотелось рассмотреть в цикле заметочек.
Указание направления дивжения бота при помощи спрайта. Как таковой пример особой ценности не

имеет, однако может понадобиться в дальнейшем и может быть модфицирован под нужды "девелопера".
Открываем графический редактор (к примеру MS Paint) и творим: нам понадобиться круг, с одним

проведённым радиусом.
Теперь вопрос: подгружать спрайт по мере необходимости или использовать образец? Для такой простой

игры это не критично, однако, стоит приучиться использовать копии объектов. (в идеале должен быть

и образец для каждого типа "выстрела"). Приступим:
Код:

Global pricel=LoadImage("pricel.bmp")
Global shot_sprite=LoadSprite("sprite.bmp")
Global orient_sprite=LoadSprite("orient.bmp")

Код:

Function create_world()
Function create_world()
        light=CreateLight()
        RotateEntity light,90,0,0
       
        HideEntity shot_sprite
        HideEntity orient_sprite
        SpriteViewMode orient_sprite,2

Создание бота немного подправим:
Код:

        NameEntity b\entity,Handle(b)
       
        Orient=CopyEntity(orient_sprite)
        TurnEntity Orient,90,0,0
        EntityParent Orient,b\entity
        PositionEntity Orient,0,-1,0
       
       
        Return True

Так... теперь вернёмся в место сокрытия образца и откалибруем размер спрайта:
Код:

SpriteViewMode orient_sprite,2
ScaleSprite orient_sprite,5,5

Собственно... пока всё.


Часовой пояс GMT +4, время: 06:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot