<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM的多人對(duì)戰(zhàn)游戲平臺(tái)

          基于ARM的多人對(duì)戰(zhàn)游戲平臺(tái)

          作者: 時(shí)間:2013-12-04 來(lái)源:網(wǎng)絡(luò) 收藏

            開發(fā)流程如圖7所示。

          基于ARM的多人對(duì)戰(zhàn)游戲平臺(tái)

            對(duì)于某些步驟需要作詳細(xì)說(shuō)明:

            1)開辟線程

            如果讓服務(wù)器一直recvfrom(),則主線程將一直執(zhí)行此函數(shù),造成消息擁堵,從而導(dǎo)致其他事件難以響應(yīng),因此選擇開辟新線程在后臺(tái)接收客戶端信息,合理分配系統(tǒng)資源。

            開辟線程的過(guò)程如下:

            ①定義要傳送給線程的全局性質(zhì)的結(jié)構(gòu)體RECVPARAM,成員為Dlg類指針類型變量。

           ?、诙xRECVPARAM結(jié)構(gòu)體變量pRecvParam,并把當(dāng)前工程的Dlg類指針賦給其成員;創(chuàng)建線程,把pRecvParam傳遞給線程;然后關(guān)閉線程。

           ?、墼诰€程回調(diào)函數(shù)中接收傳遞來(lái)的變量pRecvParam,然后就可以調(diào)用Dlg類的成員來(lái)實(shí)現(xiàn)功能。

            2)信息格式

           ?、倏蛻舳诉B接信息

            格式隨意的字符串,目的是讓服務(wù)器端接收到數(shù)據(jù),從而發(fā)現(xiàn)客戶端IP地址。我們發(fā)的是“0000”。

           ?、诳蛻舳讼缕逍畔?P>  信息格式:用戶標(biāo)識(shí)(1位)、落子橫坐標(biāo)(2位)、落子縱坐標(biāo)(2位)。

            其中,用戶標(biāo)識(shí)位1代表先手(白方),0代表后手(黑方)。

           ?、鄯?wù)器端發(fā)送信息

            指導(dǎo)客戶端畫棋子以及顯示狀態(tài)。

            信息格式:用戶標(biāo)識(shí)(1位)、落子橫坐標(biāo)(2位)、落子縱坐標(biāo)(2位)、游戲狀態(tài)(1位)。

            其中,前5位與從客戶端接收的相同:游戲狀態(tài)位1表示游戲結(jié)束,0表示游戲未結(jié)束。

            3.3.2 客戶端程序

            創(chuàng)建基于單文檔的MFC工程。

            在App類的BOOL InitInstance()中加載套接字庫(kù):AfxSocketInit();

            添加對(duì)話框資源CDlgMode,用于選擇游戲模式:

            添加對(duì)話框資源CDlgLink,用于連接服務(wù)器;并在其上畫一個(gè)IP地址控件,用于填寫服務(wù)器IP;在確定按鈕的響應(yīng)函數(shù)中初始化套接字socket()、bind(),并向服務(wù)器發(fā)送連接請(qǐng)求sendto();

            在View類構(gòu)造函數(shù)中將模式選擇對(duì)話框DoModal(),選擇進(jìn)入雙人模式,之后的程序開發(fā)流程如圖8所示。

          基于ARM的多人對(duì)戰(zhàn)游戲平臺(tái)

            4 代碼移植

            4.1 WindowsCE簡(jiǎn)介

            Windows CE是基于Win32 API重新開發(fā)的新型信息設(shè)備平臺(tái),具有模塊化、結(jié)構(gòu)化和基于Win32應(yīng)用程序接口以及與處理器無(wú)關(guān)等特點(diǎn)。大量用戶對(duì)于Windows操作方式和編程的熟悉,是Windows CE作為嵌入式操作系統(tǒng)迅速發(fā)展的最大的優(yōu)勢(shì),也是選擇的原因。

            4.2 代碼移植

            安裝WinCE5.0的標(biāo)準(zhǔn)SDK,在VS2008開發(fā)環(huán)境下創(chuàng)建智能設(shè)備的MFC工程,選擇基于對(duì)話框或單文檔的應(yīng)用程序,并選擇剛剛安裝的標(biāo)準(zhǔn)SDK平臺(tái)。工程創(chuàng)建完成后,將在Win32下開發(fā)的代碼按同樣的方式轉(zhuǎn)移過(guò)來(lái),然后編譯,修改錯(cuò)誤。

            WinCE是Unicode環(huán)境,盡管WinCE支持ASCII功能來(lái)進(jìn)行文件交換,但是WinCE的本地文件格式是Unicode。所以,要將字符串轉(zhuǎn)換為UmcMe才能使用。另外就是代碼移植過(guò)程中丟三落四的粗心錯(cuò)誤。以下列舉代碼移植過(guò)程中遇到的問(wèn)題及解決方法:

            1)某些函數(shù)發(fā)生變化,不再識(shí)別ASCII碼字符或字符串,例如MessageBox,其字符串參數(shù)必須經(jīng)_T(“”)轉(zhuǎn)換成Unicode;另外Cstring類不要輕易使用;

            2)某些功能使用不同函數(shù),例如整型轉(zhuǎn)字符串型,由函數(shù)itoa變?yōu)開itoa_s;

            3)智能設(shè)備項(xiàng)目中沒(méi)有IP地址控件,用編輯框代替,多了些字符串拼接、轉(zhuǎn)換的工作;

            4)不要忘了使客戶端與服務(wù)器端的端口號(hào)保持一致。

            5 硬件調(diào)試及結(jié)果

            5.1 PC與arm板連接

            1)平臺(tái)連接

            通過(guò)網(wǎng)線相連,然后指定網(wǎng)關(guān)地址和IP地址。指定方法如下:本地連接一>點(diǎn)右鍵看屬性—>雙擊“Internet協(xié)議(TCP/IP)”一>使用下面的IP地址,自己填寫即可。特別注意,當(dāng)兩臺(tái)機(jī)器直接用網(wǎng)線相連而不使用路由器時(shí),必須同一個(gè)網(wǎng)關(guān)才可實(shí)現(xiàn)數(shù)據(jù)交換??赏ㄟ^(guò)ping命令測(cè)試網(wǎng)絡(luò)是否連通。

            2)運(yùn)行游戲

            利用同步軟件Microsoft AcfiveSync將開發(fā)的WinCE5.0下游戲程序傳到arm平臺(tái)中,即可在上面運(yùn)行。

            5.2 板與arm板連接

            與上述過(guò)程類同。

            6 結(jié)論

            經(jīng)實(shí)際操作驗(yàn)證,這種多人游戲開發(fā)方式(多線程)使得資源占用率很低,處理器完全可以勝任,整個(gè)游戲運(yùn)行流暢。游戲平臺(tái)可以通過(guò)有線方式互聯(lián),也可以通過(guò)無(wú)線方式互聯(lián),操作簡(jiǎn)單,使用方便。而且這種游戲平臺(tái)具有很高的開放性,利用上述的開發(fā)框架可以輕易開發(fā)出更多更好玩的游戲。


          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();