`

cocos2d-x 第二篇 HelloWorld的流程

 
阅读更多

这篇博客主要是带领大家一起了解整个游戏的执行过程,其中涉及的一些譬如导演,场景,层之类的概念将会在后面讲解。

main函数的区别:

#import <UIKit/UIKit.h>

// Under iOS and the Simulator, we can use an alternate Accelerometer interface
#import "AccelerometerSimulation.h"
//程序入口
int main(int argc, char *argv[]) {
   
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    //注意这时方法的第四个参数是AppController而不再是AppDelegate了,此时把AppController就是以前的AppDelegate,AppController继承的还是UIApplicationDelegate,而以前的AppDelegate被用作是游戏的代理类了,而AppDelegate继承的是cocos2d::Application
    int retVal = UIApplicationMain(argc, argv, nil, @"AppController");
    [pool release];
    return retVal;
}
 再看AppController.mm

#import "AppController.h"
#import "EAGLView.h"
#import "cocos2d.h"
#import "AppDelegate.h"
#import "RootViewController.h"

@implementation AppController

#pragma mark -
#pragma mark Application lifecycle

// cocos2d application instance 游戏的单例实例
static AppDelegate s_sharedApplication;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
   
    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
   
    // Init the CCEAGLView 初始化eaglView
    CCEAGLView *__glView = [CCEAGLView viewWithFrame: [window bounds]
                                     pixelFormat: kEAGLColorFormatRGB565
                                     depthFormat: GL_DEPTH24_STENCIL8_OES
                              preserveBackbuffer: NO
                                      sharegroup: nil
                                   multiSampling: NO
                                 numberOfSamples: 0];

    // Use RootViewController manage CCEAGLView
    viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    viewController.wantsFullScreenLayout = YES;
    //eaglView继承UIView,将eaglView设置为跟控制器的view
    viewController.view = __glView;

    // Set RootViewController to window
    if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)
    {
        // warning: addSubView doesn't work on iOS6
        [window addSubview: viewController.view];
    }
    else
    {
        // use this method on ios6
        [window setRootViewController:viewController];
    }
   
    [window makeKeyAndVisible];
   
    [[UIApplication sharedApplication] setStatusBarHidden:true];
    //游戏开始运行
    cocos2d::Application::getInstance()->run();

    return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
    /*
     Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
     Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
     */
       //暂停游戏
    cocos2d::Director::getInstance()->pause();
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    /*
     Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
     */
       //恢复游戏
    cocos2d::Director::getInstance()->resume();
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    /*
     Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
     If your application supports background execution, called instead of applicationWillTerminate: when the user quits.
     */
       //游戏已经进入后台
    cocos2d::Application::getInstance()->applicationDidEnterBackground();
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    /*
     Called as part of  transition from the background to the inactive state: here you can undo many of the changes made on entering the background.
     */
       //游戏将要进入前台
    cocos2d::Application::getInstance()->applicationWillEnterForeground();
}

- (void)applicationWillTerminate:(UIApplication *)application {
    /*
     Called when the application is about to terminate.
     See also applicationDidEnterBackground:.
     */
}


#pragma mark -
#pragma mark Memory management

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    /*
     Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.
     */
}


- (void)dealloc {
    [window release];
    [super dealloc];
}


@end
接下来是AppDelegate.cpp

#include "AppDelegate.h"
#include "HelloWorldScene.h"

USING_NS_CC;

AppDelegate::AppDelegate() {

}

AppDelegate::~AppDelegate()
{
}

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director  初始化导演,EGLView
    auto director = Director::getInstance();
    auto eglView = EGLView::getInstance();

    //设置导演的openglView
    director->setOpenGLView(eglView);
   
    // turn on display FPS 显示刷帧状态,就是屏幕左下角的那个不断变化的数字
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this 设置刷帧频率 1.0/60表示每秒刷新屏幕60次
    director->setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object  创建一个自动释放的场景
    auto scene = HelloWorld::createScene();

    // run 导演开始运行这个场景
    director->runWithScene(scene);

    return true;
}

// 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()->stopAnimation();

    // if you use SimpleAudioEngine, it must be pause
    // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
      //导演开始游戏
    Director::getInstance()->startAnimation();

    // if you use SimpleAudioEngine, it must resume here
    // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}
下面是HelloWorldScene.cpp

#include "HelloWorldScene.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object 创建一个自动释放的场景
    auto scene = Scene::create();
   
    // 'layer' is an autorelease object 创建一个自动释放的层,create方法在HelloWorldScene.h中用宏定义声明了: CREATE_FUNC(HelloWorld);
    auto layer = HelloWorld::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 HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
   
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object 创建一个自动释放的菜单项,包括正常图片,选中图片,回调函数,回调代理类
    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    //设置菜单项的位置,注意cocos2d的原点在左下角,向右为X正方向,向上为Y正方向
    closeItem->setPosition(Point(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(Point::ZERO);
    //将菜单加入层中
    this->addChild(menu, 1);

    /////////////////////////////
    // 3. add your codes below...

    // add a label shows "Hello World"
    // create and initialize a label 创建一个自动释放的文字标签
   
    auto label = LabelTTF::create("Hello World", "Arial", 24);
   
    // position the label on the center of the screen 设置位置
    label->setPosition(Point(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");

    // position the sprite on the center of the screen 设置精灵图片
    sprite->setPosition(Point(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;
}

//菜单项回调事件
void HelloWorld::menuCloseCallback(Object* pSender)
{
    //导演运行结束
    Director::getInstance()->end();
//如果是ios平台就退出程序
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

 

  • 大小: 76.7 KB
分享到:
评论

相关推荐

    Cocos2d-x学习笔记

    6. 编译并运行HelloWorld项目,观察到基本的游戏框架运行在屏幕上,此时Cocos2d-x的入门学习已成功迈出第一步。 此外,学习Cocos2d-x还应该包括以下几个方面: - 掌握Cocos2d-x的基本架构:Cocos2d-x框架中包括...

    Cocos2d-x教程

    - **定义与特点**:Cocos2d-x是一款高性能的2D游戏开发框架,最初基于Cocos2d-iPhone开发而来,继承了其易用性、高效性和灵活性等特点。 - **跨平台能力**:具备强大的跨平台特性,允许开发者只需编写一次代码即可...

    cocos2d-x权威指南源代码

    cocos2d-x是一个跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多操作系统环境。本指南的源代码旨在帮助开发者深入理解cocos2d-x的工作原理,提升游戏开发技能。 cocos2d-x是基于cocos2d的扩展,它用...

    Cocos2d-x游戏开发实战精解-教学PPT

    这部分会讲解Cocos2d-x的项目结构,如何搭建开发环境,并引导读者进行第一个Hello World项目的创建,从而对Cocos2d-x有一个基本的认识。 接下来,"Cocos2d-x基础知识学习"部分会详细讲解Cocos2d-x的基本概念,包括...

    Cocos2d-x高级开发教程

    - **定义与特点**:Cocos2d-x是一款专为2D游戏设计的跨平台游戏引擎,其设计灵感来源于Cocos2d-iPhone。它具有简单易用、性能高效、灵活性强等特点,广泛应用于手机游戏的开发。 - **跨平台能力**:相较于Cocos2d-...

    Cocos2d-x--珍藏版

    这部分主要介绍了如何在Windows系统中使用Visual Studio 2008和Cocos2d-x引擎创建HelloWorld项目。 - **Visual Studio 2008安装**:由于Cocos2d-x在Visual Studio 2008中运行被认为是最稳定的,因此推荐下载并安装...

    cocos2d-x 聊天小程序1 数据的简单数据通信

    在IT行业中,Cocos2d-x是一个非常流行的开源2D游戏开发框架,它基于C++,支持多平台,包括iOS、Android以及Windows等。在这个"聊天小程序1 数据的简单数据通信"主题中,我们将深入探讨如何利用Cocos2d-x进行基本的...

    cocos2d-x手机游戏开发 源代码

    2. **第一个项目**:引导读者创建并运行第一个简单的Cocos2d-x项目,介绍基本的HelloWorld示例。 3. **绘图与图像处理**:讲解如何绘制2D图形、精灵(Sprite)以及使用Tiled地图编辑器创建游戏地图。 4. **动画和...

    Cocos2d x手机游戏开发与项目实战详解.part3

     第四章主要介绍Cocos2d-x的环境搭建和HelloWorld的项目实现,通过本章读者可以快速上手开发一个最简单的移动游戏UI,并通过该案例以了解Cocos2d-x的运行原理。  第五章主要介绍Cocos2d-x核心技术,这里包括Cocos...

    Cocos2d-x 高级开发教程.pdf

    Cocos2d-x 是一款高性能的跨平台2D游戏开发框架,其设计初衷是为游戏开发者提供一个易用、高效且灵活的开发环境。该框架起源于 Cocos2d-iPhone,但经过优化和扩展后能够支持更多的平台。Cocos2d-x 的主要特点是易于...

    第01章 初识Cocos2d-X.zip

    这个文件很可能是Cocos2d-X的“Hello World”示例,通常包含了一个简单的项目结构,演示了如何创建一个新的Cocos2d-X项目,以及如何在屏幕上显示文本或图形。开发者通过运行这个项目,可以了解基本的环境配置和代码...

    将Cocos2d-X嵌入MFC的子窗体方法讲解

    2. **配置环境**:按照Cocos2d-X HelloWorld工程的设置,配置好包含头文件目录、库文件目录以及库的链接设置。 ##### 第二步:设计界面布局 1. **设计布局**:设计一个包含三个部分的对话框界面,左右两侧用于展示...

    Cocos2d-x 教程

    通过创建第一个"Hello World"项目,你可以快速了解Cocos2d-x的基本用法,包括如何启动游戏、添加场景和精灵,以及使用控制台输出信息。 4. **场景(Scene)和层(Layer)** 场景是游戏的主要容器,可以包含多个层...

    cocos2d-x教程

    Cocos2d-x是一个开源的游戏开发框架,广泛用于创建2D游戏、互动图书和其他富媒体应用程序。这个框架基于C++,并且提供了JavaScript和Lua的绑定,使得开发者可以选择他们熟悉的语言进行开发。本教程将深入探讨cocos2d...

    cocos2d-x for myphone beginners

    书中会引导你安装并配置Cocos2d-x开发环境,包括Xcode(iOS)和Android Studio(Android),并教你如何创建第一个“Hello, World”项目。 在深入学习之前,你需要掌握基本的图形绘制概念,如精灵(Sprite)、层...

    Cocos2d-JS开发之旅+完整版

    第2 章 跑起我们的HelloWorld / 10 第一部分总结 / 27 第二部分 做一个简单的小游戏 第3 章 Cocos2d-JS 的平面世界 / 30 第4 章 让世界来点动静 / 51 第5 章 让玩家操纵这个世界 / 72 第6 章 控制小怪按时出现...

    第02章 Cocos2d-x基础.zip

    "Sample2_1.zip"可能是基础的"Hello World"示例,展示了如何创建一个简单的Cocos2d-x项目。这个例子会介绍`main.cpp`文件,这是游戏的入口点,以及如何创建场景(Scene)、层(Layer)和节点(Node)。 3. **场景...

    cocos2d-x手机游戏开发:跨iOS、Android和沃Phone平台

    第4章到第6章开始深入cocos2d-x引擎的使用方法,包括如何搭建开发环境(环境搭建、HelloWorld案例测试)、引擎基础使用(整体架构、目录结构、坐标体系等),以及如何利用cocos2d-x的高级特性(物理引擎、粒子系统、...

    Cocos2d-JS 快速入门——视频(上部分)

    在这个视频中,讲师会通过一个简单的"HelloWorld"项目,来解释Cocos2d-JS的基本编程概念。这通常包括如何创建场景、添加精灵、处理事件以及编写基本的JavaScript代码。这个项目是所有Cocos2d-JS学习者的第一步,...

    cocos2d-x 读取本地的xml文件

    在Cocos2d-x这个强大的2D游戏开发框架中,读取本地XML文件是一项重要的功能,尤其当需要处理数据结构复杂或实现图文混排时。XML(eXtensible Markup Language)是一种标记语言,常用于存储和传输结构化数据。在Cocos...

Global site tag (gtag.js) - Google Analytics