Cocos2d-x的学习之旅(三)自己的 HelloWorld

前端之家收集整理的这篇文章主要介绍了Cocos2d-x的学习之旅(三)自己的 HelloWorld前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

声明

本教程仅用于初学cocos2dx同学使用,内容由本人(Code-Man)编写,此教程使用cocos2dx版本为3.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。QQ群:Cocos2d-CodeMonkey,461679592

经过上一节课相信Monkey们对Cocos2dx的HelloWorld有一定的了解了。如果还不能理解,就赶快加入我们的QQ群吧,期待与你一起成长。今天的任务很明显,写一个自己的HelloWorld,想写点特别点的。与自带的HelloWorld有所区别,但又不能超出一定的知识范围,为此我也挺头痛的!!! 求安慰!!!,经过我日思夜想,天天不能寝,夜夜不能寐最后想到了,我们要完成一个伟大的壮举。创建夏娃和亚当。。。。不要问为什么,技术宅任性。
为什么是《罪恶王冠》? ??? 因为我前几天刚追完。让我发泄一下!! 我的楪祈女神。。。至于跟夏娃亚当有什么关系??不懂的自己补番。。。

【一】添加资源

本文以Xcode为列。下图就是我们的一个项目包的大概的一个结构
1.添加资源到资源文件

2.资源导入到项目

回到工程,资源文件右键Add Files to “MyCppGame”

Add到工程

完成结果,注意!!! 图片一定是PNG格式!!!

【二】场景构建

1.创建第一个C++文件,New File...
2.Next C++文件
3.文件
4.头文件
我们先来理一理,我们需要做的事情。
①.创建场景--->创建层---》创建两个按钮
②.两个按钮:一个能添加我们的主角到我们场景中,一个能删除我们的主角们(这么可爱都舍得删,太可恶了!! 23333)
③.需要一串文字来指导我们的操作
如图:
建议:Monkey们先按照这个思路自己写一些。无论写成什么样都可以。。。。

【三】代码分析

本文知识点:

①Tag值和Name值

②节点与节点之间的关系

③Lable的使用注意事项


最后,我们只要执行我们的场景就好了,在哪呢???
打开 Appelegate.cpp文件



附上源码:
  

<pre name="code" class="cpp">
</pre><pre name="code" class="cpp">//
//  LessonOneScene.h
//  MyCppGame
//
//  Created by He_bi on 15/6/4.
//
//

#ifndef __MyCppGame__LessonOneScene__
#define __MyCppGame__LessonOneScene__

#include <stdio.h>
#include <cocos2d.h>
USING_NS_CC;

class LessonOneScene : public Layer {

public:
    
    //创建场景
    static Scene* createScene();
    
    //初始化函数
    virtual bool init();
    
    //用宏去创建一个层(自己)
    CREATE_FUNC(LessonOneScene);
    
private:
    
    //删除按钮的回调
     void menuRemoveCallback(cocos2d::Ref* pSender);
    
    //添加按钮的回调
     void menuAddCallback(cocos2d::Ref* pSender);
    
private:
    
    //一个英雄节点
    Node* HeroNode;
    
    //按钮层
    Menu* MyMenu;
    
    //屏幕大小
    Size WinSize;
};
#endif /* defined(__MyCppGame__LessonOneScene__) */

//
//  LessonOneScene.cpp
//  MyCppGame
//
//  Created by He_bi on 15/6/4.
//
//

#include "LessonOneScene.h"

//这个函数在此次不累赘、越往后面,对于前面的知识不会做无谓的讲解。
//忘记的可以复习前面的只是
Scene* LessonOneScene::createScene(){
    auto Myscene=Scene::create();
    
    auto MyLayer=LessonOneScene::create();
    
    Myscene->addChild(MyLayer);
    
    return Myscene;
}


bool LessonOneScene::init(){
    if (!Layer::init()) {
        return false;
    }
    
    WinSize=Director::getInstance()->getVisibleSize();
    
    //创建我们的背景图片
    auto bg=Sprite::create("LessonOne_Bg.png");
    
    //WinSize/2 这种写法是3.0之后才有的,是不是很方便
    bg->setPosition(WinSize/2);
    
    //这个这样理解吧,“别名”,也就是这个对象的另一个名字。例如:张三,别名:Monkey,哈哈哈!
    bg->setName("bg");
    this->addChild(bg);
    
    
    //按钮控件,还记得上一节课的那个按钮吗?那个使用图片作为按钮,现在我们使用的是文字按钮
    auto AddMenItem=MenuItemFont::create("添加按钮",CC_CALLBACK_1(LessonOneScene::menuAddCallback,this));
    AddMenItem->setPosition(WinSize.width/2,WinSize.height/2/2);
    
    auto RemoveMenItem=MenuItemFont::create("删除按钮",CC_CALLBACK_1(LessonOneScene::menuRemoveCallback,this));
    RemoveMenItem->setPosition(WinSize.width/2,WinSize.height/2+WinSize.height/2/2);
    
    //把按钮都添加到Men层上
    MyMenu=Menu::create(AddMenItem,RemoveMenItem,NULL);
    
    // Vec2::ZERO= Vec2(0,0),3.0后的写法,直接变成静态变量
    MyMenu->setPosition(Vec2::ZERO);
    this->addChild(MyMenu);
    
    /**
     还记得我们上一节课,是如何创建helloWorld文字的吗?
     Label::createWithTTF("Hello World","fonts/Marker Felt.ttf",24);
    这是上一节课创建方式。是不是稍微不一样?到底哪里不一样呢?其实看函数名可以很好的理解。
     WithTTF:依靠着TTF(True Type File 字型文件),Marker Felt.ttf(不包含中文)
     WithSystemFont:跟随着系统的文字。
     所有如果我们使用上一节课的方式创建,是看不到中文的
     */
    auto MyLabel=Label::createWithSystemFont("请添加主角","宋体",43);
    MyLabel->setPosition(WinSize.width-MyLabel->getContentSize().width,WinSize.height/2);
    //Node的常用函数,设置一个Node的颜色,但如果我们直接创建一个Node而不是它的子类然后设置颜色会怎么样呢?留给大家耍一耍
    MyLabel->setColor(Color3B(255,0));
    //这个,跟名字一样而是对象的另一个名字,好比人的身份证
    MyLabel->setTag(10000);
    bg->addChild(MyLabel,2);
    
    return true;
}

void LessonOneScene::menuAddCallback(cocos2d::Ref *pSender){
//    在主角节点为空的适合我们就去招呼出我们的萌萌哒的主角
    if (HeroNode==nullptr) {
        
//        创建我们的空节点,理解为容器吧,可以装很多东西
        HeroNode=Node::create();
        this->addChild(HeroNode);
//       出来吧男主角
        auto LessonOne_Boy=Sprite::create("LessonOne_Boy.png");
        auto BoySize=LessonOne_Boy->getContentSize();
        LessonOne_Boy->setPosition(BoySize.width/2,WinSize.height/2/2);
//        装到容器里面
        HeroNode->addChild(LessonOne_Boy);
        
//        出来吧女主角
        auto LessonOne_Gril=Sprite::create("LessonOne_Gril.png");
        auto GrilSize=LessonOne_Gril->getContentSize();
        LessonOne_Gril->setPosition(GrilSize.width/2,WinSize.height/2+WinSize.height/2/2);
        HeroNode->addChild(LessonOne_Gril);
        
//      this是谁?自己,自己是什么?,层,层有一个儿子它的别名叫“bg”,“bg”有一个儿子它的身份证是10000。结合上面就能找到最后哪个人就是:上面的MyLabel
        auto MyLabel=(Label*)this->getChildByName("bg")->getChildByTag(10000);
//        重新设置显示文字
        MyLabel->setString("请删除我们的\n英雄");
    }else{
//        打一个log出来可以在控制台看见
        log("这个Node已存在,无需重复添加");
    }
  
}

void LessonOneScene::menuRemoveCallback(cocos2d::Ref *pSender){
    
//  只要我们的容器不为空,我们就继续执行
    if (HeroNode !=nullptr) {
//        我们并没有主动去删除男女主角,而是通过删除它的父节点,也就是主角的容器。
        HeroNode->removeFromParentAndCleanup(true);
        HeroNode=nullptr;
        auto MyLabel=(Label*)this->getChildByName("bg")->getChildByTag(10000);
//        再次更改它的文字
        MyLabel->setString("请添加我们的\n英雄");
    }else{
        log("这个Node删除,无需重复删除");
    }
}








资源下载地址: http://pan.baidu.com/s/1gdvTiTX

Monkey们下次见吧!!!!最近一直在干项目。。。心好塞。。。

猜你在找的Cocos2d-x相关文章