• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于Cocos2d-x引擎的麻將游戲設(shè)計(jì)

      2019-12-25 08:00:14劉皎
      微型電腦應(yīng)用 2019年12期
      關(guān)鍵詞:引擎精靈賬號(hào)

      劉皎

      (商洛學(xué)院 電子信息與電氣工程學(xué)院, 商洛 726000)

      0 引言

      隨著智能手機(jī)的普及和4G網(wǎng)絡(luò)覆蓋的增加,以及國(guó)內(nèi)三大運(yùn)營(yíng)商5G網(wǎng)絡(luò)的試點(diǎn)開(kāi)始,手機(jī)網(wǎng)絡(luò)游戲正在日益興盛[1-2]。智能手機(jī)變得越發(fā)強(qiáng)大,以及騰訊、網(wǎng)易等公司大力發(fā)展手游,未來(lái)幾年手游將出現(xiàn)爆發(fā)式增長(zhǎng)[3-4]。目前iOS和Android游戲營(yíng)收巨大。手機(jī)游戲作為Android系統(tǒng)的一個(gè)重要組成部分,如何在手機(jī)平臺(tái)上開(kāi)發(fā)出一款高效的游戲正在被越來(lái)越多的開(kāi)發(fā)者所重視。Cocos2d-x是一種可以支持多種操作系統(tǒng)的游戲引擎,并且是開(kāi)源的[5-7],可以極大地提升游戲開(kāi)發(fā)效率。Cocos2d-x圍繞Cocos2d跨平臺(tái)提供的框架,封裝了復(fù)雜OpenGL圖形接口,并抽象出精靈和動(dòng)作等概念,降低了游戲開(kāi)發(fā)的難度,簡(jiǎn)化了開(kāi)發(fā)過(guò)程。本文基于Visual Studio C++2013開(kāi)發(fā)平臺(tái),采用Cocos2d-x游戲引擎框架,設(shè)計(jì)了一款適用于A(yíng)ndroid的休閑麻將手游。

      1 游戲的開(kāi)發(fā)環(huán)境

      游戲在windows8.1系統(tǒng)下開(kāi)發(fā),基于Microsoft Visual C++2013開(kāi)發(fā)平臺(tái),采用了cocos2d-x引擎框架。

      Microsoft Visual C++2013具有強(qiáng)大的功能和友好的界面,是目前最熱門(mén)的C++語(yǔ)言開(kāi)發(fā)環(huán)境。Visual C++提供的集成開(kāi)發(fā)環(huán)境、MFC類(lèi)庫(kù)和應(yīng)用程序框架極大地促進(jìn)了C++中Windows應(yīng)用程序的開(kāi)發(fā)。它可以完成源代碼的編寫(xiě)、用戶(hù)界面的設(shè)計(jì)、消息映射、編譯連接和調(diào)試運(yùn)行等工作。Visual C++的應(yīng)用能夠明顯縮短程序編輯、編譯及連接的時(shí)間花費(fèi),在大型軟件的研發(fā)中其優(yōu)勢(shì)更為顯著[8]。

      Cocos2d-x是目前較為流行的游戲開(kāi)發(fā)引擎,當(dāng)前市場(chǎng)上多數(shù)的2D游戲都是采用它進(jìn)行開(kāi)發(fā)的[9-10]?;贑ocos2d-x引擎的基本框架,游戲開(kāi)發(fā)者可以在一個(gè)平臺(tái)進(jìn)行開(kāi)發(fā)然后將其移植到其它平臺(tái)進(jìn)行編譯,例如,可以將開(kāi)發(fā)的游戲移植到 Android、iOS、Mac、Windows 等平臺(tái)之上。Cocos2d-x引擎框架中幾個(gè)重要概念之間的關(guān)系如圖1所示。

      在整個(gè)框架中,導(dǎo)演Director是框架的核心,負(fù)責(zé)整個(gè)游戲的運(yùn)行;場(chǎng)景Scene是游戲中的各個(gè)界面,包含了登錄、注冊(cè)、游戲大廳、設(shè)置、主界面及退出界面等;布景Layer的功能就是在界面上添加各種有效信息,比如游戲登錄加載條、游戲分享、簽到等信息;精靈Sprite是直接繪制在屏幕上的2D位圖,一般可以用一個(gè)子矩陣或一個(gè)圖片來(lái)創(chuàng)建,用來(lái)顯示一些玩家信息,如積分、得分等;動(dòng)作Action可以單獨(dú)加到精靈上,也可以多個(gè)動(dòng)作組合加入到精靈上,使其完成一系列動(dòng)作。

      圖1 Cocos2d-x引擎框架中幾種基本概念間的關(guān)系圖

      2 游戲設(shè)計(jì)

      2.1 游戲功能框架

      基于Cocos2d-x麻將游戲的總體結(jié)構(gòu)如圖2所示。

      它主要包括引擎模塊、數(shù)據(jù)模塊、網(wǎng)絡(luò)模塊、游戲邏輯、UI界面、聲音模塊和AI。引擎模塊即為Cocos2d-x引擎;數(shù)據(jù)模塊即為玩具信息和游戲資源,玩具信息包括玩家的注冊(cè)信息、游戲過(guò)程中產(chǎn)生的數(shù)據(jù)、玩家的戰(zhàn)績(jī)等;游戲資源包括背景音樂(lè)和界面圖片等;網(wǎng)絡(luò)模塊采用http協(xié)議;游戲邏輯包括擲骰子、發(fā)牌、出牌、吃碰杠、胡牌及自摸等;UI界面由登錄界面、匹配界面和游戲界面等組成;聲音模塊包括背景音樂(lè)及聲音音效,用戶(hù)可以自行選擇音效處于打開(kāi)或關(guān)閉狀態(tài)。AI包括了局面分析和分支預(yù)測(cè)等。

      圖2 游戲功能框架圖

      2.2 游戲網(wǎng)絡(luò)結(jié)構(gòu)

      手游的開(kāi)發(fā)一般為兩個(gè)部分,即服務(wù)器和客戶(hù)端[11-12],其框架圖如圖3所示。

      (a) 客戶(hù)端框架圖

      (b) 服務(wù)端框架圖

      圖3 游戲功能模塊框架圖

      圖3(a)為客戶(hù)端的三大模塊:引擎入口模塊、界面模塊、邏輯模塊。引擎入口模塊主要包括 AppDelegate,主要用于游戲程序的邏輯初始化,并創(chuàng)建運(yùn)行程序的入口界面,即第一個(gè)游戲界面場(chǎng)景;界面模塊包括了場(chǎng)景模塊Scene和圖層模塊Layer;邏輯模塊包括了人工智能模塊AI、麻將規(guī)則模塊Rule和游戲整體控制模塊GameControl。

      圖3(b)為服務(wù)端的三大模塊:數(shù)據(jù)模塊,工具模塊和網(wǎng)絡(luò)服務(wù)模塊。數(shù)據(jù)模塊保羅了存儲(chǔ)用戶(hù)信息PlayDate;網(wǎng)絡(luò)服務(wù)模塊包括服務(wù)器端數(shù)據(jù)ServerData和控制服務(wù)器通信ServerAgentThread;工具模塊包括了輸入/輸出工具I/OUtil、傳輸信息轉(zhuǎn)換工具ConvertUtil控制服務(wù)器端邏輯工具RuleUtil。

      3 游戲主要代碼

      游戲的程序設(shè)計(jì)主要實(shí)現(xiàn)的功能類(lèi)有:游戲主場(chǎng)景、觸摸事件、用戶(hù)操作、游戲結(jié)束場(chǎng)景類(lèi)、游戲場(chǎng)景類(lèi)、撲克類(lèi)、游戲界面類(lèi)。該游戲中的幾段主要代碼如下。

      (1) 游戲場(chǎng)景類(lèi)

      //類(lèi)函數(shù)

      Scene* HelloWorld::createScene()

      {

      // 'scene' is an autorelease object

      auto scene = Scene::create();

      // 'layer' is an autorelease object

      auto layer = HelloWorld::reate();

      // add layer as a child to scene

      scene->addChild(layer);

      // return the scene

      return scene;

      }

      (2) 觸摸事件

      TouchListenr->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);

      TouchListenr->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);

      TouchListenr->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);

      void HelloWorld::onTouchMoved(Touch* touch, Event* event)

      {

      //獲取精靈對(duì)象

      auto sprite = static_cast(event->getCurrentTarget());

      //改變精靈的位置

      sprite->setPosition(sprite->getPosition() + touch->getDelta());

      }

      void HelloWorld::onTouchEnded(Touch* touch, Event* event)

      {

      //獲取精靈對(duì)象并取得精靈的矩陣

      auto sprite = static_cast(event->getCurrentTarget());

      //獲取觸摸點(diǎn)的坐標(biāo)

      Point pointEnd = touch->getLocation();

      Point pointOld = m_fSelectPos;

      unsigned int dLenX = abs(pointEnd.x - pointOld.x);

      unsigned int dLenY = abs(pointEnd.y - pointOld.y);

      if (dLenX < 200 && dLenY < 200)

      {

      sprite->setPosition(pointOld);

      }

      else//出牌

      {

      BYTE tagValue = sprite->getTag();

      BYTE cbCardData = sprite->getZOrder();

      BYTE wChair = tagValue / 14;

      BYTE bIndex = tagValue % 14;

      BYTE disCount = m_iDisCardCount[wChair];

      if (GetCanOutCard(wChair))//可以出牌

      {

      //刪除精靈

      if (m_VecCard[wChair].size() > bIndex)

      m_VecCard[wChair].erase(m_VecCard[wChair].begin() + bIndex);

      //丟棄

      m_VecDisCard[wChair].push_back(sprite);

      //設(shè)置丟棄位置

      sprite->setPosition(g_fDisCardPos[wChair][disCount]);

      sprite->setTag(0xFF); //設(shè)置不可觸摸

      m_iDisCardCount[wChair]++;

      //刪除索引

      BYTE delIndex = SwitchToCardIndex(cbCardData);

      if (m_cbCardIndex[wChair][delIndex] > 0)

      m_cbCardIndex[wChair][delIndex]--;

      //手牌重排

      ReSortCard(wChair);

      //出牌精靈

      m_pOutCardSprite = sprite;

      //玩家出牌

      OnUserOutCard(wChair, cbCardData);

      }

      else

      {

      sprite->setPosition(pointOld);

      }

      }

      cocos2d::log("touch [%d %d]", m_iSelect / 14, m_iSelect % 14);

      }

      (3) 用戶(hù)操作(碰、杠、胡操作)

      switch (cbTargetAction)//玩家的主動(dòng)操作

      {

      case WIK_PENG: //碰牌操作

      {

      //if (m_cbOutCardCount <= 4)

      //m_bGenZhuangFlag = false;

      //刪除

      BYTE cbRemoveCard[] = { cbTargetCard, cbTargetCard };

      RemoveCard(m_cbCardIndex[wTargetUser], cbRemoveCard, 2);

      //碰牌處理

      RemoveCardSprite(wTargetUser,cbRemoveCard, 2,m_wOutCardUser);

      //按鈕動(dòng)作清0

      SetAllBtnOff();

      //設(shè)置變量

      m_wCurrentUser = wTargetUser;//玩家操作結(jié)束后設(shè)置操作玩家為當(dāng)前玩家

      ZeroMemory(m_bCanSendCard, sizeof(m_bCanSendCard));

      m_bCanOutCard[wTargetUser] = true;

      break;

      }

      case WIK_GANG: //杠牌操作

      {

      //增加明杠動(dòng)作

      m_pITableFrame->AddPrivateAction(wChairID, PrivateAction_Ming_Gang);

      if (m_cbOutCardCount <= 4)

      m_bGenZhuangFlag = false;

      //刪除牌,被動(dòng)動(dòng)作只存在捉杠

      BYTE cbRemoveCard[] = { cbTargetCard, cbTargetCard, cbTargetCard };

      RemoveCard(m_cbCardIndex[wTargetUser], cbRemoveCard, CountArray(cbRemoveCard));

      //杠牌處理

      RemoveCardSprite(wTargetUser, cbRemoveCard, 3, m_wOutCardUser);

      //按鈕動(dòng)作清0

      SetAllBtnOff();

      //設(shè)置變量

      m_wCurrentUser = wTargetUser;//玩家操作結(jié)束后設(shè)置操作玩家為當(dāng)前玩家

      ZeroMemory(m_bCanSendCard, sizeof(m_bCanSendCard));

      m_bCanOutCard[wTargetUser] = true;

      break;

      }

      default:

      assert(FALSE);

      return false;

      }

      4 游戲測(cè)試

      游戲測(cè)試時(shí),首先在A(yíng)ndroid手機(jī)上下載游戲的apk文件并安裝,安裝完成后點(diǎn)擊手機(jī)上的游戲圖標(biāo)進(jìn)入游戲的開(kāi)始界面,如圖4所示。

      圖4 游戲開(kāi)始界面

      該界面包括了登錄、注冊(cè)功能:玩家啟動(dòng)游戲后進(jìn)入登錄選擇界面,在登錄選擇界面玩家可以選擇賬號(hào)登錄或者注冊(cè)成功后直接登錄游戲。如果玩家有游戲賬號(hào),直接輸入游戲賬號(hào)和密碼進(jìn)行登錄。如果玩家沒(méi)有游戲賬號(hào),則可以注冊(cè)一個(gè)新的賬號(hào)。如果玩家選擇注冊(cè)一個(gè)新的游戲賬號(hào)登錄,則會(huì)跳轉(zhuǎn)到注冊(cè)界面,填寫(xiě)游戲賬號(hào)、密碼、性別等相關(guān)的個(gè)人信息,注冊(cè)成功后即可進(jìn)入游戲大廳開(kāi)始游戲,游戲的場(chǎng)景界面如圖5所示。

      圖5 游戲場(chǎng)景界面

      然后,對(duì)麻將游戲的各個(gè)功能進(jìn)行了逐一測(cè)試,均達(dá)到了預(yù)期效果,且整個(gè)測(cè)試過(guò)程中游戲運(yùn)行穩(wěn)定,界面清晰,達(dá)到了實(shí)際應(yīng)用要求。

      5 總結(jié)

      本文基于Cocos2d-x游戲引擎開(kāi)發(fā)了一款麻將游戲,主要利用Cocos2d-x進(jìn)行圖形渲染、游戲框架構(gòu)建、應(yīng)用程序和圖形交互界面的設(shè)計(jì),采用C++語(yǔ)言進(jìn)行編程。本文首先對(duì)游戲開(kāi)發(fā)環(huán)境介紹了;接著在完成需求分析的基礎(chǔ)上搭建出游戲的功能框架結(jié)構(gòu),對(duì)其各個(gè)功能模塊進(jìn)行代碼編輯和調(diào)試;最后應(yīng)用黑盒測(cè)試方法對(duì)該游戲的功能模塊進(jìn)行了測(cè)試。測(cè)試結(jié)果表明,本次開(kāi)發(fā)的需求分析合理,游戲運(yùn)行流暢、功能齊全,并且Cocos2d-x的應(yīng)用極大地縮短了開(kāi)發(fā)周期,節(jié)約了開(kāi)發(fā)成本。

      猜你喜歡
      引擎精靈賬號(hào)
      彤彤的聊天賬號(hào)
      施詐計(jì)騙走游戲賬號(hào)
      派出所工作(2021年4期)2021-05-17 15:19:10
      冬精靈
      海底精靈國(guó)
      歡舞的精靈們
      藍(lán)谷: “涉藍(lán)”新引擎
      商周刊(2017年22期)2017-11-09 05:08:31
      Google Play游戲取消賬號(hào)綁定沒(méi)有Google賬號(hào)也能玩
      CHIP新電腦(2016年3期)2016-03-10 14:52:50
      無(wú)形的引擎
      河南電力(2015年5期)2015-06-08 06:01:46
      基于Cocos2d引擎的PuzzleGame開(kāi)發(fā)
      俏美精靈
      cookie world(2010年3期)2010-03-22 07:26:40
      雷山县| 邳州市| 马关县| 汽车| 盱眙县| 潜山县| 梁河县| 平远县| 锡林郭勒盟| 河池市| 抚远县| 苗栗市| 贵南县| 衡阳市| 兴化市| 正安县| 济南市| 浙江省| 墨脱县| 三门县| 通州区| 会泽县| 治县。| 浮梁县| 宁陕县| 芦山县| 城口县| 汪清县| 安徽省| 西安市| 北票市| 秭归县| 沁源县| 德化县| 县级市| 昆山市| 华亭县| 盖州市| 塔城市| 神农架林区| 台中县|