cocos2d-x 3.0的入门程序:helloworld

看过了这么多不同方向的应用,发现很多程序入门都是helloworld
helloworld是所有程序员的绝对初恋

先看一下程序的运行结果吧


然后就是他的工程代码

工程的目录有两个

 

    Classes:程序中的类

          AppDelegate.h/cpp:Cocos2d-x程序框架
          AppMacros.h:所用到的宏,主要是设置分辩率及对应的资源目录         
          HelloWorldScene.h/cpp:场景显示层

    win32:WIN32程序所涉及的主函数

          main.cpp:winMain主函数

 

WinMain函数:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "main.h"
#include "AppDelegate.h"
#include "cocos2d.h"
 
USING_NS_CC;
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
 
    // create the application instance
    AppDelegate app;
    //运行创建程序
    return Application::getInstance()->run();
}

 

      一切都被封装到程序类AppDelegate中,这是一个基于Cocos2d-x的cocos2d::Application类的派生类。

它将程序框架封装为一个类,提供了统一的多平台上基本程序框架的实现。

 

AppDelegate.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "AppDelegate.h"
#include "HelloWorldScene.h"
 
USING_NS_CC;
 
AppDelegate::AppDelegate() {
 
}
 
AppDelegate::~AppDelegate()
{
}
 
bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director创建导演
    auto director = Director::getInstance();
    //创建opengl窗口
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLView::create("My Game");
        director->setOpenGLView(glview);
    }
 
    // turn on display FPS 打开FPS
    director->setDisplayStats(true);
 
    // set FPS. the default value is 1.0/60 if you don't call thi 1秒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::getInstance()->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::getInstance()->resumeBackgroundMusic();
}

  

 

下面我们来看一下HelloWorld场景,它是一个基于cocos2d::Layer的派生类。cocos2d::Layer是什么?在这里,我想打个比方来建立一些基本的认知,比方说我们生活在地球上,地球属于宇宙内的一部分。从Cocos2d-x的框架体系来看,我们是Sprite精灵,地球是Layer,而宇宙是Scene。

 

        一个程序要想表现出精彩的世界,要先建立一个宇宙Scene,然后增加地球,月球,太阳等Layer,然后在这些Layer上增加相应的物体。而我们站在地球上,地球运动,我们也会跟着一起运动。

 

  OK,现在我们来看一下如何创建Scene和Layer:

 

HelloWorldScene.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "HelloWorldScene.h"
 
USING_NS_CC;
 
Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
     
    // 'layer' is an autorelease object
    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();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
 
    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.
    //   // 创建一个菜单项,它由两张图片来表现普通状态和按下状态,设置按下时调用menuCloseCallback函数响应关闭 
    // 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));
    //指定菜单位置,菜单项
    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);
    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(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");
 
    // position the sprite on the center of the screen精灵位置
    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;
}
 
//点close菜单项的时候来回调的
void HelloWorld::menuCloseCallback(Ref* pSender)
{
    ////如果是WP8平台,弹出消息框提示一下。 
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
    MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
    return;
#endif
    //终止程序。
    Director::getInstance()->end();
    //如果是ios平台
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

  Layer中增加了精灵,按钮,文字等表现物,有了这些表现物,一个Layer才有价值。

参考:http://blog.csdn.net/honghaier/article/details/24518863(谢谢)

 

posted @   calmound  阅读(1462)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示