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;
}