一.Cocos2d-x引擎特性

现代化的 C++ API
立足于 C++ 同时支持 JavaScript/Lua 作为开发语言
可以跨平台部署, 支持 iOS、Android、Windows、macOS 和 Linux
可以在 PC 端完成游戏的测试,最终发布到移动端
完善的游戏功能支持,包含精灵、动作、动画、粒子特效、场景转换、事件、文件 IO、数据持久化、骨骼动画、3D


二.环境配置

要求:
Windows 7+,
VS 2015+
python2.7

JDK
SDK
NDK(可选)


三.cocos命令配置

1.cocos命令配置

Cocos2d-x 带有一个命令行工具:cocos 这是一个跨平台的工具,你可以用它创建项目、运行项目、发布项目。命令行工具适用于所有 Cocos2d-x 支持的平台,包括:iOS、Android、Mac、Linux、Windows、Web。不用 IDE,只用命令行,你就能完成所有的工作!

1.行引擎源码根目录的 setup.py
python setup.py

2.测试

cocos -v
Python 2.7.10
cocos2d-x-3.16
Cocos Console 2.3

2.cocos命令使用

  • 1.项目创建

cocos new MyGame -p com.MyCompany.MyGame -l cpp -d ~/MyCompany

  • 2.项目编译(程序从源码到二进制程序,有一个编译环节)

cocos compile . -p android -m release

  • 3.项目运行

cocos run . -p android -m release

  • 4.项目发布

cocos deploy -s c:\MyCompany\MyGame -p android -m release


四.日志输出

log("This would be outputted to the console");string s = "My variable";
log("string is %s", s);double dd = 42;
log("double is %f", dd);int i = 6;
log("integer is %d", i);float f = 2.0f;
log("float is %f", f);

五.基本功能

1.Director导演

Cocos2d-x 使用导演的概念,Director 任务是控制场景替换和转换。
Director是一个共享的单例对象,可以在代码中的任何地方调用。

2.Scene场景

场景(Scene) 是一个容器,容纳游戏中的各个元素,如精灵,标签,节点对象。它负责着游戏的运行逻辑,以帧为单位渲染内容。
1.场景创建

class MyScene : public cocos2d::Scene
{
public:static cocos2d::Scene* createScene();virtual bool init();// 实现crete静态方法CREATE_FUNC(StartScene);
};//创建
auto myScene = MyScene ::create();

2.场景切换

//加载第一个场景
Director::getInstance()->runWithScene(myScene);//切换场景
Director::getInstance()->replaceScene(myScene);//叠加场景
Director::getInstance()->pushScene(myScene);//释放场景
Director::getInstance()->popScene(myScene);

场景图
场景图(Scene Graph)是一种安排场景内对象的数据结构,它把场景内所有的 节点(Node) 都包含在一个 树(tree) 上。
Cocos2d-x 使用 中序遍历,先遍历左子树,然后根节点,最后是右子树。中序遍历下图的节点,能得到 A, B, C, D, E, F, G, H, I 这样的序列。

3.Layer层

Layer代表层,一般常做Scene的子容器,可以添加Sprite,相当于精灵的面板容器。

4.Sprite精灵

精灵是您在屏幕上移动的对象,它能被控制;

可以使用一张图像来创建精灵,PNG, JPEG, TIFF, WebP, 这几个格式都可以。当然也可以是图集

使用图片

auto mySprite = Sprite::create("mysprite.png");

使用图集

1.创建图集
Texture Packer工具创建并导出plist+png图集

2.加载图集

auto spritecache = SpriteFrameCache::getInstance();
spritecache->addSpriteFramesWithFile("sprites.plist");

3.创建精灵

auto mysprite = Sprite::createWithSpriteFrameName("mysprite.png");

精灵的控制

1.锚点
mySprite->setAnchorPoint(0.5, 0.5);
2.位置
mySprite->setPosition(Vec2(100, 200));
3.旋转
mySprite->setRotation(20.0f);
4.缩放
mySprite->setScale(2.0);
mySprite->setScaleX(2.0);
mySprite->setScaleY(2.0);
5.倾斜
mySprite->setSkewX(20.0f);//水平倾斜
mySprite->setSkewY(20.0f);//数直倾斜
6.颜色
mySprite->setColor(Color3B::WHITE);
mySprite->setColor(Color3B(255, 255, 255));
7.透明度
mySprite->setOpacity(30);

5.Action动作

动作(Action)通过改变一个 Node 对象的属性,让它表现出某种动作。动作对象能实时的改变 Node 的属性,任何一个对象只要它是 Node 的子类都能被改变。
1.单一动作

//从当前位置到目标位置
auto moveTo = MoveTo::create(2, Vec2(50, 10));
mySprite1->runAction(moveTo);
//从目标位置到当前位置
auto moveBy = MoveBy::create(2, Vec2(20,0));
mySprite2->runAction(moveBy);

2.动作序列和并列
还可以创建一个动作 序列(Sequence) 和Swan(并列)

auto mySprite = Node::create();auto moveTo1 = MoveTo::create(2, Vec2(50,10));
auto moveBy1 = MoveBy::create(2, Vec2(100,10));
auto moveTo2 = MoveTo::create(2, Vec2(150,10));mySprite->runAction(Sequence::create(moveTo1, moveBy1,moveTo2, nullptr));
//或者
mySprite->runAction(Spawn::create(moveTo1, moveBy1, moveTo2, nullptr));

六.UI组件

UI 代表用户界面,是 User Interface 的缩写,界面组件有标签,按钮,菜单,滑动条等

1.标签(Label)

//BMFont
auto myLabel = Label::createWithBMFont("bitmapRed.fnt", "Your Text");
//TTF
auto myLabel = Label::createWithTTF("Your Text", "Marker Felt.ttf", 24);
//SystemFont
auto myLabel = Label::createWithSystemFont("My Label Text", "Arial", 16);
//阴影效果
myLabel->enableShadow();
//描边效果
myLabel->enableOutline(Color4B::WHITE, 1));
//发光效果
myLabel->enableGlow(Color4B::YELLOW);

2.菜单(Menu)

//图片菜单
auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));//文字菜单
auto startItem = MenuItemText::create("StartGame",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));//menu总菜单
auto menu = Menu::create(startItem, closeItem, NULL);
this->addChild(menu, 1);//Lambda写法
auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png",
[&](Ref* sender){// your code here
});

3.按钮(Button)

#include "ui/CocosGUI.h"。
auto button = Button::create("normal_image.png", "selected_image.png", "disabled_image.png");
button->setTitleText("Button Text");
button->addTouchEventListener([&](Ref* sender, Widget::TouchEventType type){switch (type){case ui::Widget::TouchEventType::BEGAN:break;case ui::Widget::TouchEventType::ENDED:std::cout << "Button 1 clicked" << std::endl;break;default:break;}
});

4.复选框(CheckBox)(Toggle开关)

#include "ui/CocosGUI.h"auto checkbox = CheckBox::create("check_box_normal.png","check_box_normal_press.png","check_box_active.png","check_box_normal_disable.png","check_box_active_disable.png");checkbox->addTouchEventListener([&](Ref* sender, Widget::TouchEventType type){switch (type){case ui::Widget::TouchEventType::BEGAN:break;case ui::Widget::TouchEventType::ENDED:std::cout << "checkbox 1 clicked" << std::endl;break;default:break;}
});this->addChild(checkbox);

5.进度条(LoadingBar)

#include "ui/CocosGUI.h"
//创建进度条
auto loadingBar = LoadingBar::create("LoadingBarFile.png");
loadingBar->setDirection(LoadingBar::Direction::RIGHT);
//设置进度
loadingBar->setPercent(25);
//add节点
this->addChild(loadingBar);

6.文本框(TextField)

#include "ui/CocosGUI.h"auto textField = TextField::create("","Arial",30);
textField->addTouchEventListener([&](Ref* sender, Widget::TouchEventType type){std::cout << "editing a TextField" << std::endl;
});this->addChild(textField);

七.监听事件

1.五种类型

EventListenerTouch - 响应触摸事件EventListenerKeyboard - 响应键盘事件EventListenerAcceleration - 响应加速度事件EventListenMouse - 响应鼠标事件EventListenerCustom - 响应自定义事件

2.事件的吞没(可做遮罩)

listener1->setSwallowTouches(true);
listener1->onTouchBegan = [](Touch* touch, Event* event){// your codereturn true;
};

3.触摸事件

让我们先了解一下什么是触摸事件,当你触摸移动设备的屏幕时,设备感受到被触摸,了解到被触摸的位置,同时取得触摸到的内容,然后你的触摸被回答。 这就是触摸事件。

//创建触摸
auto listener1 = EventListenerTouchOneByOne::create();
// 触摸开始
listener1->onTouchBegan = [](Touch* touch, Event* event){// your codeVec2 point = touch->getLocation();//获取点击位置return true; // if you are consuming it
};
// 触摸滑动
listener1->onTouchMoved = [](Touch* touch, Event* event){// your code
};
// 触摸结束
listener1->onTouchEnded = [=](Touch* touch, Event* event){// your code
};
// 添加监听(最重要的一步)
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, this);

4.鼠标事件

创建鼠标事件监听器:

//创建事件
_mouseListener = EventListenerMouse::create();
//设置不同监听
_mouseListener->onMouseMove = CC_CALLBACK_1(MouseTest::onMouseMove, this);
_mouseListener->onMouseUp = CC_CALLBACK_1(MouseTest::onMouseUp, this);
_mouseListener->onMouseDown = CC_CALLBACK_1(MouseTest::onMouseDown, this);//绑定监听(最重要一步)
_eventDispatcher->addEventListenerWithSceneGraphPriority(_mouseListener, this);//回调函数实现(也可以用匿名函数/Lambda)
void MouseTest::onMouseDown(Event *event){EventMouse* em = (EventMouse*)event;em->getLocation();//获取鼠标位置
}
void MouseTest::onMouseUp(Event *event){}
void MouseTest::onMouseMove(Event *event){}

5.键盘事件

对于桌面游戏,一般需要通过键盘做一些游戏内的控制,这时你就需要监听键盘事件。

//创建事件
auto listener = EventListenerKeyboard::create();
listener->onKeyPressed = CC_CALLBACK_2(KeyboardTest::onKeyPressed, this);
listener->onKeyReleased = CC_CALLBACK_2(KeyboardTest::onKeyReleased, this);
//添加监听
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);//实现回调函数
void KeyboardTest::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event){}void KeyboardTest::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event){}

6.Update事件

如果需要持续的处理某个事件,那么可以开启一个update

//开启update
this->scheduleUpdate();
void Test::update(float delta)
{}

八.物理引擎

当你的需求很简单时,就不要使用物理引擎。比如只需要确定两个对象是否有碰撞,结合使用节点对象的 update 函数和 Rect 对象的 containsPoint(),intersectsRect() 方法可能就足够了。例如:

void update(float dt)
{auto p = touch->getLocation();auto rect1 = this->getBoundingBox();auto rect2 = this->getBoundingBox();if(rect1.containsPoint(p)){// do something, intersection}if(rect1.intersectsRect(rect2)){// do something, intersection}
}

1.刚体碰撞

如你要开发一个游戏,一个场景有 100 个精灵对象,需要判断它们互相是否有碰撞,如果使用上诉方法那将非常复杂,同时性能消耗还会严重影响 CPU 的使用率和游戏运行的帧率,这游戏根本没法玩。
这个时候就需要物理引擎了。

/*创建物理场景*/
auto scene = Scene::createWithPhysics();
//显示物理引擎调试界面 --- 有红框
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
//可把自己的类定义为Layer
auto layer = MyScene::create();
scene->addChild(layer);/*创建边框测试*/
//创建一个物理世界, 大小和屏幕的尺寸相同, 使用默认材质, debug框的宽度为3个像素
auto body = PhysicsBody::createEdgeBox(visibleSize, PHYSICSBODY_MATERIAL_DEFAULT, 3);
auto edgeShape = Node::create();//创建一个碰撞图形
edgeShape->setPhysicsBody(body);//将图形和刚刚创建的世界绑定
edgeShape->setPosition(visibleSize.width / 2, visibleSize.height / 2);//设置图形的位置在屏幕正中间
this->addChild(edgeShape);/*创建静态刚体精灵*/
auto sprite = Sprite::create("HelloWorld.png");
sprite->setPosition(center);
this->addChild(sprite);
//添加静态的刚体
auto physicsBody = PhysicsBody::createBox(sprite->getContentSize(),
PhysicsMaterial(0.1f, 1.0f, 0.0f));
physicsBody->setDynamic(false);
//设置碰撞层
physicsBody->setCategoryBitmask(8);//种类
physicsBody->setCollisionBitmask(16);//碰撞
physicsBody->setContactTestBitmask(16);//接触
//把刚体赋给精灵
sprite->addComponent(physicsBody);/*创建动态刚体精灵*/
auto sprite = Sprite::create("HelloWorld.png");
sprite->setPosition(center);
this->addChild(sprite);
//添加静态的刚体
auto physicsBody = PhysicsBody::createBox(sprite->getContentSize(),
PhysicsMaterial(0.1f, 1.0f, 0.0f));
physicsBody->setGravityEnable(false);
//设置碰撞层
physicsBody->setCategoryBitmask(16);//种类
physicsBody->setCollisionBitmask(8);//碰撞
physicsBody->setContactTestBitmask(8);//接触
//把刚体赋给精灵
sprite->addComponent(physicsBody);/*添加碰撞事件*/
auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = [](PhysicsContact& contact) {log("OnCollision");//auto nodeA = contact.getShapeA()->getBody()->getNode();//auto nodeB = contact.getShapeB()->getBody()->getNode();return true;
};
//绑定监听事件
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);

2.查询

  • 1.点查询
  • 2.射线查询

九.音乐和音效

你的游戏肯定会需要音乐和音效!Cocos2d-x 提供了一个 SimpleAudioEngine 类支持游戏内的音乐和音效。它可以被用来增加背景音乐,控制游戏音效。
SimpleAudioEngine 是一个共享的单例对象,

#include "SimpleAudioEngine.h"
using namespace CocosDenshion;// 播放背景音乐
auto audio = SimpleAudioEngine::getInstance();
audio->playBackgroundMusic("mymusic.mp3", loop);
// 暂停/停止/恢复 背景音乐
audio->pauseBackgroundMusic();
audio->stopBackgroundMusic();
audio->resumeBackgroundMusic();//播放音效
audio->playEffect("myEffect.mp3", false, 1.0f, 1.0f, 1.0f);
// 暂停/停止/恢复 音效
audio->pauseEffect();audio->stopEffect();audio->resumeEffect();
// 暂停/停止/恢复 所有音效
audio->pauseAllEffects();audio->stopAllEffects();audio->resumeAllEffects();

Cocos2dx入门相关推荐

  1. 【cocos2d-x入门实战】微信飞机大战之一:搞个飞机来玩玩

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11650413 学习了一个阶段的cocos2d-x,发现用起来还是蛮顺手的.然 ...

  2. Cocos2d-x入门(计算机游戏开发课程笔记)

    Cocos2d-x入门(计算机游戏开发课程笔记) 文章目录 Cocos2d-x入门(计算机游戏开发课程笔记) 一. 环境搭建 1. 查看版本 2. 创建项目 二. 基础架构 1.命名空间 2. 程序入 ...

  3. 【cocos2d-x入门实战】微信飞机大战之十四:背景音乐和音效

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12117827 整个游戏完成了,可以痛快的在电脑上打飞机了!可是感觉少了点什么 ...

  4. cocos2dx入门1:关于Cocos Creator

    以上所有教程均为cocos creator3.0的介绍. ※关于 Cocos Creator的诸多问题※ ①Q:Cocos Creator 是游戏引擎吗? A:它是一个完整的游戏开发解决方案,包含了轻 ...

  5. 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12082043 游戏是实现了,但是如果有个欢迎界面和一个结束界面就更好了. 欢 ...

  6. Cocos2D-x 入门(1)

    Cocos2D-x 是什么? 它是全球公认最好用的2D游戏应用开发引擎 :「保卫萝卜」.「捕鱼达人」.「找你妹」.「一个都不能死 」都是它搞出来的.它免费.开源.跨平台,不但好用,而且易学, 当前最流 ...

  7. cocos2dx入门篇(一)

    一.环境配置 我使用的cocos2dx环境配置如下: 1.cocos2dx 2.2.6 2.python 2.7.18 3.visual studio 2010 如果懒得去找这些资源,也可通过下方链接 ...

  8. cocos2d-x入门学习(五)跨版本代码移植实例之【梦幻连连看】

    <梦幻连连看>源代码来自原作者kuloveyouwei,他的版本是cocos2d-x 2.1.2, 他在博客中详细解读了源代码,其博客地址http://  blog.csdn.net/ku ...

  9. 【cocos2d-x入门实战】微信飞机大战之十一:游戏暂停和触摸屏蔽

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11999229 一个游戏打到一半尿点咋整?难道要憋着...这不科学啊! 好吧, ...

  10. 【cocos2d-x入门实战】微信飞机大战之八:自定义敌机精灵

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11890969 发现CSDN上传的gif图不能动...有招没? 飞机可以控制飞 ...

最新文章

  1. 模型数据的保存和读取
  2. 乌鲁木齐计算机老师待遇,如果月薪超过10000元,安排去新疆当教学教师,愿意吗?...
  3. vs2012搭建gtest环境
  4. emacs 替换模式_如何使用Emacs Org模式撰写博客
  5. 设计模式的一些小整理
  6. x264编码指南——码率控制
  7. Security+ 学习笔记19 密码学应用
  8. Tapestry5.3使用总结
  9. 伟豪带你逛郑州商业技师学院⑨:电气工程系
  10. ffmpeg和JavaCV
  11. HFSS(ANSYS Electronics)仿真2.45GHz矩形微带天线
  12. mybatis事务处理
  13. 10台堆垛机同时启动的那一刹那!
  14. Nuscenes 完整版数据集批量下载
  15. 里氏代换和依赖倒转原则(二)
  16. 学人工智能需要什么基础?
  17. (找规律)3,5,7,2,4,11,7,5,29,23,? 填什么数字
  18. mysql_store_result和mysql_use_result的区别
  19. Office2010 下载
  20. 极大规模整车气动数值模拟——构筑数字风洞基础框架

热门文章

  1. php lwm2m,理解COAP/LWM2M/MQTT协议和TCP/UDP协议的关系
  2. 国美金融贷款Kube-apiserver源码分析(国美金融贷款)
  3. dmg2iso使用及转换DMG文件遇到的问题
  4. python身份证号码计算年龄
  5. 小米手机文件 ftp服务器,小米手机与电脑FTP连接(不用每一次都输入ftp地址)...
  6. Java中this关键字详解
  7. 计算机网络自顶向下WireShark实验:IP
  8. log4cxx OutputDebugString DebugView dbgview
  9. STM32 串口通讯及实现
  10. 第七篇,STM32串口通信编程