【问题标题】:C++ WinRT - How to convert C++CX Array<> template to WinRT?C++ WinRT - 如何将 C++CX Array<> 模板转换为 WinRT?
【发布时间】:2019-06-12 22:04:01
【问题描述】:

如何将以下代码转换为 C++ WinRT?

Platform::Array<bool>^ currentButtonReading =
ref new Platform::Array<bool>(buttonCount);

Platform::Array<GameControllerSwitchPosition>^ currentSwitchReading =
ref new Platform::Array<GameControllerSwitchPosition>(switchCount);

Platform::Array<double>^ currentAxisReading = ref new Platform::Array<double>(axisCount);

rawGameController->GetCurrentReading(
    currentButtonReading,
    currentSwitchReading,
    currentAxisReading);

来自文章:

https://docs.microsoft.com/en-us/windows/uwp/gaming/raw-game-controller

请指教。

【问题讨论】:

  • 这不是 C++ 代码。
  • C++/WinRT accepts 一个std::array,一个std::vector 一个经典的符合数组,或者一对指针[开始,结束)。
  • Raymond,谢谢你的提示,我看到了你分享的那个页面,但不知道如何将它转换为 C++ WinRT 格式。如果你知道怎么做,可以根据上面的代码分享你是怎么做的吗?
  • SergeyA,不确定您的评论,但如果您知道如何将上面的代码转换为 C++ WinRT,请在此处分享。 TQ :)
  • 您是否只是尝试使用游戏控制器 API(在这种情况下,生成的标头具有正确的签名,基于 array_view&lt;T&gt;)或者这只是一个示例,您实际上是在尝试用别的东西?

标签: c# windows-runtime c++-winrt


【解决方案1】:

这是经过一番研究的答案。

C++ WinRT 转换源码:

struct _GAMEPAD
{     
    std::vector<RawGameController> db;
    RawGameController              controller{ nullptr };

    std::array<bool, 16>           abtn{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
    array_view<bool>               avbtn{ abtn };

    std::array<double, 6>          aaxi{ 0,0,0,0,0,0 };
    array_view<double>             avaxi{ aaxi };

    array_view<GameControllerSwitchPosition> avswp{};
};      

struct MainPage : MainPageT<MainPage>
{
...
    _GAMEPAD m_gamepad;
...
};

int MainPage::OnProc ()
{
...
    for (auto e : RawGameController::RawGameControllers() ) 
    {
        auto it = std::find( m_gamepad.db.begin(), m_gamepad.db.end(), e );

        if (it == m_gamepad.db.end())
        {
            m_gamepad.db.insert( m_gamepad.db.begin()+m_io.gamepad, e );
            m_io.gamepad++;
        } 
    }
    // assumed there is one gamepad.
    n = m_io.gamepad - 1;
    m_gamepad.controller = m_gamepad.db.at(n);

    m_gamepad.controller.GetCurrentReading( m_gamepad.avbtn,
                                            m_gamepad.avswp,
                                            m_gamepad.avaxi);
...
}

希望,这个帮助。

【讨论】:

  • 您不需要手动创建array_view 对象。让投影来做吧。 m_gamepad.controller.GetCurrentReading(m_gamepad.abtn, {}, m_gamepad.aaxi).
猜你喜欢
  • 2020-12-17
  • 2023-04-11
  • 2011-11-25
  • 2020-11-27
  • 2021-04-05
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多