Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini berkaitan dengan API asli WinRT warisan. Untuk proyek aplikasi asli baru, sebaiknya gunakan OpenXR API.
Cuplikan kode dalam artikel ini saat ini menunjukkan penggunaan C++/CX daripada C++17-compliant C++/WinRT seperti yang digunakan dalam templat proyek holografik C++. Konsepnya setara untuk proyek C++/WinRT, meskipun Anda harus menerjemahkan kode.
Berlangganan peristiwa input CoreWindow
Input keyboard
Di templat aplikasi Holografik Windows, kami menyertakan penanganan aktivitas untuk input keyboard seperti aplikasi UWP lainnya. Aplikasi Anda menggunakan data input keyboard dengan cara yang sama dalam Windows Mixed Reality.
Dari AppView.cpp:
// Register for keypress notifications.
window->KeyDown +=
ref new TypedEventHandler<CoreWindow^, KeyEventArgs^>(this, &AppView::OnKeyPressed);
…
// Input event handlers
void AppView::OnKeyPressed(CoreWindow^ sender, KeyEventArgs^ args)
{
//
// TODO: Respond to keyboard input here.
//
}
Input keyboard virtual
Untuk headset desktop imersif, Anda dapat mendukung keyboard virtual yang dirender oleh Windows melalui tampilan imersif Anda dengan menerapkan CoreTextEditContext. Ini memungkinkan Windows memahami status kotak teks yang dirender aplikasi Anda sendiri, sehingga keyboard virtual dapat berkontribusi dengan benar pada teks di sana.
Untuk informasi selengkapnya tentang menerapkan dukungan CoreTextEditContext, lihat sampel CoreTextEditContext.
Mouse Input
Anda juga dapat menggunakan input mouse, sekali lagi melalui handler peristiwa input UWP CoreWindow. Berikut cara memodifikasi templat aplikasi Windows Holographic untuk mendukung klik mouse dengan cara yang sama seperti gerakan yang ditekan. Setelah melakukan modifikasi ini, klik mouse saat mengenakan perangkat headset imersif akan memposisikan ulang kubus.
Catatan
Aplikasi UWP juga bisa mendapatkan data XY mentah untuk mouse dengan menggunakan MouseDevice API.
Mulailah dengan mendeklarasikan handler OnPointerPressed baru di AppView.h:
protected:
void OnPointerPressed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args);
Di AppView.cpp, tambahkan kode ini ke SetWindow:
// Register for pointer pressed notifications.
window->PointerPressed +=
ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &AppView::OnPointerPressed);
Kemudian letakkan definisi ini untuk OnPointerPressed di bagian bawah file:
void AppView::OnPointerPressed(CoreWindow^ sender, PointerEventArgs^ args)
{
// Allow the user to interact with the holographic world using the mouse.
if (m_main != nullptr)
{
m_main->OnPointerPressed();
}
}
Penanganan aktivitas yang baru saja kami tambahkan adalah pass-through ke kelas utama templat. Mari kita ubah kelas utama untuk mendukung pass-through ini. Tambahkan deklarasi metode publik ini ke file header:
// Handle mouse input.
void OnPointerPressed();
Anda juga memerlukan variabel anggota privat ini:
// Keep track of mouse input.
bool m_pointerPressed = false;
Terakhir, kita akan memperbarui kelas utama dengan logika baru untuk mendukung klik mouse. Mulailah dengan menambahkan penanganan aktivitas ini. Pastikan untuk memperbarui nama kelas:
void MyHolographicAppMain::OnPointerPressed()
{
m_pointerPressed = true;
}
Sekarang, dalam metode Perbarui, ganti logika yang ada untuk mendapatkan pose pointer dengan ini:
SpatialInteractionSourceState^ pointerState = m_spatialInputHandler->CheckForInput();
SpatialPointerPose^ pose = nullptr;
if (pointerState != nullptr)
{
pose = pointerState->TryGetPointerPose(currentCoordinateSystem);
}
else if (m_pointerPressed)
{
pose = SpatialPointerPose::TryGetAtTimestamp(currentCoordinateSystem, prediction->Timestamp);
}
m_pointerPressed = false;
Kompilasi ulang dan sebarkan ulang. Perhatikan bahwa klik mouse sekarang akan memposisikan ulang kubus di headset imersif Anda - atau HoloLens dengan mouse bluetooth terpasang.
Dukungan pengontrol game
Pengontrol game bisa menjadi cara yang menyenangkan dan nyaman untuk memungkinkan pengguna mengontrol pengalaman Windows Mixed Reality yang imersif.
tambahkan deklarasi anggota privat berikut ke kelas header untuk file utama Anda:
// Recognize gamepads that are plugged in after the app starts.
void OnGamepadAdded(Platform::Object^, Windows::Gaming::Input::Gamepad^ args);
// Stop looking for gamepads that are unplugged.
void OnGamepadRemoved(Platform::Object^, Windows::Gaming::Input::Gamepad^ args);
Windows::Foundation::EventRegistrationToken m_gamepadAddedEventToken;
Windows::Foundation::EventRegistrationToken m_gamepadRemovedEventToken;
// Keeps track of a gamepad and the state of its A button.
struct GamepadWithButtonState
{
Windows::Gaming::Input::Gamepad^ gamepad;
bool buttonAWasPressedLastFrame = false;
};
std::vector<GamepadWithButtonState> m_gamepads;
Inisialisasi peristiwa gamepad, dan gamepad apa pun yang saat ini terpasang, di konstruktor untuk kelas utama Anda:
// If connected, a game controller can also be used for input.
m_gamepadAddedEventToken = Gamepad::GamepadAdded +=
ref new EventHandler<Gamepad^>(
bind(&$safeprojectname$Main::OnGamepadAdded, this, _1, _2)
);
m_gamepadRemovedEventToken = Gamepad::GamepadRemoved +=
ref new EventHandler<Gamepad^>(
bind(&$safeprojectname$Main::OnGamepadRemoved, this, _1, _2)
);
for (auto const& gamepad : Gamepad::Gamepads)
{
OnGamepadAdded(nullptr, gamepad);
}
Tambahkan penanganan aktivitas ini ke kelas utama Anda. Pastikan untuk memperbarui nama kelas:
void MyHolographicAppMain::OnGamepadAdded(Object^, Gamepad^ args)
{
for (auto const& gamepadWithButtonState : m_gamepads)
{
if (args == gamepadWithButtonState.gamepad)
{
// This gamepad is already in the list.
return;
}
}
m_gamepads.push_back({ args, false });
}
void MyHolographicAppMain::OnGamepadRemoved(Object^, Gamepad^ args)
{
m_gamepads.erase(
std::remove_if(m_gamepads.begin(), m_gamepads.end(), [&](GamepadWithButtonState& gamepadWithState)
{
return gamepadWithState.gamepad == args;
}),
m_gamepads.end());
}
Terakhir, perbarui logika input untuk mengenali perubahan dalam status pengontrol. Di sini, kita menggunakan variabel m_pointerPressed yang sama yang dibahas di bagian di atas untuk menambahkan peristiwa mouse. Tambahkan ini ke metode Pembaruan, tepat sebelum memeriksa SpatialPointerPose:
// Check for new input state since the last frame.
for (auto& gamepadWithButtonState : m_gamepads)
{
bool buttonDownThisUpdate = ((gamepadWithButtonState.gamepad->GetCurrentReading().Buttons & GamepadButtons::A) == GamepadButtons::A);
if (buttonDownThisUpdate && !gamepadWithButtonState.buttonAWasPressedLastFrame)
{
m_pointerPressed = true;
}
gamepadWithButtonState.buttonAWasPressedLastFrame = buttonDownThisUpdate;
}
// For context.
SpatialInteractionSourceState^ pointerState = m_spatialInputHandler->CheckForInput();
SpatialPointerPose^ pose = nullptr;
if (pointerState != nullptr)
{
pose = pointerState->TryGetPointerPose(currentCoordinateSystem);
}
else if (m_pointerPressed)
{
pose = SpatialPointerPose::TryGetAtTimestamp(currentCoordinateSystem, prediction->Timestamp);
}
m_pointerPressed = false;
Jangan lupa untuk membatalkan pendaftaran peristiwa saat membersihkan kelas utama:
if (m_gamepadAddedEventToken.Value != 0)
{
Gamepad::GamepadAdded -= m_gamepadAddedEventToken;
}
if (m_gamepadRemovedEventToken.Value != 0)
{
Gamepad::GamepadRemoved -= m_gamepadRemovedEventToken;
}
Kompilasi ulang, dan sebarkan ulang. Anda sekarang dapat melampirkan, atau memasangkan, pengontrol game dan menggunakannya untuk memposisikan ulang kubus berputar.