程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Cocos2d-x中應用CCScrollView來完成關卡選擇實例

Cocos2d-x中應用CCScrollView來完成關卡選擇實例

編輯:關於C++

Cocos2d-x中應用CCScrollView來完成關卡選擇實例。本站提示廣大學習愛好者:(Cocos2d-x中應用CCScrollView來完成關卡選擇實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Cocos2d-x中應用CCScrollView來完成關卡選擇實例正文


相似關卡選擇的這類功效游戲中常常看到,好比贊助場景,選擇關卡,經由過程滑動的方法選擇一些其他的器械等等。明天我們完成關卡的選擇是應用CCScrollView這個類。固然還有一些其他的辦法,好比應用cocostudio的page view也能夠。我先說下全體的思緒,CCScrollView這個類是繼續自CCLayer的,自己的觸摸事宜有些bug,所以網上普通將這個層的touch事宜處置為false,而應用它的父節點來處置觸摸事宜,我們也是采取這個做法。先界說一個LevelScene類,將CCScrollView參加出去,然後再界說一個layer層,這個層裡邊放的就是一些關卡的圖片,然後將layer這個層作為CCScrollView的內容添加出來。好了,如今看代碼吧。

/*關卡選擇類的頭文件*/
#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);
	//以下是注冊觸摸事宜和完成各類的touch函數
	void registerWithTouchDispatcher();
	bool ccTouchBegan(CCTouch * touch,CCEvent * pEvent);
	void ccTouchMoved(CCTouch * touch,CCEvent * pEvent);
	void ccTouchEnded(CCTouch * touch,CCEvent * pEvent);
	//最初這個函數來校驗每一個關卡的地位,是各個關卡都位於屏幕的中心
	void adjustScrollView(float offset);
private:
	//將CCScrollView作為本身的層添加出去
	CCScrollView * m_scrollView;
	//觸摸點的地位
	CCPoint m_touchPoint;
	//CCScrollView的廉價量
	CCPoint m_offsetPoint;
	//以後為第幾個關卡
	int m_nCurPage;
};
#endif
/*關卡選擇類的詳細完成*/
#include "LevelScene.h"
#include <math.h>	//用到了fabs()函數,用來求相對值的

bool LevelScene::init()
{
	bool bRet = false;
	do
	{
		CC_BREAK_IF(!CCLayer::init());

		CCSize winSize = CCDirector::sharedDirector()->getWinSize();

		//CCScrollView繼續自CCLayer,傳入的參數是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的一些經常使用函數,然則我們這裡都不會用到,完成的思緒分歧
		//設置能否有反彈的後果,反彈就是當超越scrollview的年夜小的時刻回到本來的地位
		//scrollView->setBounceable(true);
		//CCScrollView默許錨點是在(0,0)處
		//scrollView->ignoreAnchorPointForPosition(false);
		//scrollView->setPosition(ccp(winSize.width/2,winSize.height/2));
		//設置滑動偏向
		//kCCScrollViewDirectionHorizontal——程度滑動
		//kCCScrollViewDirectionVertical——垂直滑動
		//scrollView->setDirection(kCCScrollViewDirectionBoth);

		//創立一個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()設置內容區的年夜小
		scrollView->setContentSize(CCSize(winSize.width*5,winSize.height));

		//我們屏障scrollView這個層的觸摸,采取其他的完成辦法
		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();

	//以下的這一點特殊要留意,年夜家可以先正文失落以下的這句話然後運轉法式,會發明假如觸摸不是很快
	//的時刻不會有甚麼成績,然則假如觸摸停止的很快,關卡的地位偏移的就不會准確,以下的代碼恰是處理這個成績到
	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
	{
		//將偏移量作為參數傳出去
		this->adjustScrollView(distance);
	}
}

//調劑關卡的終究地位
void LevelScene::adjustScrollView(float offset)
{
	 CCSize winSize = CCDirector::sharedDirector()->getWinSize();
  // 我們依據 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);
	//這個函數比setContentOffset多了一個參數,第二個參數是設置時光的,就是用多長的時光來轉變偏移量
  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;
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved