Вы не вошли.

Canore

Новичок

  • "Canore" мужчина
  • "Canore" создал эту тему

Сообщений: 15

Место жительства: ~Владивосток

1

Среда, 15 Март 2017, 13:58

[c#] RPG Camera (Code) (CryEngine 5)

Я тут посидел минут 20 написал свой код RPG камеры он конечно далёк от идеала. И вот мне стало интересно есть ли уже готовое решение на c# ?

Код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* * Код работает только если курсор скрыт*/using CryEngine.Common;
namespace CryEngine.SampleApp{    class ThirdPersonCamera    {        // Угол под которым камера направлена на цель        private Angles3 angles;
        // Чувствительность мыши по осям        private float xSpeed = 1.0f, ySpeed = 1.0f;        // Растояние от цели до камеры        private float walkDistance = 5.0f;        // Цель        private Entity target;        // Флаг, чтобы отслеживать первый цикл нажатия правой кнопки мыши        private bool flag = false;
        // Нужно для работы функции Ray.Cast        private static rwi_flags _rayFlags = unchecked((rwi_flags)(((uint)((int)geom_flags.geom_colltype_ray << (int)rwi_flags.rwi_colltype_bit) | (int)rwi_flags.rwi_colltype_any | (10 & (int)rwi_flags.rwi_pierceability_mask) | ((int)geom_flags.geom_colltype14 << (int)rwi_flags.rwi_colltype_bit))));
        // target - цель; xSpeed, ySpeed - чувствительность мыши по осям        public ThirdPersonCamera(float xSpeed, float ySpeed)        {            angles = new Angles3();
            this.target = null;
            this.angles = new Angles3(0.0f, 0.0f, 0.0f);
            this.xSpeed = xSpeed;            this.ySpeed = ySpeed;        }
        // Можно сменить цель        public void SetTarget(Entity target)        {            this.target = target;        }
        // Функци проверки столкновения с terrain (можно использовать не только с terrain)        private void Collision()        {            // Получаем направление со цели в сторону камеры            var dir = (Camera.Position - target.Position).Normalized;
            var raycast = Ray.Cast(target.Position, dir, walkDistance + 1.0f, entity_query_flags.ent_terrain, _rayFlags, 1);                        if (raycast.Hits != 0)                Camera.Position = raycast.Point - dir;        }
        #region Mouse
        /* В этой части кода есть проблема: если разрешение окна игры число нечётное, то         * достаточно просто зажать правую кнопку мыши и камера начнёт перемещаться вверх. */                // Функция нормализации числа в пределах [-1; 1]         private float Norm(float x, int max)        {            return 2 * (x - max / 2) / max + 1;        }        // На выходе получаем нормализированое изменение(delta) координат мышки по оси X        private float getAxisX()        {            return Norm(Mouse.CursorPosition.x - Global.gEnv.pRenderer.GetWidth() / 2, Global.gEnv.pRenderer.GetWidth());        }        // На выходе получаем нормализированое изменение(delta) координат мышки по оси Y        private float getAxisY()        {            return Norm(Mouse.CursorPosition.y - Global.gEnv.pRenderer.GetHeight() / 2, Global.gEnv.pRenderer.GetHeight());        }
        #endregion Mouse
        public void Update(bool onKeyDown)        {            if (target == null) return;
            if (onKeyDown)            {                if (flag)                {                    angles -= new Angles3(getAxisY() * ySpeed * 0.02f, 0.0f, getAxisX() * xSpeed * 0.02f);                }                else                {                    flag = true;                }
                // Задаём положение мыши точно по середине экрана                 Global.gEnv.pHardwareMouse.SetHardwareMouseClientPosition(Global.gEnv.pRenderer.GetWidth() / 2, Global.gEnv.pRenderer.GetHeight() / 2);            } else            {                flag = false;            }
            Camera.Rotation = angles.Quaternion;            Camera.Position = Camera.Rotation * new Vector3(0.0f, -walkDistance, 0.0f) + target.Position;
            Collision();        }    }}



Всё что надо это создать этот класс.

Инициализировать его в главном классе.

Код

1
2
3
4
5
        /* Camera */        ThirdPersonCamera tCamera;        Entity target;
        bool onMouseButtonDown = false;        /* ~Camera */
        public SampleApp()        {			Instance = this;			CreateUI ();
            tCamera = new ThirdPersonCamera(20.0f, 20.0f);
            GameFramework.RegisterForUpdate(this);			Input.OnKey += OnKey;		}


Затем выбрать цель

Код

1
2
3
4
 public virtual void OnUpdate()		{            if (target == null)            {                target = Entity.Find("primitive_sphere1");
                tCamera.SetTarget(target);            }
            tCamera.Update(onMouseButtonDown);
		}

Ну и обновлять значение нажатой клавиши

Код

1
void OnKey(SInputEvent e)		{            if (e.KeyPressed(EKeyId.eKI_Mouse2))                onMouseButtonDown = true;            if (e.KeyUp(EKeyId.eKI_Mouse2))                onMouseButtonDown = false;        }

2

Понедельник, 8 Январь 2018, 09:13

вот тут у меня не срастается, пишет что Cast нету Ray.Cast(target.Position, dir, walkDistance + 1.0f, entity_query_flags.ent_terrain, _rayFlags, 1);

я так понял что его самому нужно от движка проводить? просто только недавно перешол на двиг и не могу разобраться как недастающие функции притягивать к шарпу из движка,

Буду очень благодарен если объясниш схему,