Cocos2d-x中使用CCScrollView來實現(xiàn)關(guān)卡選擇實例
類似關(guān)卡選擇的這種功能游戲中經(jīng)??吹剑热鐜椭鷪鼍?,選擇關(guān)卡,通過滑動的方式選擇一些其他的東西等等。今天我們實現(xiàn)關(guān)卡的選擇是使用CCScrollView這個類。當(dāng)然還有一些其他的方法,比如使用cocostudio的page view也可以。我先說下整體的思路,CCScrollView這個類是繼承自CCLayer的,本身的觸摸事件有些bug,所以網(wǎng)上一般將這個層的touch事件處理為false,而使用它的父節(jié)點來處理觸摸事件,我們也是采用這個做法。先定義一個LevelScene類,將CCScrollView加入進來,然后再定義一個layer層,這個層里邊放的就是一些關(guān)卡的圖片,然后將layer這個層作為CCScrollView的內(nèi)容添加進去。好了,現(xiàn)在看代碼吧。

/*關(guān)卡選擇類的頭文件*/
#ifndef _LEVEL_SCENE_H_
#define _LEVEL_SCENE_H_
#include "cocos2d.h"
//包含以下的頭文件
#include "cocos-ext.h"
using namespace cocos2d::extension;
using namespace cocos2d;
class LevelScene : public CCLayer
{
public:
bool init();
CREATE_FUNC(LevelScene);
//以下是注冊觸摸事件和實現(xiàn)各種的touch函數(shù)
void registerWithTouchDispatcher();
bool ccTouchBegan(CCTouch * touch,CCEvent * pEvent);
void ccTouchMoved(CCTouch * touch,CCEvent * pEvent);
void ccTouchEnded(CCTouch * touch,CCEvent * pEvent);
//最后這個函數(shù)來校驗每個關(guān)卡的位置,是各個關(guān)卡都位于屏幕的中央
void adjustScrollView(float offset);
private:
//將CCScrollView作為自己的層添加進來
CCScrollView * m_scrollView;
//觸摸點的位置
CCPoint m_touchPoint;
//CCScrollView的便宜量
CCPoint m_offsetPoint;
//當(dāng)前為第幾個關(guān)卡
int m_nCurPage;
};
#endif
/*關(guān)卡選擇類的具體實現(xiàn)*/
#include "LevelScene.h"
#include <math.h> //用到了fabs()函數(shù),用來求絕對值的
bool LevelScene::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(!CCLayer::init());
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
//CCScrollView繼承自CCLayer,傳入的參數(shù)是view size的大小
//view size也就是人看到的大小,content size也就是內(nèi)容的大小
//這里設(shè)置為整個屏幕的大小,也就是我們通過設(shè)備的整個屏幕去看里邊的內(nèi)容
CCScrollView * scrollView = CCScrollView::create(CCSize(winSize.width,winSize.height));
//等同于如下的語句
/*CCScrollView * scrollView = CCScrollView::create();
scrollView->setViewSize(CCSize(winSize.width,winSize.height));*/
//以下是CCScrollView的一些常用函數(shù),但是我們這里都不會用到,實現(xiàn)的思路不同
//設(shè)置是否有反彈的效果,反彈就是當(dāng)超出scrollview的大小的時候回到原來的位置
//scrollView->setBounceable(true);
//CCScrollView默認錨點是在(0,0)處
//scrollView->ignoreAnchorPointForPosition(false);
//scrollView->setPosition(ccp(winSize.width/2,winSize.height/2));
//設(shè)置滑動方向
//kCCScrollViewDirectionHorizontal——水平滑動
//kCCScrollViewDirectionVertical——垂直滑動
//scrollView->setDirection(kCCScrollViewDirectionBoth);
//創(chuàng)建一個CCLayer,將內(nèi)容添加到CCLayer中,然后將這個layer添加到scrollview中
CCLayer * layer = CCLayer::create();
for(int i = 0;i<5;i++)
{
CCString * string = CCString::createWithFormat("%d.jpg",i+1);
CCSprite * sprite = CCSprite::create(string->getCString());
//將所有的精靈都放到屏幕的中間顯示
sprite->setPosition(ccpAdd(ccp(winSize.width/2,winSize.height/2),
ccp(winSize.width*i,0)));
layer->addChild(sprite);
}
//設(shè)置scrollView中的內(nèi)容,必須先設(shè)置內(nèi)容再設(shè)置內(nèi)容的大小
scrollView->setContainer(layer);
//setContentSize()設(shè)置內(nèi)容區(qū)的大小
scrollView->setContentSize(CCSize(winSize.width*5,winSize.height));
//我們屏蔽scrollView這個層的觸摸,采用其他的實現(xiàn)方法
scrollView->setTouchEnabled(false);
//設(shè)置里邊內(nèi)容的偏移量
scrollView->setContentOffset(CCPoint(0,0));
//讓本層來接受觸摸事件
this->setTouchEnabled(true);
this->addChild(scrollView);
m_scrollView = scrollView;
this->m_nCurPage = 0;
bRet = true;
}
while(0);
return bRet;
}
void LevelScene::registerWithTouchDispatcher()
{
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
}
bool LevelScene::ccTouchBegan(CCTouch * touch,CCEvent * pEvent)
{
//用開始的觸摸點和scroll的偏移量初始化以下的成員變量
this->m_touchPoint = touch->getLocation();
this->m_offsetPoint = this->m_scrollView->getContentOffset();
//以下的這一點特別要注意,大家可以先注釋掉以下的這句話然后運行程序,會發(fā)現(xiàn)如果觸摸不是很快
//的時候不會有什么問題,但是如果觸摸進行的很快,關(guān)卡的位置偏移的就不會正確,以下的代碼正是解決這個問題到
if((int)this->m_offsetPoint.x%((int)CCDirector::sharedDirector()->getWinSize().width) == 0)
{
return true;
}
return false;
}
/*以下代碼的整體含義就是當(dāng)手指移動的時候,讓關(guān)卡跟隨手指移動,當(dāng)移動結(jié)束的時候,判斷結(jié)束點和開始
觸摸點的位置,對關(guān)卡的位置做相應(yīng)的處理*/
//設(shè)置關(guān)卡跟隨手指的方向移動
void LevelScene::ccTouchMoved(CCTouch * touch,CCEvent * pEvent)
{
CCPoint point = touch->getLocation();
CCPoint direction = ccpSub(point,this->m_touchPoint);
//CCPoint spriteDirection = ccpAdd(this->m_offsetPoint,direction);
//只在x方向偏移
CCPoint spriteDirection = CCPoint(direction.x+this->m_offsetPoint.x,0);
this->m_scrollView->setContentOffset(spriteDirection);
}
//以下的代碼是重點,當(dāng)結(jié)束觸摸的時候,為了使關(guān)卡顯示在屏幕的中間,我們需要這么做
void LevelScene::ccTouchEnded(CCTouch * touch,CCEvent * pEvent)
{
CCPoint endPoint = touch->getLocation();
float distance = endPoint.x-this->m_touchPoint.x;
//手指移動的距離小于20的時候,就將偏移量作為0處理
if(fabs(distance) < 20)
{
this->adjustScrollView(0);
}
else
{
//將偏移量作為參數(shù)傳進來
this->adjustScrollView(distance);
}
}
//調(diào)整關(guān)卡的最終位置
void LevelScene::adjustScrollView(float offset)
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
// 我們根據(jù) offset 的實際情況來判斷移動效果
//如果手指往左劃,offset大于0,說明頁面在減小,往右增大
if (offset < 0)
m_nCurPage ++;
else if (offset > 0)
m_nCurPage --;
//不允許超出最左邊的一頁和最右邊的一頁
if (m_nCurPage < 0)
m_nCurPage = 0;
else if (m_nCurPage > 4)
m_nCurPage = 4;
CCPoint adjustPoint = ccp(-winSize.width * m_nCurPage , 0);
//這個函數(shù)比setContentOffset多了一個參數(shù),第二個參數(shù)是設(shè)置時間的,就是用多長的時間來改變偏移量
this->m_scrollView->setContentOffsetInDuration(adjustPoint, 0.3f);
}
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
//添加背景圖片
CCSprite * sprite = CCSprite::create("background.png");
sprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
this->addChild(sprite);
//添加CCScrollView層
LevelScene * scrollView = LevelScene::create();
this->addChild(scrollView);
return true;
}
- 剖析iOS開發(fā)中Cocos2d-x的內(nèi)存管理相關(guān)操作
- iOS開發(fā)中使用cocos2d添加觸摸事件的方法
- cocos2dx骨骼動畫Armature源碼剖析(三)
- cocos2dx骨骼動畫Armature源碼剖析(二)
- cocos2dx骨骼動畫Armature源碼剖析(一)
- Cocos2d-x 3.x入門教程(二):Node節(jié)點類
- Cocos2d-x 3.x入門教程(一):基礎(chǔ)概念
- Cocos2d-x中調(diào)用Lua及HelloWorld.lua源碼分解
- Cocos2d-x中CCEditBox文本輸入框的使用實例
- Cocos2d-x中實現(xiàn)彈出對話框示例
- Cocos2d-x觸摸事件實例
- Cocos2d-x人物動作類實例
- 詳解iOS游戲開發(fā)中Cocos2D的坐標(biāo)位置關(guān)系
相關(guān)文章
C++解密Chrome80版本數(shù)據(jù)庫的方法示例代碼
這篇文章主要介紹了C++解密Chrome80版本數(shù)據(jù)庫的方法示例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
C語言經(jīng)典算法例題求100-999之間的“水仙花數(shù)”
本文的主要內(nèi)容,設(shè)計一個程序,找出100-999之間的“水仙花數(shù)”,需要的朋友可以參考下2015-07-07

