應用C++停止Cocos2d-x游戲開辟入門進程中的要點解析。本站提示廣大學習愛好者:(應用C++停止Cocos2d-x游戲開辟入門進程中的要點解析)文章只能為提供參考,不一定能成為您想要的結果。以下是應用C++停止Cocos2d-x游戲開辟入門進程中的要點解析正文
總結了下,老手引誘的要點有以下幾個:
上面我們就具體講述這幾個要點:
一.畫面的變更.
對個這個分歧的游戲的做法不盡雷同,歸結起來年夜概有這麼幾種:
1.畫面全體變暗
這個比擬簡略,cocos2d就有現成接口:
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); //第一個參數是色彩ccc4(r,g,b,a) a取值(0~255),越年夜越不通明 上面兩個參數為寬高,不傳默許為屏幕年夜小 CCLayerColor* pLayer=CCLayerColor::create(ccc4(0,0,0,200),visibleSize.width,visibleSize.height); //CCLayerColor* pLayer=CCLayerColor::create(ccc4(0,0,0,200)); addChild(pLayer,100);
後果以下:
然後你可以在這層之上添加精靈,最初的後果能夠是這個模樣的:
注:圖片源自收集,假如有版權成績~你丫去逝世吧! 請接洽我!
2.部分高亮
比擬簡略的辦法是預備幾張張部分高亮的圖片,跟著引誘進度變更而切換!長處是可以做的比擬精巧,缺陷是資本量會比擬年夜!另外一種辦法是在畫面全體變暗的基本上摳失落部門區域,還好cocos2d供給了CCClippingNode接口(2.1+版)!
CCClippingNode類比擬龐雜,但我們只用明確兩個器械就好:一個是CCClippingNode的Stencil,一個CCClippingNode的Child,怎樣懂得呢?請看下圖:
這個器械信任年夜家都有印象吧,下面的圖案(镂空部門)就是 CCClippingNode的Stencil(模板),實體部門就是CCClippingNode的child(底板),是否是很好明確,讓我們用代碼來完成吧:
//創立cliper對象 CCClippingNode* pClip=CCClippingNode::create(); addChild(pClip); //參加灰色的底板 CCLayerColor* pColor=CCLayerColor::create(ccc4(0,0,0,200)); pClip->addChild(pColor);
讓我來參加模板:
//創立drawnode對象 CCDrawNode *m_pAA=CCDrawNode::create(); static ccColor4F green = {0, 1, 0, 1}; static CCPoint rect[4]={ccp(-50,50),ccp(50,50),ccp(50,-50),ccp(-50,-50)}; //用下面的數據保留一個100x100的矩形 m_pAA->drawPolygon(rect, 4, green, 0, green); //設置到屏幕的中間 m_pAA->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); //設置為pclip的模板 pClip->setStencil(m_pAA);
CCDrawNode是用來繪制幾何圖形的,drawPolygon應用繪制多邊形,參數為極點數組,極點數目,邊框寬度,和填充色彩!這裡要留意一點:萬萬不要addChild(m_pAA);由於一旦addchild,m_pAA就會被繪制出來,我們是要用它做剪裁!他會在CCClippingNode外部被應用!
我們會看到如許的後果:
額,貌似和我們想一想的不太一樣啊,為何呢?那是由於CCClippingNode有一個選項是能否反向,既顯示Stencil呢照樣child減去Stencil的部門!默許為顯示顯示镂空(Stencil)部門(false),是以我們要轉變選項:
//能否反向? pClip->setInverted(true);
後果以下,是否是很棒:
3.組合後果(將2的矩形改成圓,再加上圖片)
讓我們先看這張圖片,是否是很棒?右下角黃色矩形區域是高亮的,在配上圖片解釋,很不錯的後果!
讓我們來完成相似的後果吧,用到的資本:
//創立cliper CCClippingNode* pClip=CCClippingNode::create(); pClip->setInverted(true); addChild(pClip); //添加底板 CCLayerColor* pColor=CCLayerColor::create(ccc4(0,0,0,200)); pClip->addChild(pColor); //繪制圓形區域 static ccColor4F green = {0, 1, 0, 1};//極點色彩,這裡我們沒有本質上沒有繪制,所以看不出色彩 float fRadius=55.0f;//圓的半徑 const int nCount=100;//圓形其實可以看作正多邊形,我們這裡用正100邊型來模仿園 const float coef = 2.0f * (float)M_PI/nCount;//盤算每兩個相鄰極點與中間的夾角 static CCPoint circle[nCount];//極點數組 for(unsigned int i = 0;i <nCount; i++) { float rads = i*coef;//弧度 circle[i].x = fRadius * cosf(rads);//對應極點的x circle[i].y = fRadius * sinf(rads);//對應極點的y } CCDrawNode *pStencil=CCDrawNode::create(); pStencil->drawPolygon(circle, nCount, green, 0, green);//繪制這個多邊形! //動起來 pStencil->runAction(CCRepeatForever::create(CCSequence::createWithTwoActions(CCScaleBy::create(0.05f, 0.95f), CCScaleTo::create(0.125f, 1)))); pStencil->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); //設這模板 pClip->setStencil(pStencil); //添加圓和手的圖片 CCSprite*pCircle=CCSprite::create("circle.png"); pCircle->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); pCircle->runAction(CCRepeatForever::create(CCSequence::createWithTwoActions(CCScaleBy::create(0.05f, 0.95f), CCScaleTo::create(0.125f, 1)))); addChild(pCircle); CCSprite* pHand=CCSprite::create("hand.png"); pHand->setAnchorPoint(ccp(0.0f,1.0f)); pHand->setPosition(ccp(pCircle->getContentSize().width/2,pCircle->getContentSize().height/2)); pCircle->addChild(pHand);
下面是全體的代碼,後果圖以下(靜態的會更好)沒有加圓圈和手之前和以後:
那末若何轉變高亮區域得地位呢?很簡略,只用轉變pStencil的地位便可!可以斟酌記為成員變量在ccTouchesBegan中轉變地位,如許就會高亮區域就會隨著你的鼠標走啦!
二.觸摸和按鈕呼應
1.開啟觸摸 阻攔穿透呼應 斷定落點
讓我們持續看上面的這張圖片:
這張圖片中應當只要右下角的”冒險”按鈕可以或許呼應的到,在這裡說下思緒:
為了讓其他區域的按鈕呼應不到,我們應當進步下層(CClayer)的呼應優先級為-128和按鈕一樣,如許的話假如下層(CClayer)後參加游戲addchild的話,會先收到觸摸新聞.
在收到觸摸新聞ccTouchBegan時,斷定點擊的處所能否在黃色矩形區域中,在的話return false 交給基層的按鈕去呼應,不然return true 阻攔新聞持續傳遞.
上面是代碼片斷:
1).開啟觸摸
bool CTeachLayer::init() { if (!CCLayer::init()) { return false; } setTouchEnabled(true); return true; }
2).晉升觸摸呼應優先級為-128
void CTeachLayer::registerWithTouchDispatcher() { //應用-128和CCMenu優先級雷同,而且吞失落事宜true// CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -128, true); CCLayer::registerWithTouchDispatcher(); }
3).在ccTouchBegan斷定觸點
bool CTeachLayer::ccTouchBegan( CCTouch* pTouch, CCEvent* pEvent ) { //獲得觸摸地位 CCPoint touchPoint = pTouch->getLocation(); //聲明一個右下角100x50的矩形 CCRect m_obRect=CCRectMake( CCDirector::sharedDirector()->getVisibleSize().width-100, CCDirector::sharedDirector()->getVisibleSize().height-50, 100, 50); //斷定點能否在矩形中 if (m_obRect.containsPoint(touchPoint)) { return false; } return true; }
年夜功樂成,快去試一下吧!
2.准確射中
手機上和電腦上的觸摸事宜的差別在於:電腦上我們是用鼠標點擊,而手機上應用手指去摁,觸摸的精度的高下不問可知!讓我們來看上面這張圖片:
讓我們看右上角的X號按鈕,在手機上點擊它來講應當是很艱苦的!他的真實尺寸應當是白色矩形的區域(假定:50x50),為了讓玩家在引誘時,可以或許很便利的點擊到它,我們將現實的可觸摸區域設置為藍色區域(假定:100x100),如許應當很好點到了吧!
如許會有一個新的成績,假如點擊到白色和藍色之間的區域,上面的x按鈕時呼應不到的,那末怎樣辦呢?我們須要修正touch的數據(設置為按鈕的正中間),然後touch事宜將會以新的數據向下傳遞!如許上面的按鈕就可以呼應到了!
讓我們看看代碼吧:
bool CTeachLayer::ccTouchBegan( CCTouch* pTouch, CCEvent* pEvent ) { CCPoint touchPoint = pTouch->getLocation(); if (!CGlobal::s_bTeach) { return false; } //假定按鈕在(300,200)的地位,那末藍色矩形以下: CCRect m_obRect=CCRectMake( 250, 150, 100, 100); if (m_obRect.containsPoint(touchPoint)) { //獲得藍色矩形的中間點(300,200) CCPoint pos=ccp(m_obRect.getMidX(),m_obRect.getMidY()); //這裡要轉化為UI坐標系(左上角為0,0點) pos=CCDirector::sharedDirector()->convertToUI(pos); //設置觸摸信息 pTouch->setTouchInfo(pTouch->getID(),pos.x,pos.y); return false; } return true; }
三.邏輯處置及代碼組織
這裡我年夜概說下老手引誘的架構,代碼確定貼不出來,太多太亂,說的纰謬的處所,迎接年夜家拍磚吐槽!>_<
1.起首創立了一個CTeachLayer繼續自CCLayer,添加到游戲的最下層(UI層之上),記住,要先添加游戲的其層,最初添加CTeachLayer,可以保留全局指針!
2.用一個列舉記下你要引誘的一切步調,在依據列舉值去設置高亮的地位及觸摸區域!可以記下以後引誘的進度,以便利下次持續引誘!
3.游戲邏輯中免不了要斷定引誘(例:出第3波怪的時刻引誘玩家應用清屏道具),用全局的指針去設置引誘的步調!
4.引誘完成後移除CTeachLayer,游戲開端!