华容道08之菜单界面和选关界面的添加

前端之家收集整理的这篇文章主要介绍了华容道08之菜单界面和选关界面的添加前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


当作最后一篇吧,虽然还不能说是个游戏,但是,作为一个瞎玩的Demo感觉也可以了。

玩家信息类Profile:

Profile设计为一个单例类,在游戏中主要负责保存和读取玩家的信息,其实,Demo中没有什么好保存的信息,但是,在选关的时候需要把选关的ID保存下来,在GameLayer中使用,所以,暂时添加了这个类。

.h

#ifndef _PROFILE_H_
#define _PROFILE_H_

#include "cocos2d.h"

class Profile : public cocos2d::Ref
{
public:
	static Profile * s_pProfile;
	static Profile * getInstance();
	static bool  initStatic();
	static void finalizeStatic();
public:
	Profile();
	~Profile();
	//@biref 选中的关卡的ID
	CC_SYNTHESIZE(int,m_seleLevelID,SeleLevelID);
private:

};

#endif

.cpp

#include "Profile.h"

Profile * Profile::s_pProfile = nullptr;

Profile * Profile::getInstance()
{
	if (!s_pProfile)
	{
		s_pProfile = new Profile();
	}

	return s_pProfile;
}
bool  Profile::initStatic()
{
	s_pProfile = new Profile();
	return true;
}
void Profile::finalizeStatic()
{
	CC_SAFE_RELEASE_NULL(s_pProfile);
}
Profile::Profile()
	:m_seleLevelID(-1)
{
	m_seleLevelID = 0;//<默认选中的关切ID为0
}

Profile::~Profile()
{

}

之前没有用过cocostudio做界面,通过这个项目也学习下cocostudio的一些使用方法菜单界面和选关界面就用cocostudio做了。


菜单界面:


cocostudio拼出了界面,然后在程序中使用,并添加了开始按钮和退出按钮的点击回调。


使用代码如下:


MenuLayer.h

#ifndef  _MENU_LAYER_H_
#define _MENU_LAYER_H_

#include "cocos2d.h"
#include "ui/CocosGUI.h"
class MenuLayer : cocos2d::Layer
{
public:
	static const int BUTTON_TAG_START = 10;
	static const int BUTTON_TAG_CLOSE = 20;
	static cocos2d::Scene* createScene();
	CREATE_FUNC(MenuLayer);
public:
	MenuLayer();
	~MenuLayer();
	virtual bool init();

	void buttonClickCallback(cocos2d::Ref *pSender,cocos2d::ui::Widget::TouchEventType type);
	
private:

};
#endif

MenuLayer.cpp

#include "MenuLayer.h"
#include "cocostudio/CocoStudio.h"
#include "LevelScene.h"

using namespace cocostudio::timeline;
using namespace cocos2d::ui;
USING_NS_CC;
Scene* MenuLayer::createScene()
{
	auto scene = Scene::create();
	auto layer = MenuLayer::create();
	scene->addChild(layer);
	return scene;
}
MenuLayer::MenuLayer()
{

}

MenuLayer::~MenuLayer()
{

}

bool MenuLayer::init()
{
	Layer::init();

	Node * rootNode = CSLoader::createNode("MenuLayer.csb");
	this->addChild(rootNode);

	auto buttonStart = dynamic_cast<Button*>(rootNode->getChildByName("button_start"));
	buttonStart->addTouchEventListener(CC_CALLBACK_2(MenuLayer::buttonClickCallback,this));
	buttonStart->setTag(BUTTON_TAG_START);

	auto buttonClose = Button::create("CloseNormal.png","CloseSelected.png");
	buttonClose->setPosition(Vec2(20,20));
	rootNode->addChild(buttonClose);
	buttonClose->addTouchEventListener(CC_CALLBACK_2(MenuLayer::buttonClickCallback,this));
	buttonClose->setTag(BUTTON_TAG_CLOSE);
	return true;
}

void MenuLayer::buttonClickCallback(Ref *pSender,Widget::TouchEventType type)
{
	log("button clicked");
	Node * pNode = dynamic_cast<Node*>(pSender);
	if (pNode->getTag() == BUTTON_TAG_START)
	{
		Director::getInstance()->replaceScene(LevelScene::createScene());
	}
	else if (pNode->getTag() == BUTTON_TAG_CLOSE)
	{
		Director::getInstance()->end();
	}
}


选关界面:


选关界面也是在cocostudio中做的,用到了ListvView添加ListView的点击回调,根据点击的Cell设置关卡的ID,进入游戏界面


LevelScene.h

#ifndef _MY_SCENE_H_
#define _MY_SCENE_H_

#include "cocos2d.h"
#include "ui/CocosGUI.h"

class LevelScene : public cocos2d::Scene
{
public:
	static Scene * createScene();
public:
	LevelScene();
	~LevelScene();
	virtual bool initSelf();

	void selectedItemEvent(cocos2d::Ref* pSender,cocos2d::ui::ListView::EventType type);
	void selectedItemEventScrollView(cocos2d::Ref* pSender,cocos2d::ui::ScrollView::EventType type);
private:

};

LevelScene.cpp

#include "LevelScene.h"
#include "cocostudio/CocoStudio.h"
#include "data/Profile.h"
#include "GameLayer.h"

using namespace cocostudio::timeline;
using namespace cocos2d::ui;
USING_NS_CC;
Scene * LevelScene::createScene()
{
	auto scene =  new LevelScene();
	scene->initSelf();
	scene->autorelease();
	return scene;
}
LevelScene::LevelScene()
{

}

LevelScene::~LevelScene()
{

}

bool LevelScene::initSelf()
{
	Node * rootNode = CSLoader::createNode("MainScene.csb");
	this->addChild(rootNode);
	auto node = dynamic_cast<Layout*>(rootNode->getChildByName("BG"));
	auto listView = dynamic_cast<ListView*>(node->getChildByName("ListView_3"));

	listView->addEventListener((ListView::ccListViewCallback)CC_CALLBACK_2(LevelScene::selectedItemEvent,this));
	//下面这个回调函数是不用的,只是为了测试
	listView->addEventListener((ListView::ccScrollViewCallback)CC_CALLBACK_2(LevelScene::selectedItemEventScrollView,this));
	return true;
}

void LevelScene::selectedItemEvent(Ref* pSender,ListView::EventType type)
{
	switch (type)
	{
	case ListView::EventType::ON_SELECTED_ITEM_START:
	{
			ListView* listView = static_cast<ListView*>(pSender);
			CC_UNUSED_PARAM(listView);
			//CCLOG("select child start index = %ld",listView->getCurSelectedIndex());
			break;
	}
	case ListView::EventType::ON_SELECTED_ITEM_END:
	{
			ListView* listView = static_cast<ListView*>(pSender);
			CC_UNUSED_PARAM(listView);
			//CCLOG("select child end index = %ld",listView->getCurSelectedIndex());
			Profile::getInstance()->setSeleLevelID(listView->getCurSelectedIndex());
			log("LevelID:%d",Profile::getInstance()->getSeleLevelID());
			//切换界面
			Director::getInstance()->replaceScene(GameLayer::createScene());
			break;
	}
	default:
		break;
	}
}
void LevelScene::selectedItemEventScrollView(Ref* pSender,ui::ScrollView::EventType type)
{
	switch (type) {
	case ScrollView::EventType::SCROLL_TO_BOTTOM:
		//CCLOG("SCROLL_TO_BOTTOM");
		break;
	case ScrollView::EventType::SCROLL_TO_TOP:
		//CCLOG("SCROLL_TO_TOP");
		break;
	default:
		break;
	}
}

猜你在找的Cocos2d-x相关文章