<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 6.3 處理游戲手柄事件 wxJoystick類讓你可以在windows平臺或者linux平臺上使用一到兩個游戲手柄.典型的使用方法是,你創建wxJoystick的一個實例,并且傳遞給它wxJOYSTICK1或者wxJOYSTICK2的參數,并且以全局指針保持這個實例.當你需要處理手柄事件的時候,使用 SetCapture函數和一個窗口指針作為參數,來使的這個窗口收到游戲手柄事件,當你不需要使用手柄的時候,調用ReleaseCapture函數移出手柄事件.當然,你完全可以在應用程序初始化的時候調用SetCapture函數而在應用程序退出的時候調用ReleaseCapture函數,以便在整個應用程序生命周期內處理游戲手柄事件. 在開始描述詳細的函數和事件之前,讓我們先看一下wxWidgets的發行版中samples/joystick目錄中的例子.在這個例子中,用戶可以使用游戲手柄上的某個按鈕畫線,并且在按下按鈕的時候播放一個聲音片斷. 下面大概列出了應用程序的起始代碼,首先,應用程序通過創建一個臨時的游戲手柄對象來檢查系統是否有安裝手柄,如果沒有則退出應用程序.然后裝載聲音文件,并且獲取手柄的最大活動范圍以便在窗口上畫畫的時候實現合理的縮放使得畫畫的區域充滿整個繪畫窗口. ``` #include "wx/wx.h" #include "wx/sound.h" #include "wx/joystick.h" bool MyApp::OnInit() { wxJoystick stick(wxJOYSTICK1); if (!stick.IsOk()) { wxMessageBox(wxT("No joystick detected!")); return false; } m_fire.Create(wxT("buttonpress.wav")); m_minX = stick.GetXMin(); m_minY = stick.GetYMin(); m_maxX = stick.GetXMax(); m_maxY = stick.GetYMax(); // Create the main frame window ... return true; } ``` MyCanvas是那個用來接收和處理手柄事件的窗口,下面的MyCanvas類的實現部分: ``` BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) EVT_JOYSTICK_EVENTS(MyCanvas::OnJoystickEvent) END_EVENT_TABLE() MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size): wxScrolledWindow(parent, wxID_ANY, pos, size, wxSUNKEN_BORDER) { m_stick = new wxJoystick(wxJOYSTICK1); m_stick->SetCapture(this, 10); } MyCanvas::~MyCanvas() { m_stick->ReleaseCapture(); delete m_stick; } void MyCanvas::OnJoystickEvent(wxJoystickEvent& event) { static long xpos = -1; static long ypos = -1; wxClientDC dc(this); wxPoint pt(event.GetPosition()); // if negative positions are possible then shift everything up int xmin = wxGetApp().m_minX; int xmax = wxGetApp().m_maxX; int ymin = wxGetApp().m_minY; int ymax = wxGetApp().m_maxY; if (xmin &lt; 0) { xmax += abs(xmin); pt.x += abs(xmin); } if (ymin &lt; 0) { ymax += abs(ymin); pt.y += abs(ymin); } // Scale to canvas size int cw, ch; GetSize(&cw, &ch); pt.x = (long) (((double)pt.x/(double)xmax) * cw); pt.y = (long) (((double)pt.y/(double)ymax) * ch); if (xpos &gt; -1 && ypos &gt; -1 && event.IsMove() && event.ButtonIsDown()) { dc.SetPen(*wxBLACK_PEN); dc.DrawLine(xpos, ypos, pt.x, pt.y); } xpos = pt.x; ypos = pt.y; wxString buf; if (event.ButtonDown()) buf.Printf(wxT("Joystick (%d, %d) Fire!"), pt.x, pt.y); else buf.Printf(wxT("Joystick (%d, %d)"), pt.x, pt.y); frame->SetStatusText(buf); if (event.ButtonDown() && wxGetApp().m_fire.IsOk()) { wxGetApp().m_fire.Play(); } } ``` wxJoystick的事件 wxJoystick類產生wxJoystickEvent類型的事件,下表列出了所有相關的事件映射宏: | EVT_JOY_BUTTON(func) | 用來處理wxEVT_JOY_BUTTON_DOWN事件,手柄上的某個按鈕被按下的時候產生. | |:--- |:--- | | EVT_JOY_BUTTON(func) | 用來處理wxEVT_JOY_BUTTON_UP事件,某個按鈕被釋放的時候產生. | | EVT_JOY_MOVE(func) | 用來處理wxEVT_JOY_MOVE事件,手柄在X-Y平面上產生移動的時候產生. | | EVT_JOY_ZMOVE(func) | 用來處理wxEVT_JOY_ZMOVE事件,手柄在Z方向上產生移動的時候產生. | | EVT_JOYSTICK_EVENTS(func) | 處理所有的手柄事件. | wxJoystickEvent的成員函數 下面列出了所有wxJoystickEvent的成員函數,你可以使用它們獲取關于手柄事件更詳細的信息,當然,首先還是GetEventType函數,這個函數在你使用EVT_JOYSTICK_EVENTS宏的時候告訴你你正在處理哪種類型的手柄事件. 調用ButtonDown函數來檢測是否是按鈕被按下事件,你可以傳遞可選的wxJOY_BUTTONn(n代表1,2,3或4)來測試是否某個特定的按鈕正被按下,或者使用wxJOY_BUTTON_ANY如果你不關心具體是哪個按鈕被按下的話.ButtonUp則用相似的方法來檢測是按鈕被釋放事件.而IsButton則相當于調用ButtonDown() || ButtonUp(). 要判斷是否某個按鈕被按下的狀態而不是事件本身,你可以使用ButtonIsDown函數,它和ButtonDown的參數相似.或者你可以直接使用GetButtonState函數和類似的參數來返回指定按鈕的按下狀態的比特位. 使用IsMove函數來判斷是否是一個XY平面的移動事件,使用IsZMove判斷是否是一個Z平面的移動事件. GetPosition返回游戲手柄當前XY平面的座標,而GetZPosition返回Z方向的深度值(當然,如果手柄支持的話). 最后,你可以使用GetJoystick來判斷這個事件是哪個手柄(wxJOYSTICK1還是wxJOYSTICK2)產生的. wxJoystick成員函數 我們沒有列出游戲手柄類所有的成員函數,你可以參考wxWidgets的手冊,不過下面是其中最有趣的幾個: 正象我們在前面的例子中看到的那樣,SetCapture函數需要被調用如果你想讓某個窗口處理手柄事件,而一個匹配的 ReleaseCapture函數調用用來釋放這次捕獲,以便允許別的應用程序使用手柄.為避免別的程序正在使用手柄,或者手柄不能正常工作,你應該在調用SetCapture之前先調用IsOK函數來判斷手柄的狀態.你還可以通過這些函數來獲取手柄的能力集:GetNumberButtons, GetNumberJoysticks,GetNumberAxes,HasRudder等等. GetPosition函數和GetButtonState函數可以讓你在手柄事件處理函數以外的地方獲取手柄的狀態. 你的應用程序還可能需要調用GetXMin,GetXMax等這些類似的函數來判斷一個手柄支持的范圍.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看