程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 應用C++停止Cocos2d-x游戲開辟入門進程中的要點解析

應用C++停止Cocos2d-x游戲開辟入門進程中的要點解析

編輯:關於C++

應用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,游戲開端!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved