- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我找不到如何在 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/
我是一名优秀的程序员,十分优秀!