FlaxEngine学习笔记(十二):input模块(4)

2021SC@SDUSC

接着上一篇博客input.cpp文件后续的部分进行分析:

 const auto axisMappings = stream.FindMember("AxisMappings");
    if (axisMappings != stream.MemberEnd())
    {
        auto& axisMappingsArray = axisMappings->value;
        if (axisMappingsArray.IsArray())
        {
            AxisMappings.Resize(axisMappingsArray.Size(), false);
            for (uint32 i = 0; i < axisMappingsArray.Size(); i++)
            {
                auto& v = axisMappingsArray[i];
                if (!v.IsObject())
                    continue;

                AxisConfig& config = AxisMappings[i];
                config.Name = JsonTools::GetString(v, "Name");
                config.Axis = JsonTools::GetEnum(v, "Axis", InputAxisType::MouseX);
                config.Gamepad = JsonTools::GetEnum(v, "Gamepad", InputGamepadIndex::All);
                config.PositiveButton = JsonTools::GetEnum(v, "PositiveButton", KeyboardKeys::None);
                config.NegativeButton = JsonTools::GetEnum(v, "NegativeButton", KeyboardKeys::None);
                config.DeadZone = JsonTools::GetFloat(v, "DeadZone", 0.1f);
                config.Sensitivity = JsonTools::GetFloat(v, "Sensitivity", 0.4f);
                config.Gravity = JsonTools::GetFloat(v, "Gravity", 1.0f);
                config.Scale = JsonTools::GetFloat(v, "Scale", 1.0f);
                config.Snap = JsonTools::GetBool(v, "Snap", false);
            }
        }
        else
        {
            AxisMappings.Resize(0, false);
        }
    }
}

经过一些输入信息的初始化后,还要对轴进行信息设置。

接着是一些重要函数:

1.鼠标移动:对鼠标新位置的记录

void Mouse::OnMouseMoved(const Vector2& newPosition)
{
    _prevState.MousePosition = newPosition;
    _state.MousePosition = newPosition;
}

2.鼠标按,参数为鼠标的位置、鼠标的左右键按下以及窗口的指针。

void Mouse::OnMouseDown(const Vector2& position, const MouseButton button, Window* target)
{
    Event& e = _queue.AddOne();
    e.Type = EventType::MouseDown;
    e.Target = target;
    e.MouseData.Button = button;
    e.MouseData.Position = position;
}

3.鼠标松开,需要注意必须在事件队列中加入这一事件。

void Mouse::OnMouseDoubleClick(const Vector2& position, const MouseButton button, Window* target)
{
    Event& e = _queue.AddOne();
    e.Type = EventType::MouseDoubleClick;
    e.Target = target;
    e.MouseData.Button = button;
    e.MouseData.Position = position;
}

4.鼠标双击事件,参数同上 

void Mouse::OnMouseUp(const Vector2& position, const MouseButton button, Window* target)
{
    Event& e = _queue.AddOne();
    e.Type = EventType::MouseUp;
    e.Target = target;
    e.MouseData.Button = button;
    e.MouseData.Position = position;
}

5.鼠标更新,是对游戏引擎更新函数中鼠标部分的操作,通过对上述一系列鼠标函数进行switch分支判断,实现。 

bool Mouse::Update(EventQueue& queue)
{
    // Move the current state to the previous
    Platform::MemoryCopy(&_prevState, &_state, sizeof(State));

    // Gather new events
    if (UpdateState())
        return true;

    // Handle events
    _state.MouseWheelDelta = 0;
    for (int32 i = 0; i < _queue.Count(); i++)
    {
        const Event& e = _queue[i];
        switch (e.Type)
        {
        case EventType::MouseDown:
        {
            _state.MouseButtons[static_cast<int32>(e.MouseData.Button)] = true;
            break;
        }
        case EventType::MouseUp:
        {
            _state.MouseButtons[static_cast<int32>(e.MouseData.Button)] = false;
            break;
        }
        case EventType::MouseDoubleClick:
        {
            _state.MouseButtons[static_cast<int32>(e.MouseData.Button)] = true;
            break;
        }
        case EventType::MouseWheel:
        {
            _state.MouseWheelDelta += e.MouseWheelData.WheelDelta;
            break;
        }
        case EventType::MouseMove:
        {
            _state.MousePosition = e.MouseData.Position;
            break;
        }
        case EventType::MouseLeave:
        {
            break;
        }
        }
    }

    // Send events further
    queue.Add(_queue);
    _queue.Clear();
    return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值