/*! @file sysInput.cpp @brief 入力 */ //#include "sys.h" #include "sysInput.h" #ifndef NW_RELEASE //#include "utScreenCapture.h" #endif #ifdef DEBUG_TEXT #include "lytManager.h" #endif namespace sys { u16 Input::msPad; // 現在の入力 u16 Input::msPadPrev; // 1フレーム前の入力 u16 Input::msPadTrig; // 現在のトリガ bool Input::msTP; bool Input::msTPTouch; nw::math::VEC2 Input::msTPPos; nw::math::VEC2 Input::msTPFloatPos; nn::hid::CTR::PadReader* Input::mspPadReader; nn::hid::CTR::PadStatus* Input::mspPadStatus; nn::hid::CTR::TouchPanelReader* Input::mspTpReader; nn::hid::CTR::TouchPanelStatus* Input::mspTpStatus; nn::hid::CTR::PadReaderWithSvr2* Input::smpPadReaderWithSvr2; /*! 初期化 */ void Input::init() { #if 0 msPad = 0; msPadPrev = 0; msPadTrig = 0; //nn::Result result; // nn::hid::Initialize(); //NN_UTIL_PANIC_IF_FAILED(result); mspPadReader = new( sys::Mem::getMainHeap() ) nn::hid::CTR::PadReader(); mspPadStatus = new( sys::Mem::getMainHeap() ) nn::hid::CTR::PadStatus(); mspPadReader->SetStickClampMode( nn::hid::CTR::PadReader::STICK_CLAMP_MODE_CROSS ); mspTpReader = new( sys::Mem::getMainHeap() ) nn::hid::CTR::TouchPanelReader(); mspTpStatus = new( sys::Mem::getMainHeap() ) nn::hid::CTR::TouchPanelStatus(); smpPadReaderWithSvr2 = new( sys::Mem::getMainHeap() ) nn::hid::CTR::PadReaderWithSvr2(); #endif } /*! 更新 */ void Input::update( int system_stt ) { #if 0 // ステートが通常以外になったときは更新を止めつつ、処理をリセットさせる if( system_stt != sys::eSystemStt_Normal ) { return; } msTPTouch = msTP; // 入力取得 bool pad_ret = mspPadReader->ReadLatest( mspPadStatus ); bool tp_ret = mspTpReader->ReadLatest( mspTpStatus ); if( tp_ret && mspTpStatus->touch == 1 ) { // タッチパネル座標系をレイアウト座標系に変換します. nw::math::VEC2 tpStatus; tpStatus.x = (f32)( mspTpStatus->x - cDown_Width / 2 ); tpStatus.y = -(f32)( mspTpStatus->y - cDown_Height / 2 ); // 遊び範囲内での動作は, // チャタリング対策のため非常に遅い追従率で追従させます. // 遊び範囲を超えたときは完全に一致させます. static const f32 cPlayRadius = 1.5f; // 遊び半径. static const f32 cSensitivity = 0.1f; // 遊び半径内での追従係数. if( msTP && nn::math::VEC2DistSq( msTPFloatPos, tpStatus ) < cPlayRadius * cPlayRadius ) { msTPFloatPos += ( tpStatus - msTPFloatPos ) * cSensitivity; } else { msTPFloatPos = tpStatus; } // 小数のまま使用すると,スライダーバーやタッチスライダーで, // 終端判定以降にじりじり動いてしまう問題が発生したため, // 整数に丸めて使用します. msTPPos.x = (int)msTPFloatPos.x; msTPPos.y = (int)msTPFloatPos.y; msTP = true; } else msTP = false; if( pad_ret ) { msPadTrig = (u16)( msPad & ~msPadPrev ); msPadPrev = msPad; } #ifndef NW_RELEASE // キャプチャー用テストコード if( isButtonHold( BUTTON_R | BUTTON_L ) ) { if( isButtonHold( KEY_UP ) ) ut::SaveDisplayBufferSD( eDisp_Up ); else if( isButtonHold( KEY_DOWN ) ) ut::SaveDisplayBufferSD( eDisp_Down ); } #endif #ifdef DEBUG_TEXT if( isButtonHold( BUTTON_R | BUTTON_L ) && isTouched() ) { static bool visible = false; visible = !visible; lyt::Manager::setDebugVisible( visible ); } #endif #endif } /*! 終了処理 */ void Input::finish() { // nn::hid::Finalize(); } /*! 押した */ u16 Input::isTouched() { return msTP && !msTPTouch; } /*! 離した */ u16 Input::isReleased() { return !msTP && msTPTouch; } /*! 押してる */ u16 Input::isTouching() { return msTP; } /*! 現在のPADのトリガ入力を取得 */ u16 Input::getPadTrig() { return mspPadStatus->trigger; } /*! 押された瞬間かどうか(トリガ) */ bool Input::isButtonTrig( u16 button ) { return ( mspPadStatus->trigger & button ) ? true: false; } /*! 押されている状態かどうか(コント) */ bool Input::isButtonHold( u16 button ) { return ( mspPadStatus->hold & button )? true: false; } /*! 3D視差ボリューム取得 0.0f〜1.0fの値が返ります */ f32 Input::getSvr2Volume() { return 0; //return smpPadReaderWithSvr2->GetSvr2Volume(); } /* アナログスティックの値 */ f32 Input::getNormalizeX() { return mspPadReader->NormalizeStick( mspPadStatus->stick.x ); } f32 Input::getNormalizeY() { return mspPadReader->NormalizeStick( mspPadStatus->stick.y ); } }