主要是AppDelegate(应用导演)和HelloWorldScene(示例层)。
AppDelegate 是 Cocos2D-x的内部入口。
从操作系统到Cocos 会先进入 AppDelegate。
也就是当 '引擎' 初始化完毕后,会调用AppDelegate的 ApplicationDidFinishLaunching 方法。
在 AppDelegate 中 执行游戏的初始化,设置分辨率并启动场景。
[AppDelegate.cpp]
bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); //初始化OpenGLs视图 如果成功就会根据对应平台完成对象实现。 if(!glview) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) glview = GLViewImpl::createWithRect("SmartGame",Rect(0,designResolutionSize.width,designResolutionSize.height)); #else glview = GLViewImpl::create("SmartGame"); #endif //导演了设置OpenGL director->setOpenGLView(glview); } // turn on display FPS (显示帧率) director->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this // 一般肉眼这个刷新频率够了 director->setAnimationInterval(1.0 / 60); // Set the design resolution // 设置 屏幕分辨率 glview->setDesignResolutionSize(designResolutionSize.width,designResolutionSize.height,ResolutionPolicy::NO_BORDER); Size frameSize = glview->getFrameSize(); //如果OpenGl拿出的高度大于中等大小才会执行的代码块,应该是适屏设置。 if (frameSize.height > mediumResolutionSize.height) { director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height,largeResolutionSize.width/designResolutionSize.width)); } // if the frame's height is larger than the height of small size. else if (frameSize.height > smallResolutionSize.height) { director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height,mediumResolutionSize.width/designResolutionSize.width)); } // if the frame's height is smaller than the height of medium size. else { director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height,smallResolutionSize.width/designResolutionSize.width)); } register_all_packages(); // create a scene. it's an autorelease object // 创建HelloWorld场景,这个场景对象会交给Cocosed-x管理,不需要手动释放 auto scene = HelloWorld::createScene(); // 运行这个场景 director->runWithScene(scene); return true; }
当导演runWithScene 运行该场景时。
会先进入该场景的ini 初始化方法。
[HelloWorldScene.cpp]
bool HelloWorld::init() { ////////////////////////////// // 1. super init first,必须先执行父类的初始化。 if ( !Layer::init() ) { return false; } // 屏幕的可见区域值 Size visibleSize = Director::getInstance()->getVisibleSize(); // 原点的位置 Vec2 origin = Director::getInstance()->getVisibleOrigin(); // 关闭按钮是一个 MenuItemImage (菜单项) 对象。 // create 方法中的前两个参数代表着选中与非选中状态显示的图。 // 当他被单击的时候,CC_CALLBACK_1开始执行回调函数,即helloWorld的menuCloseCallback // 函数原型 /** *参数 Ref* 代表单击事件都发送者,即MenuItemImage! void HelloWorld::menuCloseCallback(Ref* sender){ Director::getInstance()->end(); } */ auto closeItem = MenuItemImage::create( "CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::menuCloseCallback,this)); closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2,origin.y + closeItem->getContentSize().height/2)); // create menu,it's an autorelease object auto menu = Menu::create(closeItem,NULL); // 设置类菜单位置,以后记住这代表右下角。 menu->setPosition(Vec2::ZERO); // 此行代表加到场景中。 // 第二个参数代表绘制层的顺序,默认参数值为0, // 表示最高优先层导入,该值越大表示该层在最后加载(在最高一层),一般背景图层是首先加载, // 其他元素在加载在背景层上面。因为背景在后面加载的话,会覆盖掉前面加载的元素,看不到想要的图层组合效果。 this->addChild(menu,1); // 创建文本,选择指定字体库,设置字号 auto label = Label::createWithTTF("Hello World","fonts/Marker Felt.ttf",24); // 设置位置,X 剧中,y 偏上 // 此处标记 Vec2的居中布局位置 : (原点x轴的起始位置向右偏移至总屏幕可见范围一半的位置 // 即 origin.x + visibleSize.width/2 label->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height - label->getContentSize().height)); // add the label as a child to this layer this->addChild(label,1); // add "HelloWorld" splash screen" // 这里创建里一个精灵,用于显示纹理(就是贴图)。 auto sprite = Sprite::create("HelloWorld.png"); // x y 轴起点偏移至屏幕可见范围的一半,上下左右都居中 sprite->setPosition(Vec2(visibleSize.width/2 + origin.x,visibleSize.height/2 + origin.y)); // add the sprite as a child to this layer this->addChild(sprite,0); return true; }
本文内容源自: http://spu.dangdang.com/23947634.html