亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Cocos2d-x中使用CCScrollView來實現(xiàn)關卡選擇實例

 更新時間:2014年09月12日 10:32:21   投稿:junjie  
這篇文章主要介紹了Cocos2d-x中使用CCScrollView來實現(xiàn)關卡的選擇實例,本文在代碼中用大量注釋講解了CCScrollView的使用,需要的朋友可以參考下

類似關卡選擇的這種功能游戲中經??吹?,比如幫助場景,選擇關卡,通過滑動的方式選擇一些其他的東西等等。今天我們實現(xiàn)關卡的選擇是使用CCScrollView這個類。當然還有一些其他的方法,比如使用cocostudio的page view也可以。我先說下整體的思路,CCScrollView這個類是繼承自CCLayer的,本身的觸摸事件有些bug,所以網上一般將這個層的touch事件處理為false,而使用它的父節(jié)點來處理觸摸事件,我們也是采用這個做法。先定義一個LevelScene類,將CCScrollView加入進來,然后再定義一個layer層,這個層里邊放的就是一些關卡的圖片,然后將layer這個層作為CCScrollView的內容添加進去。好了,現(xià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ù)來校驗每個關卡的位置,是各個關卡都位于屏幕的中央
	void adjustScrollView(float offset);
private:
	//將CCScrollView作為自己的層添加進來
	CCScrollView * m_scrollView;
	//觸摸點的位置
	CCPoint m_touchPoint;
	//CCScrollView的便宜量
	CCPoint m_offsetPoint;
	//當前為第幾個關卡
	int m_nCurPage;
};
#endif
/*關卡選擇類的具體實現(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也就是內容的大小
		//這里設置為整個屏幕的大小,也就是我們通過設備的整個屏幕去看里邊的內容
		CCScrollView * scrollView = CCScrollView::create(CCSize(winSize.width,winSize.height));
		//等同于如下的語句
		/*CCScrollView * scrollView = CCScrollView::create();
		scrollView->setViewSize(CCSize(winSize.width,winSize.height));*/

		//以下是CCScrollView的一些常用函數(shù),但是我們這里都不會用到,實現(xiàn)的思路不同
		//設置是否有反彈的效果,反彈就是當超出scrollview的大小的時候回到原來的位置
		//scrollView->setBounceable(true);
		//CCScrollView默認錨點是在(0,0)處
		//scrollView->ignoreAnchorPointForPosition(false);
		//scrollView->setPosition(ccp(winSize.width/2,winSize.height/2));
		//設置滑動方向
		//kCCScrollViewDirectionHorizontal——水平滑動
		//kCCScrollViewDirectionVertical——垂直滑動
		//scrollView->setDirection(kCCScrollViewDirectionBoth);

		//創(chuàng)建一個CCLayer,將內容添加到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);
		}
		//設置scrollView中的內容,必須先設置內容再設置內容的大小
		scrollView->setContainer(layer);
		//setContentSize()設置內容區(qū)的大小
		scrollView->setContentSize(CCSize(winSize.width*5,winSize.height));

		//我們屏蔽scrollView這個層的觸摸,采用其他的實現(xiàn)方法
		scrollView->setTouchEnabled(false);
		//設置里邊內容的偏移量
		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)如果觸摸不是很快
	//的時候不會有什么問題,但是如果觸摸進行的很快,關卡的位置偏移的就不會正確,以下的代碼正是解決這個問題到
	if((int)this->m_offsetPoint.x%((int)CCDirector::sharedDirector()->getWinSize().width) == 0)
	{
		return true;
	}
	return false;
}

/*以下代碼的整體含義就是當手指移動的時候,讓關卡跟隨手指移動,當移動結束的時候,判斷結束點和開始
觸摸點的位置,對關卡的位置做相應的處理*/

//設置關卡跟隨手指的方向移動
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);
}

//以下的代碼是重點,當結束觸摸的時候,為了使關卡顯示在屏幕的中間,我們需要這么做
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);
	}
}

//調整關卡的最終位置
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ù)是設置時間的,就是用多長的時間來改變偏移量
  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;
}

相關文章

  • C++構造析構賦值運算函數(shù)應用詳解

    C++構造析構賦值運算函數(shù)應用詳解

    構造函數(shù)主要作用在于創(chuàng)建對象時為對象的成員屬性賦值,構造函數(shù)由編譯器自動調用,無須手動調用;析構函數(shù)主要作用在于對象銷毀前系統(tǒng)自動調用,執(zhí)行一 些清理工作
    2022-09-09
  • C++中運算符 &和&&、|和|| 的詳解及區(qū)別

    C++中運算符 &和&&、|和|| 的詳解及區(qū)別

    這篇文章主要介紹了C++中運算符 &和&&、|和|| 的詳解及區(qū)別的相關資料,這里舉例說明該如何區(qū)別他們的不同,需要的朋友可以參考下
    2016-11-11
  • 使用C++調用Python代碼的方法步驟

    使用C++調用Python代碼的方法步驟

    這篇文章主要介紹了使用C++調用Python代碼的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • VS2019項目打包生成.exe文件與Setup的步驟實現(xiàn)

    VS2019項目打包生成.exe文件與Setup的步驟實現(xiàn)

    這篇文章主要介紹了VS2019項目打包生成.exe文件與Setup的步驟實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解

    C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解

    本文主要敘述了gcc如何生成靜態(tài)庫(.a)和動態(tài)庫(.so),幫助我們更好的進行嵌入式編程。因為有些時候,涉及安全,所以可能會提供靜態(tài)庫或動態(tài)庫供我們使用
    2021-10-10
  • C語言模擬實現(xiàn)簡單掃雷游戲

    C語言模擬實現(xiàn)簡單掃雷游戲

    這篇文章主要為大家詳細介紹了C語言模擬實現(xiàn)簡單掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • VS中PCL庫附加依賴項配置過程解析

    VS中PCL庫附加依賴項配置過程解析

    這篇文章主要介紹了VS中PCL庫附加依賴項配置,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C++實現(xiàn)貪吃蛇游戲

    C++實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 在C語言中輸入中文字符串講解

    在C語言中輸入中文字符串講解

    這篇文章主要介紹了在C語言中輸入中文字符串講解,本文通過概念和案例相結合講述了如何在C語言中使用中文,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++實現(xiàn)四則運算器(無括號)

    C++實現(xiàn)四則運算器(無括號)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)四則運算器,無括號的計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論