【Cocos2d-x】开发基础-第一个Cocos2d-x游戏

本篇博客讲解:
1.第一个Cocos2d-x游戏

第一个Cocos2d-x游戏

创建工程

cocos工具:
就是这个,看图

命令工具cocos实现,cocos工具其实是cocos2d团队自己开发的。是使用Python脚本编写的,cocos工具的运行需要安装Python环境
(还会用到ant,eclipse等工具哦,后面介绍)
Python下载地址
https://www.python.org/
需要注意的是它目前有Python3和Python2可以下载,我们选择Python 2,不要下载3,因为2和3语法有很大差别,cocos这个工具是使用2编写的,如果你使用了3,会在脚本编译就出问题
(我的源代码中有window的Python安装包)
下载->安装->配置环境变量(Path中添加Python根目录)

点击确定设置好。

因为你还没有设置其他环境变量,所以你需要到此目录下:
cocos2d-x-3.13.1\tools\cocos2d-console\bin
直接输入cmd回车

或者shift鼠标右键打开命令窗口,都行

如果你不知道怎么用,直接输入cocos会有帮助

终端中执行如下指令:

cocos new -p com.uifuture -l cpp -d E://chxCocosWork HelloWord

com.uifuture是包名,最好是写上(可以不写),因为在安卓发布打包需要
cpp是语言,表示生成c++语言,还有lua,js
E://chxCocosWork 为生成目录
HelloWord为工程名

如果你生成过程有问题,或者无法找到cocos命令,有可能是你的Path没有加进去,或者你使用的Python版本是3.X。

也可以用这种写法

cocos new HelloWord -p
com.uifuture -l cpp -d E://chxCocosWork

工程文件结构

生成的目录结构是这样的:

Resources文件夹是资源文件夹。
图片,声音,字体,字库等都在这个目录

Class目录是我们开发重点关注的文件夹,这里面都是cpp文件
其他的文件夹,基本都是和平台有关的

现在刚刚入门,我们不考虑平台移植的问题,现在只关心Class目录中文件的编写

打开目录proj.win32,使用VS打开项目。 (使用VS打开HelloWorld.sln即可)

还有一些其他的工程:

也就是说,HelloWord这个工程需要运行,需要依赖这些工程!
libcocos2d就是所有cocos2d的源码都是放在这个工程里面的,这个是和项目根目录cocos2d这个文件夹对应的

运行工程:(第一次编译可能需要较长时间)

左下角的一些数字,就是输出的帧;GL vwets就是绘制图形需要的顶点;GL calls 就是绘制的精灵的个数。右下角的按钮是菜单,你可以选择退出游戏

代码解释

我们看HelloWordScene.h

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();

    virtual bool init();

    // a selector callback
    void menuCloseCallback(cocos2d::Ref* pSender);

    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

里面定义了一个类HelloWorld,继承了cocos2d::Layer(层)
虽然文件名叫HelloWordScene,Scene是场景,但是实际上里面的类是HelloWorld,实际上是层
创建层的同时会先创建层所在的场景,层是要放在场景里面的。

AppDelegate是一个应用程序委托对象,如果懂ios开发的,应该会对这个比较熟悉。
它的作用就是,应用程序启动的时候会调用它。

#ifndef  _APP_DELEGATE_H_
#define  _APP_DELEGATE_H_

#include "cocos2d.h"

/**
@brief    The cocos2d Application.

Private inheritance here hides part of interface from Director.
*/
class  AppDelegate : private cocos2d::Application
{
public:
    AppDelegate();
    virtual ~AppDelegate();

    virtual void initGLContextAttrs();

    /**
    @brief    Implement Director and Scene init code here.
    @return true    Initialize success, app continue.
    @return false   Initialize failed, app terminate.
    */
    virtual bool applicationDidFinishLaunching();

    /**
    @brief  Called when the application moves to the background
    @param  the pointer of the application
    */
    virtual void applicationDidEnterBackground();

    /**
    @brief  Called when the application reenters the foreground
    @param  the pointer of the application
    */
    virtual void applicationWillEnterForeground();
};

#endif // _APP_DELEGATE_H_

applicationDidFinishLaunching 这个函数是在程序启动的时候会调用它,也就是在游戏启动的时候调用,一般进行游戏的初始化,比如游戏的导演啊,场景啊等在这里进行初始化。
applicationDidEnterBackground 是退到后台,就是点击home键,回到桌面。接电话或者跳到另一个应用程序去,都会调用这个函数。
applicationWillEnterForeground 是从后台重新回到前台,也就是从手机任务栏重新回到游戏,会调用这个函数
以上三个函数是和游戏的生命周期有关系的。
HelloWorldScene.cpp

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    // 创建场景对象
    auto scene = Scene::create();

    // 创建层对象
    auto layer = HelloWorld::create();

    // 把层放到场景里
    scene->addChild(layer);

    // 返回这个场景
    return scene;
}

// on "init" you need to initialize your instance
// 初始化当前这个层
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }

    auto 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.

    // 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...

    //标签 也就是中间显示的那个文字  以及加载字体
    auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);

    //指定标签的位置
    label->setPosition(Vec2(origin.x + visibleSize.width/2,
                            origin.y + visibleSize.height - label->getContentSize().height));

    //把标签加入到层中
    this->addChild(label, 1);

    //指定一个图片的精灵
    auto sprite = Sprite::create("HelloWorld.png");

    // 设置图片精灵的位置
    sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

    //把图片精灵加入到层中
    this->addChild(sprite, 0);

    return true;
}

//点击close菜单项来回调的
void HelloWorld::menuCloseCallback(Ref* pSender)
{
    //Close the cocos2d-x game scene and quit the application
    Director::getInstance()->end();

    //条件编译 ,也就是满足条件就编译过去,如果不满足,就相当于注释了
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif

    /*To navigate back to native iOS screen(if present) without quitting the application  ,do not use Director::getInstance()->end() and exit(0) as given above,instead trigger a custom event created in RootViewController.mm as below*/

    //EventCustom customEndEvent("game_scene_close_event");
    //_eventDispatcher->dispatchEvent(&customEndEvent);
}

这样我们就得到一个能执行的HelloWord程序啦

因为cocos2dx项目工程太大,只上传Classes一些cpp文件啦,你可以手动把代码加入到你的cocos2dx项目工程中。

源代码下载地址:

GITHUB源码下载地址:点我进行下载

本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。

转载请注明出处:http://chenhaoxiang.cn

本文源自人生之旅_谙忆的博客

时间: 2024-10-24 02:52:54

【Cocos2d-x】开发基础-第一个Cocos2d-x游戏的相关文章

【IOS-COCOS2D游戏开发之一】搭建COCOS2D游戏引擎环境HELLOWORLD!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/415.html 最近几天仔细了解了iOS游戏开发引擎,常用的cocos2d,Unity引擎,那么Unity是非免费的,而cocos2d则是免费开源的: 最后促使我选择cocos2d的原因有两点: 1.最重要的原因是它对应的开发工具,尤其是 "ParticleDesigner",粒子系统编辑器,非常的喜

【IOS-COCOS2D游戏开发之七】在COCOS2D中添加/删除系统组件,并解决VIEW设置透明会影响VIEW中的其他组件的问题!【11月28日更新解决添加组件COCOS2D动画停止播放的BUG】

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/455.html 11月28日:-----------      有的童鞋说添加嘞组件(UIScrollView)后操作组件时Cocos2d的动画停止不懂嘞,我测试下,果然是,下面是解决方法: 首先大家在项目中搜索:CCDirectorIOS,找到CCDirectorIOS.m类,然后找到如下代码: 1 2 3

编译出错-新建第一个cocos2d项目出错

问题描述 新建第一个cocos2d项目出错 使用的是vs2013ide,创建项目没有问题,但是编译出现了上面问题,还望大神指点迷津啊! 解决方案 #include <algorithm> 解决方案二: 恩恩,已经解决!谢谢!!

如何在Cocos2D 1.0 中掩饰一个精灵(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原帖来自Ray Wunderlich写的精彩的文章 How To Mask a Sprite with Cocos2D 1.0,地址在: http://www.raywenderlich.com/4421/how-to-mask-a-sprite-with-cocos2d-1-0 有时在你的游戏中,你可能需要找到便利的方法去显示精灵的一部分. 一种办法是使用第二

【COCOS2DX-LUA 脚本开发之一】LUA语言基础在COCOS2DX游戏中使用LUA脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/681.html 对于游戏公司而言,采用游戏脚本lua.python等进行开发也很常见,但是很多童鞋对脚本并没有很熟悉的概念,本篇则向大家简单介绍脚本的用途以及在Cocos2dx基础用法: Lua和python这些详细介绍的话,请不太熟悉的童鞋自行百度百科哈,那么对于lua和python则是两个常用的脚本语言,

【Cocos2d-x】开发基础-Cocos简介与环境搭建

本篇博客讲解: Cocos2d-x介绍与环境搭建 1.移动平台游戏引擎介绍 2.Cocos2d家谱介绍 3.Cocos2d-x设计目标 4.在Windows平台下开始开发Cocos2d-x游戏 移动平台游戏引擎介绍 游戏引擎的定义 游戏引擎包含以下子系统 移动平台游戏引擎中主要可以分为 2D引擎主要有 3D引擎主要有 HTML 5的游戏引擎 Cocos2d家谱介绍 Cocos2d-x设计目标 Cocos2d-x目标 Cocos2d-x绑定Javascript和Lua脚本 在Windows平台下开

ASP.NET控件开发基础(22)

上两篇讨论了如何定义结合数据源控件的数据绑定控件.这次我们一起来看下数据源控件是如何实现的.asp.net2.0已经为我们提供了很多数据源控件,相信大家都用过了,也希望大家对其有所熟悉.关于它能做什么就不说了.下面我们也一起来看看,如何简单的实现. 一.你必须了解的 1.关于数据源控件(DataSourceControl) 虽然表面看来,给数据绑定控件指定DataSourceID属性,数据源控件帮你做了一切工作,其实不然,数据源控件只负责收集与数据交互的相关信息,如:SqlDataSource的

ASP.NET控件开发基础(19)

上两篇讨论了基本数据绑定控件的实现步骤,基本上我们按着步骤来就可以做出简单的数据绑定控件了.过年前在看DataGrid的实现,本来想写这个的,但2.0出了GridView了,再说表格控件实现比较复杂,所以先放着.我们一起打开MSDN来看点别的,当然主题还是离不开数据绑定控件. 一.数据绑定控件的模板 打开MSDN一看,我们会发现DataList和DataGrid都不是直接继承自WebControl类的,而是继承自一个叫BaseDataList的类.唯独Repeater是直接继承自WebContr

ASP.NET控件开发基础(17)

本篇将开始介绍如自定义数据绑定控件,这里感谢很多人的支持,有你们的支持很高兴. 这里首先需要大家熟悉asp.net模板控件的使用,还有自定义模板控件.因为数据绑定控件多是基于模板控件的. 一.回顾 如果你使用过asp.net内置的数据控件(如DataList,Repeater),你一定会这么做 1.设置数据源 DataSource属性 2.调用数据绑定 DataBind方法 3.在控件的不同模板内使用绑定语法显示数据 这三步应该是必须要做的 其他更多的 你可能需要对绑定的数据进行统一的一些操作(