代碼如下:
#ifndef GALLERY_LAYER_H
#define GALLERY_LAYER_H
#include "cocos2d.h"
#include "SimpleAudioEngine.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
class GalleryLayer : public cocos2d::CCLayer ,public CCScrollViewDelegate
{
public:
static CCScene* scene();
virtual bool init();
void menuCloseCallback(CCObject* pSender);
void menuLeftCallback(CCObject* pSender);
void menuRightCallback(CCObject* pSender);
CREATE_FUNC(GalleryLayer);
public:
//scrollview滾動的時候會調用
void scrollViewDidScroll(CCScrollView* view);
//scrollview縮放的時候會調用
void scrollViewDidZoom(CCScrollView* view);
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
private:
//根據手勢滑動的距離和方向滾動圖層
void adjustScrollView(float offset);
CCScrollView *m_pScrollView;
CCPoint m_touchPoint;
int m_nCurPage;
};
#endif
#include "GalleryLayer.h"
#define PICNUM 5
CCScene* GalleryLayer::scene(){
CCScene* scene = CCScene::create();
CCLayer* layer = GalleryLayer::create();
scene->addChild(layer);
return scene;
}
bool GalleryLayer::init()
{
bool bRet = false;
do
{
CC_BREAK_IF( !CCLayer::init() );
m_nCurPage = 1;
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
CCMenuItemImage *pCloseItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png",
this,menu_selector(GalleryLayer::menuCloseCallback));
pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
origin.y + pCloseItem->getContentSize().height/2));
CCMenuItemImage *leftItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png",
this,menu_selector(GalleryLayer::menuLeftCallback));
leftItem->setPosition(ccp(leftItem->getContentSize().width , winSize.height/2));
CCMenuItemImage *rightItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png",
this,menu_selector(GalleryLayer::menuRightCallback));
rightItem->setPosition(ccp(winSize.width-rightItem->getContentSize().width , winSize.height/2));
// create menu, it's an autorelease object
CCMenu* pMenu = CCMenu::create(pCloseItem, leftItem, rightItem, NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu, 1);
CCLayer *pLayer = CCLayer::create();
char helpstr[30] = {0};
for (int i = 1; i <= PICNUM; ++ i)
{
memset(helpstr, 0, sizeof(helpstr));
sprintf(helpstr,"%d.png",i);
CCSprite *pSprite = CCSprite::create(helpstr);
pSprite->setPosition(ccp(visibleSize.width * (i-0.5f), visibleSize.height / 2));
pLayer->addChild(pSprite);
}
m_pScrollView = CCScrollView::create(CCSizeMake(960, 640), pLayer);
m_pScrollView->setContentOffset(CCPointZero);
m_pScrollView->setTouchEnabled(false);
m_pScrollView->setDelegate(this);
m_pScrollView->setDirection(kCCScrollViewDirectionHorizontal);
pLayer->setContentSize(CCSizeMake(960*3, 640));
this->addChild(m_pScrollView);
CCSpriteFrameCache *pCache = CCSpriteFrameCache::sharedSpriteFrameCache();
pCache->addSpriteFrame(CCSpriteFrame::create("button_normal.png",CCRectMake(0, 0, 64, 64)),"button_normal.png");
pCache->addSpriteFrame(CCSpriteFrame::create("button_selected.png",CCRectMake(0, 0, 64, 64)),"button_selected.png");
for (int i = 1; i <= PICNUM; ++ i)
{
CCSprite *pPoint = CCSprite::createWithSpriteFrameName("button_normal.png");
pPoint->setTag(i);
pPoint->setPosition(ccp( origin.x + (visibleSize.width - 3 * pPoint->getContentSize().width)/2 + pPoint->getContentSize().width * (i-1), origin.y + 30));
this->addChild(pPoint);
}
CCSprite *pPoint = (CCSprite *)this->getChildByTag(1);
pPoint->setDisplayFrame(pCache->spriteFrameByName("button_selected.png"));
bRet = true;
}while(0);
return bRet;
}
void GalleryLayer::menuLeftCallback(CCObject* pSender){
adjustScrollView(90);
}
void GalleryLayer::menuRightCallback(CCObject* pSender){
adjustScrollView(-90);
}
void GalleryLayer::menuCloseCallback(CCObject* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
#else
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
#endif
}
void GalleryLayer::scrollViewDidScroll(cocos2d::extension::CCScrollView *view)
{
CCLOG("scroll");
}
void GalleryLayer::scrollViewDidZoom(cocos2d::extension::CCScrollView *view)
{
CCLOG("zoom");
}
void GalleryLayer::onEnter()
{
CCLayer::onEnter();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, false);
}
void GalleryLayer::onExit()
{
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCLayer::onExit();
CCSpriteFrameCache::sharedSpriteFrameCache()->removeUnusedSpriteFrames();
}
bool GalleryLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
m_touchPoint = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());
return true;
}
void GalleryLayer::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
}
void GalleryLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint endPoint = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());
float distance = endPoint.x - m_touchPoint.x;
if(fabs(distance) > 50)
{
adjustScrollView(distance);
}
}
void GalleryLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
CCPoint endPoint = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());
float distance = endPoint.x - m_touchPoint.x;
if(fabs(distance) > 100)
{
adjustScrollView(distance);
}
}
void GalleryLayer::adjustScrollView(float offset)
{
CCLOG("=offset=%.3f",offset);
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
CCSpriteFrameCache *pCache = CCSpriteFrameCache::sharedSpriteFrameCache();
CCSprite *pPoint = (CCSprite *)this->getChildByTag(m_nCurPage);
pPoint->setDisplayFrame(pCache->spriteFrameByName("button_normal.png"));
if (offset<0)
{
m_nCurPage ++;
}else
{
m_nCurPage --;
}
if (m_nCurPage < 1)
{
m_nCurPage = 1;
}
if(m_nCurPage > 5)
{
m_nCurPage = 5;
}
CCLOG("=m_nCurPage=%d",m_nCurPage);
pPoint = (CCSprite *)this->getChildByTag(m_nCurPage);
pPoint->setDisplayFrame(pCache->spriteFrameByName("button_selected.png"));
CCPoint adjustPos = ccp(origin.x - visibleSize.width * (m_nCurPage-1), 0);
m_pScrollView->setContentOffset(adjustPos, true);
}