• cocos2d之创建自己的场景类


    |   版权声明:本文为博主原创文章,未经博主允许不得转载。

    1. 首先创建.h的头文件,然后在将一些图片声音素材加到resource文件夹内,最后在创建.cpp文件;
            .h头文件中创建一个类,此类一般继承自Layer,首先有一个静态的创建场景的方法,然后是一个初始化方法,还有一个CREATE_FUNC宏; .cpp中就是对.h中class中定义的方法来进行实现

    效果图:

    代码:

    MyGameScene.h:

     1 #ifndef _MYGAME_SCENE_H_
     2 #define _MYGAME_SCENE_H_
     3 
     4 #include "cocos2d.h"
     5 class MyGame : public cocos2d::Layer
     6 {
     7 public:
     8     static cocos2d::Scene* createScene();
     9 
    10     virtual bool init();
    11 
    12     CREATE_FUNC(MyGame);
    13 };
    14 
    15 #endif // _MYGAME_SCENE_H_

      在MyGameScene.h中,我们创建了一个MyGame的类,这个类继承自图层Layer;首先我们创建了一个静态的方法createScene();,这个方法是我们创建场景的一个方法;还有init() 和 宏CREATE_FUNC;CREATE_FUNC用来为一个类似CCLayer类的特定的类增加一个create函数,我们使用CREATE_FUNC来创建图层Layer;

    MyGameScene.cpp:

     1 #include "MyGameScene.h"
     2 
     3 USING_NS_CC;
     4 //一个名字空间;它表示着using namespace cocos2d  
     5 //这是USING_NS_CC的定义: #define USING_NS_CC      using namespace cocos2d
     6 
     7 
     8 Scene* MyGame::createScene()
     9 {
    10     auto scene = Scene::create();
    11     auto layer = MyGame::create();
    12     scene->addChild(layer);
    13     return scene;
    14 }
    15 
    16 bool MyGame::init()
    17 {
    18     if (!Layer::init())           //判断父类图层是否初始化
    19     {
    20         return false;
    21     }
    22 
    23     Size visibleSize = Director::getInstance()->getVisibleSize();
    24     //获取当前运行窗口的大小
    25     Vec2 origin = Director::getInstance()->getVisibleOrigin();
    26     //获取当前窗口的原点坐标
    27 
    28     /////////////////////////////////////////////////////////////////////////////////////////
    29     /////////////////////////////////////////////////////////////////////////////////////////
    30     auto bg = Sprite::create("bg1.png");
    31     bg->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));
    32 
    33     //下面是将图片调节到与窗口同比例的缩放;图片 / 窗口
    34     float xs = visibleSize.width / bg->getContentSize().width;
    35     float ys = visibleSize.height / bg->getContentSize().height;
    36     bg->setScale(xs, ys);
    37 //setScale()是一个缩放方法;若要是图片铺满整个显示框,可以使用此函数要将图片与运行框同比例缩放,同时如果想放大或缩小每一个节点的大小,///也可以使用可方法
    38     this->addChild(bg,0);
    39 
    40     /////////////////////////////////////////////////////////////////////////////////////////
    41     /////////////////////////////////////////////////////////////////////////////////////////
    42     auto mouse = Sprite::create("mouse.png");
    43     mouse->setPosition(Vec2(visibleSize.width / 3 + origin.x, visibleSize.height / 4 + origin.y));
    44     mouse->setScale(0.5, 0.5);                   //节点的缩放,这里是缩小
    45     this->addChild(mouse, 1);
    46 
    47     auto hammer = Sprite::create("hammer.png");
    48     hammer->setPosition(Vec2(visibleSize.width / 2.5 + origin.x, visibleSize.height / 2 + origin.y));
    49     hammer->setScale(0.7, 0.7);
    50     this->addChild(hammer);
    51 
    52     /////////////////////////////////////////////////////////////////////////////////////////
    53     /////////////////////////////////////////////////////////////////////////////////////////
    54     auto label = Label::createWithTTF("Whac-a-mole", "fonts/Marker Felt.ttf", 38);
    55         //createWithTTF是创建标签文本的方法,其中第一个参数是要显示的内容,第二个是字体格式(fonts/Marker Felt.ttf
    56             //表示在fonts文件夹下的Marker Felt.ttf字体,第三个参数是字体的大小,数字越大字体越大)
    57     label->setPosition(Vec2(origin.x + visibleSize.width / 2,
    58                           origin.y + visibleSize.height - label->getContentSize().height));
    59 
    60     //Vec2(x,y);表示的是坐标点位置,setPosition()是设置位置的方法,给出位置,就能到特定的位置
    61     this->addChild(label,1);
    62 
    63     auto start = Label::createWithTTF("Start", "fonts/Marker Felt.ttf", 24);
    64     start->setPosition(Vec2(origin.x + visibleSize.width / 2,
    65         (origin.y + visibleSize.height - (visibleSize.height / 2))));
    66     this->addChild(start, 2);
    67 
    68     auto Help = Label::createWithTTF("Help", "fonts/Marker Felt.ttf", 24);
    69     Help->setPosition(Vec2(origin.x + visibleSize.width / 2,
    70         (origin.y + visibleSize.height - (visibleSize.height / 2) - (Help->getContentSize().height*1.5))));
    71     this->addChild(Help, 2);                     //这里的这个2表示的是z轴(数字越大,就越在上层,不容易被覆盖)
    72 
    73     auto Exit = Label::createWithTTF("Exit", "fonts/Marker Felt.ttf", 24);
    74     Exit->setPosition(Vec2(origin.x + visibleSize.width / 2,
    75         (origin.y + visibleSize.height - (visibleSize.height / 2) - ((Exit->getContentSize().height*1.5)*2))));
    76     this->addChild(Exit, 2);
    77     //getContentSize()表示获取当前对象节点的高或框;Exit->getContentSize().height表示取得对象节点Exit的高度
    78     return true;
    79 }

      在自己写好.h和.cpp之后还要改两个地方才能运行你所写场景,因为程序从main.cpp运行到代理程序AppDelegate时,由AppDelegate中的方法来运行游戏,因此要AppDelegate中的头文件要包含你写.h文件;如下:

    再将applicationDidFinishLaunching()方法中创建场景的对象

    由:

    改为:

    其中的HelloWorld和MyGame均是.h文件中的类名;改好即可,若不该这两项的话运行的还是HelloWorldScene,而不是自己写的MyGameScene 

  • 相关阅读:
    使用RSA实现客户端和后台的非对称加密
    PHP异步并行网络扩展swoole安装
    rvm is not a function的解决方法
    python中的sort(),sorted()的用法
    RESTful框架中的Mixin中的五个类视图
    RESTful框架的API请求流程
    理解RESTful架构
    Django中的admin管理工具
    一个程序员的自我介绍--英文版
    Django中的认证系统
  • 原文地址:https://www.cnblogs.com/geore/p/5793840.html
Copyright © 2020-2023  润新知