1 如何实现界面全屏
在AppDelegate.cpp中
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if (!glview) {
glview = GLViewImpl::createWithRect("TGame",Rect(0,0,960,640));
director->setOpenGLView(glview);
}
// ......
}
这行代码是用设置窗口大小:
glview = GLViewImpl::createWithRect("TGame",640));
但是我们需要设置全屏,如何设置呢?将该行代码改为如下:
glview = GLViewImpl::createWithFullScreen("TGame");
2 Tiled创建地图参数设置注意事项
第一次设置地图总是出问题,经过多次尝试和百度,发现下面这个参数是OK的。
只用注意: Tile Layer Format
里面有好几种,我们选择XML
其他不用改动,这时候加载就不会出问题了。
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
auto map = CCTMXTiledMap::create("map.tmx");
map->setAnchorPoint(ccp(0.5f,0.5f));
map->setPosition(ccp(winSize.width / 2.0f,winSize.height / 2.0f));
addChild(map);
其实CCTMXTiledMap这个类名以及告诉我们该如何选择这个配置了。
另外下面两行是用来设置地图居中显示:
map->setAnchorPoint(ccp(0.5f,0.5f));
map->setPosition(ccp(winSize.width / 2.0f,winSize.height / 2.0f));
3 获取窗口大小和原点坐标
visibleSize 是窗口尺寸,origin 是窗口原点坐标
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
4 获取屏幕尺寸
int width = GetSystemMetrics(SM_CXSCREEN);
int height = GetSystemMetrics(SM_CYSCREEN);
5 场景切换
goScene为新场景类:
Director::getInstance()->replaceScene(goScene::createScene());
6 新场景初始文件.c和.h
MyScene.h
#ifndef __MyScene_H__
#define __MyScene_H__
#include "cocos2d.h"
class MyScene : public cocos2d::Layer
{
public:
// there's no 'id' in cpp,so we recommend returning the class instance pointer
static cocos2d::Scene* createScene();
// Here's a difference. Method 'init' in cocos2d-x returns bool,instead of returning 'id' in cocos2d-iphone
virtual bool init();
// implement the "static create()" method manually
CREATE_FUNC(MyScene);
};
#endif // __MyScene_H__
MyScene.c
#include "MyScene.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"
USING_NS_CC;
using namespace cocostudio::timeline;
Scene* MyScene::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create();
// 'layer' is an autorelease object
auto layer = MyScene::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool MyScene::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
auto rootNode = CSLoader::createNode("MyScene.csb");
addChild(rootNode);
return true;
}
在使用这段代码的时候,可以通过替换把MyScene替换成你想要的类名。
7 同级场景切换
MyScene是你接下来想进入同级场景(这个地方不是很肯定,懂的人给指点下):
Director::getInstance()->replaceScene(MyScene::createScene());
8 进入子场景
MyScene是你接下来想进入的子场景
auto scene = MyScene::createScene();
// run
director->runWithScene(scene);
9 设置屏幕分辨率与插入控件尺寸一样
该操作是用来解决插入的内容不能将屏幕铺满的问题。
下面两行代码放在新场景init()函数中。
auto director = Director::getInstance();
director->getOpenGLView()->setDesignResolutionSize(352,352,ResolutionPolicy::SHOW_ALL);
下面是设置之后,与没设置直接的区别
10 加入Cocos Studio创建的场景
MainScene.csb为Cocos Studio创建的场景
auto rootNode = CSLoader::createNode("MainScene.csb");
addChild(rootNode,0);
11 获取Cocos Studio创建的场景*.csb中的变量
比如我们在场景中加入了一个Button的变量,下面是获取控件的办法,并且设置控件响应事件。
auto startButton = (ui::Button*)rootNode->getChildByName("Button");
startButton->addTouchEventListener(CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
12 CC_CALLBACK_1回调函数
函数参数一定要注意:一定有Ref * pSender。
void HelloWorld::menuStartCallback(Ref* pSender)
{
// To Add Your Code
}
到此还没有完,你还必须在类里面添加函数声明,这个大家都知道,不用废话。
13 动态添加控件
就拿一个Menu来举个例子,下面代码是添加了两个Menu,分别是closeItem和startItem。
auto closeItem = MenuItemFont::create("Exit",CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
auto startItem = MenuItemFont::create("Start",CC_CALLBACK_1(HelloWorld::menuStartCallback,this));
closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width / 2,origin.y + closeItem->getContentSize().height / 2));
startItem->setPosition(Vec2(origin.x + visibleSize.width / 2 - startItem->getContentSize().width / 2,origin.y + visibleSize.height/4 + startItem->getContentSize().height / 2));
// create menu,it's an autorelease object
auto menu = Menu::create(closeItem,NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu,1);
menu = Menu::create(startItem,1);
至于其他控件如何添加也无非这几步,(1)创建控件;(2)设置位置;(3)关联(有的控件不需要关联);(4)插入。
14 静态添加控件
主要看第11个如何获取场景中的控件,静态添加就是在场景中添加完成,并且已经设置完位置,我们只需要让其与回调函数关联起来,看12如何用写回调函数。
接触Cocos两三天,瞎学,请大家在下面多多留言提问,指点,互相学习与指导!