Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView

于MenuScene.cpp
点击单机游戏后会调用

Director::getInstance()->pushScene(MapChooseScene::createScene());

进入到关卡选择界面,我们採用ScrollView控件制作这个界面

因为scrollview拖动后,位置比較任意,我想是拖动到第二张图片,就完整的显示第二张图片,不要产生偏离位置的现象。所以在移动之后须要进行位置的校正,写了一个adjustScrollView()方法,用来进行该调整。

详细代码例如以下:

MapChooseScene.h内容:

const int  MAP_COUNT = 3;//定义了三张关卡图片
const int TOUCH_DISTANCE = 50; //手势滑动距离

class MapChooseScene : public Layer,public ScrollViewDelegate  //使用scrollview须要继承此类
{
…………….
private:
	Size visibleSize;

	Layer* _spritesContainer; //用于存放3张关卡图片的sprite 容器

             int currentPage; //当前所在的是第几张关卡地图
             Point beginTouchPoint; //触摸按下时的位置
             ScrollView *scrollView; //scrollview对象

	    void singleTouchDown(Object* pSender,Control::EventType event);
	    void addBackgroundSprite(); //加入背景方法

	     void addScrollView(); //加入scrollview对象及其包括的sprite
            //继承 ScrollViewDelegate  类须要实现的3个方法
              void scrollViewDidScroll(ScrollView* view);
              void scrollViewDidZoom(ScrollView* view);
              void scrollViewMoveOver(ScrollView* view);

	void adjustScrollView(float distance);//自己定义方法。用来进行拖动后位置调整
	void onTouchEnded(Touch*touch,Event *unused_event);
	bool onTouchBegan(Touch * touch,Event *unused_event);
        void onTouchMoved(Touch *touch,Event *unused_event);

};

MapChooseScene.cpp文件内容:

bool MapChooseScene::init()
{
	if ( !Layer::init() )
	{
		return false;
	}
	visibleSize = Director::getInstance()->getVisibleSize();

               currentPage = 1;//默认当前是第一张关卡图片
	addBackgroundSprite(); //加入背景

	addScrollView();//加入scrollview 

               //加入触摸监听
	setTouchMode(Touch::DispatchMode::ONE_BY_ONE);

	auto listener = EventListenerTouchOneByOne::create();
	listener->setSwallowTouches(true);
	listener->onTouchBegan=CC_CALLBACK_2(MapChooseScene::onTouchBegan,this);

	listener->onTouchMoved=CC_CALLBACK_2(MapChooseScene::onTouchMoved,this);
	listener->onTouchEnded=CC_CALLBACK_2(MapChooseScene::onTouchEnded,this);

	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,this);
	return true;
}

主要来看addScrollView()方法,他的主要功能就是创建3个关卡图片sprite。并加入到Layer类容器spritesContainer对象中。水平排列显示

void MapChooseScene::addScrollView()
{

	_spritesContainer = Layer::create();

//创建地图sprite,加入到spritesContainer中
	Sprite* beachSprite = Sprite::create(BEACH_ITEM);
	Sprite* seaSprite = Sprite::create(SEA_ITEM);
	Sprite* moonSprite = Sprite::create(MOON_ITEM);

	_spritesContainer->addChild(beachSprite);
	beachSprite->setPosition(ccpAdd(center, ccp(0, 0)));

	_spritesContainer->addChild(seaSprite);
	seaSprite->setPosition(ccpAdd(center, ccp(visibleSize.width, 0)));

	_spritesContainer->addChild(moonSprite);
	moonSprite->setPosition(ccpAdd(center, ccp(2*visibleSize.width, 0)));

	_spritesContainer->setPosition(CCPointZero);
	_spritesContainer->setContentSize(CCSize(visibleSize.width * MAP_COUNT, visibleSize.height));//容器大小

//进行scrollView对象的创建 并进行相关设置
	scrollView = ScrollView::create();

	scrollView->setContainer(_spritesContainer);
	scrollView->setDirection(ScrollView::Direction::HORIZONTAL);//水平显示
	scrollView->setTouchEnabled(true);
	scrollView->setPosition(CCPointZero);

	scrollView->setViewSize(CCSizeMake(visibleSize);//每一个关卡图片显示的大小
	scrollView->setContentOffset(CCPointZero,true);
	scrollView->setContentSize(CCSize(visibleSize.width * MAP_COUNT, visibleSize.height));//scrollview 大小同spritesContainer同样

	scrollView->setDelegate(this);

	scrollView->setBounceable(false);

	addChild(scrollView);
}
按下后给beginTouchPoint赋值
bool MapChooseScene::onTouchBegan(Touch * touch,Event *unused_event)

{
	beginTouchPoint = Director::getInstance()->convertToGL(touch->getLocationInView());
	log("touch begain");
	return true;

}
//触摸结束后,获取触摸距离。并调用图片位置校正方法adjustScrollView
void MapChooseScene::onTouchEnded(Touch*touch,Event *unused_event)
{

Point endPoint = Director::getInstance()->convertToGL(touch->getLocationInView());
    float distance = endPoint.x - beginTouchPoint.x;
    if(fabs(distance) > TOUCH_DISTANCE)
    {
        adjustScrollView(distance);
    }
}

校正方法。依据触摸滑动的位置距离差值,确认是向左或向右滑动,假设是向左滑动当前页递增,否则递减 。最小值为1 最大值为3

然后依据图片是第几页设置scrollview的Offset ,从而实现位置校正

void MapChooseScene::adjustScrollView(float offset)
{

    if (offset<0)
    {
        currentPage ++;
    }else
    {
        currentPage --;
    }

    if (currentPage <1)
    {
        currentPage = 1;
    }

    if(currentPage > MAP_COUNT)
    {
        currentPage = MAP_COUNT;
    }

        CCPoint  adjustPos = ccp(- visibleSize.width * (currentPage-1), 0);
        scrollView->setContentOffset(adjustPos, true);

}

点击下载代码       地址     http://download.csdn.net/detail/lideguo1979/8268033

未完待续..............................

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-12 19:00:04

Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView的相关文章

Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-关卡选择ScrollView

在MenuScene.cpp 点击单机游戏后会调用 Director::getInstance()->pushScene(MapChooseScene::createScene()); 进入到关卡选择界面,我们采用ScrollView控件制作这个界面 由于scrollview拖动后,位置比较随意,我想是拖动到第二张图片,就完整的显示第二张图片,不要产生偏离位置的现象,所以在移动之后需要进行位置的校正,写了一个adjustScrollView()方法,用来进行该调整. 具体代码如下: MapCho

Cocos2d-x 3.2 大富翁游戏项目开发-第二十九部分 游戏配音

我从大富翁里提取出来里面的wav音效文件,放到我们的游戏中以增加趣味性,仅供学习研究之用 1.修改AppDelegate.cpp文件 // This function will be called when the app is inactive. When comes a phone call,it's be invoked too void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stop

Cocos2d-x 3.2 大富翁游戏项目开发-第三部分 菜单场景

上一部分介绍到片头动画介绍后进入到菜单场景,场景效果如图 MenuScene.h头文件如下: class MenuScene : public LayerColor { public: static Scene* createScene(); virtual bool init(); CREATE_FUNC(MenuScene); private: Size visibleSize; //窗口尺寸 LabelTTF* settingsGameTTF; //场景文字 void menuTouchD

Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色按路径行走

路径获得之后,我们就可以让角色按照路径行走了,当点击go按钮的时候,我们调用player的startGo()方法,传入的参数就是保存了路径的2个一维数组 void GameBaseScene::goButtonCallback(cocos2d::CCObject *pSender) { RouteNavigation::getInstance()->getPath(player1,3,canPassGrid,tiledRowsCount,tiledColsCount); std::vector<

Cocos2d-x 3.2 大富翁游戏项目开发-第四部分 退出对话框

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这部分代码从网上查阅了一下,基本都是以前版本编写的,需要稍微改动一下即可,效果如图</span> 首先看看在MenuScene.cpp如是如何调用起对话框的 void MenuScene::popupLayer(){ // 定义一个弹出层,传入一张背景图 PopupLayer

Cocos2d-x 3.2 大富翁游戏项目开发-第二十五部分 大富翁股市

当角色走到股市图标时,进入股市界面.每走完一个回合,增加一条股票数据, 股市界面上半部分显示股票信息,包括代码,名称,当前价格,买入价格,涨跌百分比,角色持有的股票数量 下半部分显示股票价格走势,当点击一个股票时,显示相关股票的价格走势,共显示最新14条的价格走势. 每次点击购买,买入100股 .点击卖出,则卖出所持有的该股的所有股票.成交价格 等信息动态更新 点击返回,返回到游戏主界面,并更新角色资金值 1.首先添加股票类 包括代码,名称,买入价格,涨跌百分比,持仓数量等定义以及相关的get

Cocos2d-x 3.2 大富翁游戏项目开发-第二十三部分 购买彩票

当角色路过彩票的标志或者停留位置有彩票标志时,弹出购买彩票的对话框,提示购买彩票,已经买过的号码,不显示.当机器对手路过时则直接购买彩票. 1. 在RicherPlayer.h中增加std::vector<int> lottery_vector;用来存储购买的彩票号码 2. RicherGameController 修改endGo方法,每走完一步就会进入该方法,判断是否有彩票标示图标,有的话发送MSG_LOTTERY彩票消息,MOVEPASS标示走完一步的标志 void RicherGameC

Cocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走

现在只能让我方角色行走,对手并没有行动,如何实现轮流行走呢? 有2种方法,一种是采用刷帧控制器在update进行,另一种采用消息机制的形式实现,我们尽量避免使用刷帧控制器.就采用第二种消息机制吧 我们在GameBaseScene中定义变量players_vector [Player*] 来存放所有的角色: 在添加新对象时,给该对象设置属性_isMyTurn为true 这样所有对象添加完毕后players_vector [Player*]所有的isMyTurn都为true,表示可以调用go方法,进

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3

点击下载代码   http://download.csdn.net/detail/lideguo1979/8291803 新建一个类RouteNavigation,定义getPath()方法.用来获取角色路径,我们採用单例模式设计该类,先看该类的定义 RouteNavigation.h class RouteNavigation{ public: static RouteNavigation* routeNav_Instance; //该类静态对象 static RouteNavigation*