gpt4 book ai didi

c++ - 如何在 Windows Phone 8 应用程序中处理多点触控

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:41 26 4
gpt4 key购买 nike

我找不到如何在 Windows Phone 8 应用程序(在 c++ 和 directx 上的游戏中)中处理多点触控的示例。可能有人可以帮助我吗?谢谢!

最佳答案

我知道怎么做了。我是 C++ 新手,所以可能有更好的方法来执行此操作,但我的方法很有效。

(仅供引用 - 我在诺基亚的开发者网站上写了一篇关于此的文章:http://developer.nokia.com/Community/Wiki/Multi-touch_handling_using_DirectX_C%2B%2B#PointerPoint)

您需要跟踪 PointerPoint 内部的 PointerId。我将 PointerId 存储在 std::unordered_map 中的 OnPointerPressed 事件中。键 (unsigned int) 是 PointerId。然后,当您收到 OnPointerReleased 事件时,将它们从 map 中删除。 PointerId 将匹配。事实证明,对于每一个新手指,你都会得到一个新的 PointerId ......即使你松开第一个手指并再次放下它也是如此。

然后,当您到达 OnPointerMoved 事件处理程序时,您只需调用 unordered_map 上的 size() 函数即可查明当前在屏幕上有多少次触摸。

我使用 unordered_map 的原因是因为我需要跟踪以前的点位置。我知道您可能可以使用 GetIntermediatePoints 方法获得旧位置,但我不想解决新问题...

无论如何,希望这对您有所帮助。代码如下:

编辑:更新代码以处理您从每一帧 的每次触摸中获得的 x 移动事件。正如我所说,这不是最好的,但它确实有效。

#include <unordered_map>
std::unordered_map<unsigned int, Windows::UI::Input::PointerPoint^> m_pointerIds;
std::unordered_map<unsigned int, Windows::UI::Input::PointerPoint^> m_oldPoints;

void Direct3DBackground::OnPointerPressed(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
{
m_pointerIds.emplace(args->CurrentPoint->PointerId, args->CurrentPoint);
m_oldPoints.emplace(args->CurrentPoint->PointerId, args->CurrentPoint);
}

void Direct3DBackground::OnPointerMoved(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
{
if (m_pointerIds.size() == 1)
{
DoSomethingForOneTouch(args);
}
else if (m_pointerIds.size() == 2)
{
UINT changedPointId = args->CurrentPoint->PointerId;
UINT frameId = args->CurrentPoint->FrameId;

UINT otherPointId;
for (auto it = m_pointerIds.begin(); it != m_pointerIds.end(); ++it)
{
if (it->first != changedPointId)
{
otherPointId = it->first;
break;
}
}

m_oldPoints[changedPointId] = m_pointerIds[changedPointId];
m_pointerIds[changedPointId] = args->CurrentPoint;

if (m_pointerIds[otherPointId]->FrameId == frameId)
{
//DO YOUR CALCULATION using new points and old points
//as both touches have been updated for the current frame.
}
}
}

void Direct3DBackground::OnPointerReleased(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
{
m_pointerIds.erase(args->CurrentPoint->PointerId);
m_oldPoints.erase(args->CurrentPoint->PointerId);
}

关于c++ - 如何在 Windows Phone 8 应用程序中处理多点触控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com