手机游戏引擎是cocos_怎么将cocos2dx换成cocos creator引擎 - CSDN
精华内容
参与话题
  • Cocos2d-android游戏引擎

    千次阅读 2016-11-18 10:44:08
    什么是游戏引擎游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而...

    什么是游戏引擎

    游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。

    Cocos2d家族

    cocos2d是一个开源的游戏开发框架,利用它可以非常容易的开发2D游戏。 包括以下成员

    • Cocos2d-x
    • Cocos2d-iphone
    • Cocos2d-android

    本质区别:开发的语言不一样:Cocos2d-x使用c++、Cocos2d-iphone使用Object-C;共同点:api名字基本一致

    我们为什么要使用cocos2d

    • 一款开源的,跨平台,轻量级的2D游戏引擎。
    • 性能良好
    • 广泛的社区支持
    • 拥护很多成功案例。比如捕鱼达人,三国塔防等
    • 使用MIT授权协议。可以自由使用,修改源码,不需要像GPL一样公开源码,可以商用

    架构

    cocos

    • 图形引擎Cocos2D Graphic
    • 声音引擎CocosDenshion
    • 物理引擎:Box2d、Chipmunk

    cocos

    架构说明

    • Cocos2D Graphic图形引擎
    • CocosDenshion Audio声音引擎
    • 物理引擎
      • Box2d
      • Chipmunk
    • Lua脚本库

    Box2D是一个用于模拟2D刚体物体的C++引擎。作者为Erin Catto。
    chipmunk本是一个独立的开源项目,用纯c编写

    Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。

    图形引擎Cocos2D Graphic

    CCDirector界面的统一管理者

    cocos

    图形引擎说明

    cocos

    • CCDirector(导演):引擎的控制者,控制场景的切换,游戏引擎属性的设置
    • CCScene (场景):场景类,例如游戏的闪屏,主菜单,游戏主界面等。
    • CCLayer(布景):图层类,每个图层都有自己的触发事件,该事件只能对其拥有的元素有效,而图层之上的元素所包含的元素,是不受其事件管理的
    • CCSprite(人物):精灵类,界面上显示的最小单元
    • CCNode:引擎中最重要的元素,所有可以被绘制的东西都是派生于此。它可以包含其它CCNode,可以执行定时器操作,可以执行CCAction。
    • CCAction(动作):动作类,如平移、缩放、旋转等动作

    CCDirector

    CCGLSurfaceView

    引擎中SurfaceView的子类,实现了SurfaceHolder.Callback接口,但并未实现Runnable接口。
    存在问题:
    1、绘制界面的线程是谁?
    2、该线程是如何启动的?

    CCDirector的作用

    界面的绘制工作是由GLThread来完成,而GLThread的开启是在CCDirector的attachInView方法中完成的。
    管理场景CCScene

    CCDirector,导演类,负责管理和切换场景。还负责初始化openGL各项参数。
    CCDirector引擎的控制者,控制场景的切换,游戏引擎属性的设置

    单例模式,sharedDirector()取得对象

    方法 功能描述
    sharedDirector() 获取CCDirector对象,单例模式
    attachInView() 连接OpenGL的SurfaceView
    runWithScene() 运行场景
    replaceScene() 替换场景
    setDeviceOrientation() 设置横屏竖屏
    setDisplayFPS(true) 显示fps帧率
    setAnimationInterval(1.0f / 60) 设置帧率,每秒刷新60次
    setScreenSize(480, 320) 设置屏幕分辨率,高于设置的分辨率时,引擎会自动适配
    resume() 进入运行状态
    pause() 暂停
    end() 结束


    public class MainActivity extends Activity {
    
        private CCDirector director;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            CCGLSurfaceView surfaceView=new CCGLSurfaceView(this);
    
            setContentView(surfaceView);
            //  程序只能有一个导演
            director = CCDirector.sharedDirector();
            director.attachInView(surfaceView);// 开启线程
    
            director.setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft);// 设置游戏方向 水平
            director.setDisplayFPS(true);//是否展示帧率
        //  director.setAnimationInterval(1.0f/30);// 锁定帧率  指定一个帧率  向下锁定 
            director.setScreenSize(480, 320);//设置屏幕的大小   可以自动屏幕适配 
    
            CCScene ccScene=CCScene.node();// 为了api 和cocos-iphone 一致 
            ccScene.addChild(new ActionLayer());//场景添加了图层 
            director.runWithScene(ccScene);//  运行场景
    
        }
        @Override
        protected void onResume() {
            super.onResume();
            director.resume();
        }
        @Override
        protected void onPause() {
            super.onPause();
            director.onPause();
            //director.pause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            director.end();// 游戏结束了
        }
    
    }
    

    FirstLayer

    public class FirstLayer extends CCLayer {
        private CCSprite ccSprite;
    
    
        public  FirstLayer() {
            setIsTouchEnabled(true);// 打开触摸事件开关
            init();
        }
        // 按下的事件 
        @Override
        public boolean ccTouchesBegan(MotionEvent event) {
            //  先把android坐标系中的点 转换成 cocos2d坐标系中的点
            CGPoint convertTouchToNodeSpace = this.convertTouchToNodeSpace(event);
            System.out.println("我被按下了");
            CGRect boundingBox = ccSprite.getBoundingBox(); // 获取精灵的矩形
            // 判断点是否在矩形之中 
            //  参数1  矩形  参数2 点 
            boolean containsPoint = CGRect.containsPoint(boundingBox, convertTouchToNodeSpace);
            if(containsPoint){
                ccSprite.setScale(ccSprite.getScale()+0.2);
            }else{
                ccSprite.setScale(ccSprite.getScale()-0.2);
            }
            //this.getChildByTag(10); 根据Tag标签 找对应的孩子
            return super.ccTouchesBegan(event);
        }
    
    
        private void init() {
            CCSprite bg = CCSprite.sprite("bbg_arena.jpg");
            bg.setAnchorPoint(0, 0);
            this.addChild(bg,0);  // 如果第二个参数越大  默认显示的越靠上面, 如果一样大  谁先添加谁显示在下面
    
    
            ccSprite = CCSprite.sprite("z_1_attack_01.png");
            ccSprite.setAnchorPoint(0,0);// 设置锚点
            ccSprite.setPosition(100, 100);//设置坐标
            ccSprite.setScale(1); // 设置缩放
            //ccSprite.setFlipY(true);// X水平翻转  Y垂直翻转
            //ccSprite.setOpacity(0);//设置不透明度 值越大 越不透明  0-255
            ccSprite.setVisible(true);// 设置不可显示
            //ccSprite.
            // 把精灵添加到图层上 
            this.addChild(ccSprite);
        //  this.addChild(ccSprite, z);  // 优先级 
            this.addChild(ccSprite, 1, 10);//  参数3 标签 
        }
    }

    ActionLayer

    public class ActionLayer extends CCLayer {
        public ActionLayer(){
            init();
        }
    
        private void init() {
        //  moveTo();
        //  moveBy();
        JumpBy();
            //scaleBy();
            //rotateBy();
            //rotateTo();
            //bezierBy();
            //fadeIn();
            //ease();  //和加速度有关系的动作
            //tint();
            //blink();
        }
    
        private void blink() {
            // 三秒钟闪烁3次
            CCBlink blink=CCBlink.action(3, 3);
            getSprite().runAction(blink);
        }
    
        private void tint() {
            // 专门显示文字的精灵 
            //  参数1  显示的内容 参数2 字体的样式  3 字体的大小
            CCLabel label=CCLabel.labelWithString("那些年,我们在黑马的苦逼日子", "hkbd.ttf", 24);
            label.setColor(ccc3(50, 0, 255));
            label.setPosition(200,200);
            this.addChild(label);
    
            ccColor3B c=ccc3(100, 255, -100);
            // 参数1 时间 参数2 变化后的颜色 
            CCTintBy by=CCTintBy.action(1, c);
            CCTintBy reverse = by.reverse();
            CCSequence actions = CCSequence.actions(by, reverse);
            CCRepeatForever forever=CCRepeatForever.action(actions);
            label.runAction(forever);
        }
    
        private void ease() {
            CCMoveTo ccMoveTo=CCMoveTo.action(10, CCNode.ccp(200, 0));
            CCEaseIn easeOut=CCEaseIn.action(ccMoveTo,9); // 让移动按照有一定加速度去移动
            getSprite().runAction(easeOut);
    
        }
    
        private void fadeIn() {
            CCFadeIn fadeIn=CCFadeIn.action(10);
            getSprite().runAction(fadeIn);
    
    
        }
    
        private void bezierBy() {
            CCBezierConfig c=new CCBezierConfig();
            c.controlPoint_1=ccp(0, 0);
            c.controlPoint_2=ccp(100, 100);
            c.endPosition=ccp(200, 0);
    
            CCBezierBy bezierBy=CCBezierBy.action(2, c);
            getSprite().runAction(bezierBy);
        }
    
        private void rotateTo() {
            CCSprite heart = getHeart();
            heart.setPosition(200, 100);
            CCRotateTo rotateTo=CCRotateTo.action(3, 240);  //偷懒的做法
            heart.runAction(rotateTo);
        }
    
        private void rotateBy() {
            // 参数2  旋转的角度
            CCRotateBy by=CCRotateBy.action(3, 240);
            getHeart().runAction(by);
        }
    
        private void scaleBy() {
            // 参数1 时间 参数2 缩放的比例
            CCScaleBy ccScaleBy=CCScaleBy.action(1f, 0.65f);   //基于锚点进行缩放
            CCScaleBy reverse = ccScaleBy.reverse();
            CCSequence sequence=CCSequence.actions(ccScaleBy, reverse);
            CCRepeatForever forever=CCRepeatForever.action(sequence);
            getHeart().runAction(forever);
        }
    
        private void JumpBy() {
            // 1 时间  单位秒 2 目的地   3 高出的高度  4 跳跃的次数
            CCJumpBy ccJumpBy=CCJumpBy.action(4, ccp(200, 100), 100, 2);
            CCRotateBy ccRotateBy=CCRotateBy.action(2, 360);
            // 并行动作
            CCSpawn ccSpawn=CCSpawn.actions(ccJumpBy, ccRotateBy);//并行起来了   跳跃的过程中伴随着旋转
    
            //CCJumpBy reverse = ccJumpBy.reverse();
            CCSequence sequence=CCSequence.actions(ccSpawn, ccSpawn.reverse());// 跳上去 跳回来(伴随着旋转) 
            CCRepeatForever forever=CCRepeatForever.action(sequence);// 让串行动作 永不停止循环了
            CCSprite sprite = getSprite();
            sprite.setAnchorPoint(0.5f, 0.5f);  
            sprite.setPosition(50, 50);
            sprite.runAction(forever);
        }
    
        private void moveBy() {
            CCSprite sprite = getSprite();
            sprite.setPosition(0, 100);
            // 参数1  移动的时间 单位秒  参数2  坐标的改变  
            CCMoveBy ccMoveBy=CCMoveBy.action(2, CCNode.ccp(200, 0)); // 
            CCMoveBy reverse = ccMoveBy.reverse();
            CCSequence sequence=CCSequence.actions(ccMoveBy, reverse);//CCSequence 串行动作  
    
            sprite.runAction(sequence);
        }
    
        public void moveTo() {
            CCSprite sprite = getSprite();
    
            // 参数1  移动的时间 单位秒  参数2  移动的目的地
            CCMoveTo ccMoveTo=CCMoveTo.action(2, CCNode.ccp(200, 0));
            CCIntervalAction reverse = ccMoveTo.reverse();
            CCSequence sequence=CCSequence.actions(ccMoveTo, reverse);//CCSequence 串行动作  
            sprite.runAction(sequence);
        }
    
        public CCSprite getSprite() {
            CCSprite sprite=CCSprite.sprite("z_1_attack_01.png");
            sprite.setAnchorPoint(0,0);
    
            this.addChild(sprite);
            return sprite;
        }
    
        public CCSprite getHeart() {
            CCSprite sprite=CCSprite.sprite("heart.png");
            sprite.setPosition(100, 100);
            this.addChild(sprite);
            return sprite;
        }
    }

    CCAction

    对于一个游戏来说,动作是非常重要的,好的动作可以使游戏的可玩性大大提高,在cocos2d引擎中有一个动作类,CCAction是动作类的基类,动作是定义在节点(CCNode)上的,以节点为目标,主要分为两类瞬时动作和延时动作

    CCAction

    基本动作
    Cocos2d提供的基本动作:瞬时动作、延时动作、运作速度。

    1、瞬时动作:就是不需要时间,马上就完成的动作。瞬时动作的共同基类是 InstantAction。
    Cocos2d提供以下瞬时动作:

    放置 – Place
    效果类似于 node.Position = ccp(x, y)。之所以作为一个动作来实现是为了可以与其他动作形成一个连续动作。

    隐藏 – Hide
    效果类似于 [node setVisible:NO]. 之所以作为一个劢作来实现是为了可以与其他动作形成一个连续动作。

    显示 – Show
    效果类似于 [node setVisible:YES]. 之所以作为一个动作来实现是为了可以与其他动作形成一个连续动作。

    可见切换 – ToggleVisibility

    2.延时动作

    延时动作就是指动作的完成需要一定时间。因此actionWithDuration 是延时动作执行时的第一个参数,延时动作的共同基类是 CCIntervalAction(包含了组合动作类)。

    Cocos2d提供以下瞬时动作(函数命名规则是:XxxxTo: 意味着运动到指定的位置, XxxxBy:意味着运动到按照指定的 x、y 增量的位置。[x、y 可以是负值]):

    移动到 – CCMoveTo
    移动– CCMoveBy
    跳跃到 – CCJumpTo 设置终点位置和跳跃的高度和次数。
    跳跃 – CCJumpBy 设置终点位置和跳跃的高度和次数。
    贝塞尔 – CCBezierBy 支持 3 次贝塞尔曲线:P0-起点,P1-起点切线方向,P2-终点切线方向,P3-终点。
    放大到 – CCScaleTo 设置放大倍数,是浮点型。
    放大 – CCScaleBy
    旋转到 – CCRotateTo
    旋转 – CCRotateBy
    闪烁 – CCBlink 设定闪烁次数
    色调变化到 – CCTintTo
    色调变换 – CCTintBy
    变暗到 – CCFadeTo
    由无变亮 – CCFadeIn
    由亮变无 – CCFadeOut

    3.组合动作

    按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作。组合动作包括以下几类:
    序列 – CCSequence
    Sequence 的使用非常简单,该类也从 CCIntervalAction 派生,本身就可以被 CocosNode 对象执行。该类的作用就是线序排列若干个动作,然后按先后次序逐个执行。
    同步 – Spawn
    Spawn 的使用非常简单,该类也从 IntervalAction 派生,本身就可以被CocosNode 对象执行。该类的作用就是同时并列执行若干个动作,但要求动作都必须是可以同时执行的。比如:移动式翻转、变色、变大小等。
    需要特别注意的是,同步执行最后的完成时间由基本动作中用时最大者决定。
    重复有线次数 – Repeate
    重复有限次数的动作,该类也从 IntervalAction 派生,可以被 CocosNode 对象执行。
    反动作 – Reverse
    反动作就是反向(逆向)执行某个动作,支持针对动作序列的反动作序列。反动作不是一个专门的类,而是 CCFiniteAction 引入的一个接口。不是所有的类都支持反动作,XxxxTo 类通常不支持反动作,XxxxBy 类通常支持。
    动画 – Animation
    动画就是让精灵自身连续执行一段影像,形成模拟运动的效果:行走时的精灵状态、打斗时的状态等。
    无限重复 – RepeatForever
    RepeatForever 是从 Action 类直接派生的,因此无法参与序列和同步;自身也无法反向执行。该类的作用就是无限期执行某个动作或动作序列,直到被停止。

    4.速度变化

    基本动作和组合动作实现了针对精灵的各种运动、动画效果的改变,但这样的改变的速度是不变的,通过 CCEaseAction 为基类的类系和 CCSpped 类我们可以很方便的修改精灵执行劢作的速度:由快至慢还是由慢至快。
    EaseIn 由慢至快。
    EaseOut 由快至慢
    EaseInOut 由慢至快再由快至慢。
    EaseSineIn
    由慢至快。
    EaseSineOut 由快至慢
    EaseSineInOut 由慢至快再由快至慢。
    EaseExponentialIn 由慢至极快。
    EaseExponentialOut 由极快至慢。
    EaseExponentialInOut 由慢至极快再由极快至慢。
    Speed 人工设定速度,还可通过 SetSpeed 不断调整。
    5.扩展动作
    延时动作 – Delay ,比如在动作序列中增加一个时间间歇
    函数调用
    函数在动作序列中间或者结束调用某个函数,执行任何需要执行的任务:动作、状态修改等。id acf = [CCCallFunc actionWithTarget:self selector:@selector(CallBack1)];对应的函数为:- (void) CallBack1 {
    [sprite runAction:[CCTintBy actionWithDuration:0.5 red:255 green:0 blue:255]]; }
    带对象参数–调用自定义函数时,传递当前对象。id acf = [CallFuncN actionWithTarget:self selector:@selector(CallBack2:)];对应的自定义函数:(这里,我们直接使用了该对象)

    • (void) CallBack2:(id)sender {
      [sender runAction:[CCTintBy actionWithDuration:1 red:255 green:0 blue:255]]; }
      带 对象、数据参数–用自定义函数时,传递当前对象和一个常量(也可以是指针)。id acf = [CCCallFuncND actionWithTarget:self selector:@selector(CallBack3:data:) data:(void*)2];对应的自定义函数,我们使用了传递的对象和数据:
      -(void) CallBack3:(id)sender data:(void*)data {
      [sender runAction:[CCTintBy actionWithDuration:(NSInteger)data red:255 green:0 blue:255]]; }

    游戏地图制作

    工具: Tiled绘图工具
    图层:展示整体效果
    块层:依据块划分图片后,整张图片会变成一个块层
    块:块层中的一个单元
    对象层:单独一层,放置一些指定的对象

    地图制作,使用Tiled 制作地图。地图大小的宽度表示地图的一行有14 块组成,地图大小的高度表示地图一列有6 块组成,块大小的宽度表示每块的宽度为46px,块大小的高度表示每块的高度为53px。

    新建地图文件,如下图1,生成的地图如下图2

    游戏地图

    游戏地图

    接着将下图3中标红的图片拖入Tiled 的图层中。在下图4中直接点击确定

    这里写图片描述

    这里写图片描述

    在图2.5 中选择一块草地点击,将鼠标移动到新建的地图中点击鼠标左键安放草块,如图2.6。

    这里写图片描述

    这里写图片描述

    在图层中选择一块道路点击,如图2.7,将鼠标移动到新建的地图中点击鼠标左键安放道路,做出一条九曲十八弯的小路,如图2.8。

    这里写图片描述

    这里写图片描述

    设置拐点。先添加一个对象层,如图2.9。然后在工具栏点击添加对象,如图2.10,最后在地图上的拐点处单击鼠标左键,如图2.11。

    这里写图片描述

    这里写图片描述

    这里写图片描述

    步骤:
    1、新建地图,设置地图大小(以块为单位),设置块大小(以像素为单位)
    2、显示网格需要设置视图中的显示网格选项
    3、通过地图—新图块,来导入地图资源,从而利用工具进行地图的编辑
    4、对象层,通过在图层里右键添加。

    <?xml version="1.0" encoding="UTF-8"?>
    <map version="1.0" orientation="orthogonal" width="14" height="6" tilewidth="46" tileheight="54">
     <tileset firstgid="1" name="bk1" tilewidth="46" tileheight="54">
      <image source="bk1.jpg" width="678" height="320"/>
     </tileset>
     <layer name="block" width="14" height="6">
      <data encoding="base64" compression="zlib">
       eJwTY2BgECMDW6BhQuK4zCDEprY+YtxMyBx8GADLYgpH
      </data>
     </layer>
     <objectgroup name="road" width="14" height="6">
      <object x="22" y="80"/>
      <object x="160" y="82"/>
      <object x="161" y="244"/>
      <object x="299" y="243"/>
      <object x="298" y="82"/>
      <object x="436" y="83"/>
      <object x="436" y="246"/>
      <object x="620" y="246"/>
     </objectgroup>
    </map>
    

    生成的tmx文件说明:
    1、Image source属性中填写相对路径
    2、层和对象命名尽量使用英文
    3、关于对象层中信息,封装在objectgroup中
    4、objectgroup中信息按照操作顺序进行排列object

    游戏地图加载

    加载:CCTMXTiledMap.tiledMap(name);
    添加到当前显示层,存在问题:
    无法进行图片的移动
    用户的touch事件处理:
    setIsTouchEnabled(true);
    CCTMXTiledMap.touchMove(MotionEvent event, CCTMXTiledMap tiledMap);
    存在问题:地图移动
    获取图片大小,设置图片位置为宽高的一半
    设置锚点为0.5,0.5

    public class DemoLayer extends CCLayer {
        private CCTMXTiledMap map;
        private List<CGPoint> roadPoits;
    
        public DemoLayer() {
            this.setIsTouchEnabled(true);//打开触摸事件的开关
            init();
        }
    
        private void init() {
            // 加载地图
            loadMap();
            parserMap();
            loadParticle();
            loadZombies();
        }
    
        private void loadParticle() {
            system = CCParticleSnow.node();
            // 设置雪花的样式
            system.setTexture(CCTextureCache.sharedTextureCache().addImage("f.png"));
            this.addChild(system, 1);       
        }
    
        int position = 0;
        private CCSprite sprite;// 僵尸
        private CCParticleSystem system;
    
        // 展示僵尸
        private void loadZombies() {
            sprite = CCSprite.sprite("z_1_01.png");
            sprite.setPosition(roadPoits.get(0));
            sprite.setAnchorPoint(0.5f, 0); // 设置锚点在两腿之间
            sprite.setScale(0.65f);
            sprite.setFlipX(true); // 水平翻转
    
            map.addChild(sprite);// 通过地图去添加僵尸 // 地图随着手指移动,僵尸也会随着手指移动
    
            // 序列帧的播放
            ArrayList<CCSpriteFrame> frames = new ArrayList<CCSpriteFrame>();
            String format = "z_1_%02d.png";// 02d 占位符 可以表示两位的整数 如果不足两位前面用0补足
            for (int i = 1; i <= 7; i++) {
                CCSpriteFrame displayedFrame = CCSprite.sprite(
                        String.format(format, i)).displayedFrame();
                frames.add(displayedFrame);
            }
    
            // 配置序列帧的信息 参数1 动作的名字(给程序员看的) 参数2 每一帧播放的时间 单位秒 参数3 所有用到的帧
            CCAnimation anim = CCAnimation.animation("走路", 0.2f, frames);
            CCAnimate animate = CCAnimate.action(anim);
            // 序列帧动作默认是永不停止的循环
            CCRepeatForever forever = CCRepeatForever.action(animate);
            sprite.runAction(forever);
    
            moveToNext();
        }
        int speed=40;// 僵尸的速度
        public void moveToNext() {
            position++;
            if (position < roadPoits.size()) {
                CGPoint cgPoint = roadPoits.get(position);
                float t=CGPointUtil.distance(roadPoits.get(position-1), cgPoint)/speed;
                CCMoveTo moveTo = CCMoveTo.action(t, cgPoint);
                // 调用一个对象的某一个方法
                CCSequence ccSequence = CCSequence.actions(moveTo,
                        CCCallFunc.action(this, "moveToNext"));
                sprite.runAction(ccSequence);
    
            } else {
                //雪停下来
                system.stopSystem();// 停止粒子系统
                sprite.stopAllActions();//停止所有动作    
                //  跳舞 
                dance();
                SoundEngine engine=SoundEngine.sharedEngine();
                // 1 上下文 2. 音乐资源的id  3 是否循环播放
                engine.playSound(CCDirector.theApp, R.raw.psy, true);
            }
        }
    
    
    
        private void dance() {
            sprite.setAnchorPoint(0.5f, 0.5f);
            CCJumpBy ccJumpBy=CCJumpBy.action(2, ccp(-20,10), 10, 2);
            CCRotateBy by=CCRotateBy.action(1, 360);
            CCSpawn ccSpawn=CCSpawn.actions(ccJumpBy, by);
            CCSequence sequence=CCSequence.actions(ccSpawn, ccSpawn.reverse());
            CCRepeatForever forever=CCRepeatForever.action(sequence);
            sprite.runAction(forever);
        }
    
        // 解析地图
        private void parserMap() {
            roadPoits = new ArrayList<CGPoint>();
            // 解析地图
            CCTMXObjectGroup objectGroupNamed = map.objectGroupNamed("road");
            ArrayList<HashMap<String, String>> objects = objectGroupNamed.objects;
            for (HashMap<String, String> hashMap : objects) {
                int x = Integer.parseInt(hashMap.get("x"));
                int y = Integer.parseInt(hashMap.get("y"));
                CGPoint cgPoint = ccp(x, y);
                roadPoits.add(cgPoint);
            }
        }
        @Override
        public boolean ccTouchesMoved(MotionEvent event) {
            map.touchMove(event, map);// 地图会随着手指的移动而移动  如果该方法生效 必须保证地图的锚点在中间位置
            return super.ccTouchesMoved(event);
        }
    
        // 加载地图
        private void loadMap() {
            map = CCTMXTiledMap.tiledMap("map.tmx");
            map.setAnchorPoint(0.5f,0.5f);
            // 因为修改了锚点 ,所以坐标也是需要修改的
            map.setPosition(map.getContentSize().width/2,map.getContentSize().height/2);
            this.addChild(map);
        }
    
        @Override
        public boolean ccTouchesBegan(MotionEvent event) {
            this.onExit(); // 暂停
            this.getParent().addChild(new PauseLayer());// 让场景添加新的图层 
            return super.ccTouchesBegan(event);
        }
    
        // 专门用来暂停的图层
        private class PauseLayer extends CCLayer{
            private CCSprite heart;
            public PauseLayer(){
                this.setIsTouchEnabled(true);// 打开触摸事件的开关
                heart = CCSprite.sprite("heart.png");
                // 获取屏幕的尺寸
                CGSize winSize = CCDirector.sharedDirector().getWinSize();
                heart.setPosition(winSize.width/2, winSize.height/2);// 让图片再屏幕的中间
    
                this.addChild(heart);
            }
            // 当点击PauseLayer的时候 
            @Override
            public boolean ccTouchesBegan(MotionEvent event) {
                CGRect boundingBox = heart.getBoundingBox();
                //  把Android坐标系中的点 转换成Cocos2d坐标系中的点 
                CGPoint convertTouchToNodeSpace = this.convertTouchToNodeSpace(event);
                if(CGRect.containsPoint(boundingBox, convertTouchToNodeSpace)){// 确实点击了心
    
    
                    this.removeSelf();// 回收当前图层
                    DemoLayer.this.onEnter();//游戏继续
                }
    
                return super.ccTouchesBegan(event);
            }
        }
    }

    粒子系统

    什么是粒子系统

    粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现的真实感的 game physics。经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。

    粒子系统

    实现方式:

    使用代码设置参数
    导入属性列表文件的方式来配置所要添加的粒子系统。

    实现步骤:

    CCParticleSystem system= CCParticleSnow.node();
    system.setTexture(CCTextureCache.sharedTextureCache().addImage("f.png"));
    this.addChild(system, 1);

    自定义效果:

    制作工具ParticleDesigner,使用工具将效果导出成.plist文件

    CCParticleSystem ps=CCParticleSystemPoint.particleWithFile("f.plist");
    ps.setPosition(0,winSize.height);
    addChild(ps);
    

    CocosDenshion Audio声音引擎

    SoundEngine处理声音,内部封装的是MediaPlayer和SoundPool
    声音类型:音乐和音效
    可以从长短上来做区分,音乐一般用于游戏的背景声音,音效主要是短小的声音,如植物发射子弹,僵尸吃植物时发出的声音
    声音控制,如播放、暂停、声音大小调节、静音
    通过缓存音乐和音效文件来提高声音处理的效率

    SoundEngine engine=SoundEngine.sharedEngine();
    // 1 上下文 2. 音乐资源的id  3 是否循环播放
    engine.playSound(CCDirector.theApp, R.raw.psy, true);

    游戏暂停处理

    处理游戏暂停思路
    当前的主CCLayer处于暂停状态,处于暂停状态的CCLayer无法接收到用户的触摸事件
    在主CCLayer暂停之前需要启动另外一个CCLayer显示,除提示玩家游戏已经暂停外,如果玩家需要切换到游戏界面需要点击当前的CCLayer中的按钮完成继续游戏的处理。
    注意:
    1、该暂停用CCLayer必须添加到与主CCLayer相同的parent下,不能再主CCLayer继续添加
    2、点击完成时需要清除当前显示的CCLayer
    核心方法:onEnter()——游戏继续
    onExit——游戏暂停

    //处理游戏暂停
    //使用到的方法:CCLayer中的onEnter和onExit
    
    @Override
    public boolean ccTouchesEnded(MotionEvent event) {
    PauseLayer pauseLayer=new PauseLayer();
    this.getParent().addChild(pauseLayer);
    onExit();
    return super.ccTouchesEnded(event);
    }
    
    private class PauseLayer extends CCLayer
    {
    CCSprite sprite ;
    public PauseLayer() {
    setIsTouchEnabled(true);
    sprite = CCSprite.sprite("ZombiesWon.jpg");
    sprite.setScale(0.3);
    sprite.setPosition(240, 160);
    this.addChild(sprite);
    }
    @Override
    public boolean ccTouchesEnded(MotionEvent event) {
    if (isClick(event, sprite)) {
    MyDemoLayer.this.onEnter();
    this.removeSelf();
    }
    return true;
    }
    }
    
    protected boolean isClick(MotionEvent event,CCNode sprite)
    {
    CGPoint clickPoint = this.convertTouchToNodeSpace(event);
    return CGRect.containsPoint(sprite.getBoundingBox(), clickPoint);
    }
    
    
    展开全文
  • 李华明Himi 原创,转载务必在明显处注明:转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/415.html 最近几天仔细了解了iOS游戏开发引擎,常用的cocos2d,Unity引擎,那么Unity是非...

     李华明Himi 原创,转载务必在明显处注明:
    转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/415.html


           最近几天仔细了解了iOS游戏开发引擎,常用的cocos2d,Unity引擎,那么Unity是非免费的,而cocos2d则是免费开源的;

           最后促使我选择cocos2d的原因有两点:

           1.最重要的原因是它对应的开发工具,尤其是 “ParticleDesigner”,粒子系统编辑器,非常的喜欢(需付费$7.99美元),下载试用版操作了以下,没说的,狠给力;截图如下:(当时就掏出信用卡去购买,只是突然有点小意外,没买上,咳咳、以后再说)

           


           2.其cocos2d-x的跨平台挺看好,因为我也开发android系统,也清楚在android游戏引擎上cocos2d也有其对应的版本;这样一款引擎可以两平台都使用,何乐不为;


           本章节主要介绍cocos2D引擎的开发环境搭建:

          第一步:下载cocos2d-iphone最新版本;地址如下:http://code.google.com/p/cocos2d-iphone/downloads/list (当前最新1.0)

          第二步:下载完成之后解压到“文稿”中;(点击Finder-点击左侧的“文稿”);

          第三步:启动终端;(点击Finder-前往-实用工具-终端)

          第四步:先利用命令进入当前的 “cd documents” 进入Documents文件夹,然后“cd cocos2d-iphone-1.0.0” 进入cocos2d引擎文件夹,最后“./install-templates.sh -u”命令开始安装cocos2d,

          

           看到done,就表示完成啦,然后打开Xcode,新建一个项目;在左侧可以看到 "cocos2d 1.0.0",点击后,右侧就是基于cocos2d的框架啦,如下图:

        

      然后,我们创建一个cocos2d application ,直接build&run 运行,然后模拟器运行截图如下:

      


    ok,到处整个cocos2d引擎的开发环境和创建一个实例项目也正常运行,那么以后将会一直写关于基于cocos2d引擎的一些文章,希望大家多多指点;










    展开全文
  • 跨平台Cocos2d-Java游戏引擎以及配套的CocosEditor2.0游戏开发工具终于诞生了。使用Java语言来开发Cocos2d跨平台游戏, 和-lua,-js 的风格相近API,毋庸置疑,这确实是Cocos2d新的里程碑。欢迎来的Cocos2d-Java的...


    传送门


    CocosEditor官网:http://cocoseditor.com/

    引擎工具下载及配置:Cocos2d-Java游戏引擎和相关开发工具的安装配置




    前言


             跨平台Cocos2d-Java游戏引擎以及配套的CocosEditor2.0游戏开发工具终于诞生了。使用Java语言来开发Cocos2d跨平台游戏, 和-lua,-js 的风格相近API,毋庸置疑,这确实是Cocos2d新的里程碑。欢迎来的Cocos2d-Java的世界;






    全世界有多少 Java 开发者?


    Oracle 说世界上有900万 Java 程序员 ,Wikipedia说是1000万,而 NumberOf.net 的哥们儿说的很精确:世界上有九百万七千三百四十六个 Java 程序员。




    为什么封装Cocos2d-Java引擎


            一直以来,Java和C/C++,这两种语言PK的非常厉害,不管是语言排行榜还是程序员圈子,总少不了各种口水和争议;C/C++直接操控内存,确实高效无比,这也是很多游戏引擎选择C/C++的本质原因,也的确是明智的选择,Java这块是弱势;当然,也因为C/C++操控内存,导致了它的艰涩难学,想完全掌握,没有个几年内功还真办不到,所以不少童鞋望而生畏;而Java因为简单易学,灵活快速,广受程序员欢迎,有着大量的群众基础,另外,很多游戏需要快速开发移植发布,不能一味追求游戏高性能错过多变的市场,性能和敏捷开发需要找到两者的平衡点;这是我们封装Cocos2d-Java的基本原因;

            回首一年前,,团队正历经刺骨的冬季,开始尝试转型手游市场,首选是触控的cocos2d,因为团队技术偏于Java,所以没有选择使用C/C++开发的cocos2d-x,而是使用了Cocos2d-js。中途使用cocos2d-js没找到合适开发工具,于是团队自己制作了一套基于intellij idea上的插件开发工具,命名CocosEditor。陆陆续续,插件也有不少开发者在使用,反映还好;虽然使用JS开发一直也不错,但总是有些短板,而团队也一直放不下Java这块技术,于是尝试封装Cocos2d-Java。技术上主要依托还是cocos2d-x,只是多了一层jni封装,没很大的难处,主要在开发工具CocosEditor上费了不少时间。这是Cocos2d-Java诞生的基本经过;

           在制作Cocos2d-Java,我们内心充满了矛盾和挣扎,也满怀信心和梦想;Java在有着得天独厚的优势,可也有着不可避免的弱势,前辈中Cocos2d-Android逐渐变成鸡肋,市场上Java游戏引擎鲜有成功案例,这让我们感到特忧伤。可是我们又相信自己的技术,坚信这块市场的巨大召唤(千百万Java开发者),秉承着要在手游领域做点什么的梦想,所以也在坚定的走下去。



    Cocos2d简史


              2008年,早已萌生“一星期编写一个游戏”想法的Ricardo开发了cocos2d for Python,不久,苹果发布了iphone,也建立了app store,Ricardo抓住机会开发cocos2d for Objective-C,顺势而起,成为当红的手游引擎。2010年,正在搞操作系统技术的王哲大神开发了cocos2d-x,借助cocoachina社区和跨平台等无与伦比的优势迅速夺占市场,随后被触控收入麾下的Cocos2d-x团队也发布了cocos2d-lua和cocos2d-js,于此同时ShinyCocos(Ruby bindings)、Cocos2D-Android(Java based)、cocosNet(Mono based)也各处落地开花;到现在,2014年,占据头号交椅的还是触控的cocos2d-x。当然,2014年也迎来了跨平台Cocos2d-Java了。



    Cocos2d-Java介绍


    •  原理和性能:

              原理:和js-binding和lua-binding类似;采用jni方式封装java调取c++,所以一切的根基还是cocos2d-x;

              性能:移植到Android:比cocos2d-js高;移植到ios:和cocos2d-js一样


    • 为什么可以跨平台android和ios:

          移植到android,天然就是可以,这个不用多说。而能移植到ios,  因为ios本身没有java虚拟机, 我们自己修改了一个开源项目Avian(java虚拟机),该虚拟机打包在用户开发的ios游戏里面   所以成功实现cocos2d-java运行于ios系统;开发工具cocoseditor在你开发项目的编译完成后 会把所有java代码编译成ios可用的.a库,使用xcode导入该库和java虚拟机库 ,  移植很简便


    • CDK (Cocos2d-Java Develop Kit) 开发包:

         cdk是coos2d-java开发包,通过该开发包,可通过任何java开发工具(例如 eclipse)开发cocos2d-java游戏。当然在开发工具cocoseditor,它是已经内置的;

              bin目录  :里面存放了在电脑操作系统运行的java虚拟机,还有cocos2d-x的c++核心库都打在dll文件里面

              extreas目录:里面存放第三方库,包括广告、支付、分享等;

              lib目录:这里存放了和底层c++打交道的jni库,是整个cocos2d-java的核心所在



    • 引擎Api结构,基本遵从-x, -js的结构,包括Sprite ,Direction, Layer,event,particle,ui,audio等基本概念;右侧可以清晰的看到jni定义方式:public native static Sprite create(String fileName);



    • cocos2d-java代码风格。看到下面代码风格,功能是:新建一个精灵,设置相关属性,加入根节点,然后runAction。基本只要熟悉cocos2d的童鞋都可能很快入手;






    CocosEditor产品线


            我们团队是Jetbrains公司的粉丝,Jetbrains是一家位于捷克的工具开发商,旗下包括Intellij Idea 、WebStorm、PhpStorm、AppCode等优秀的工具 ,CocosEditor都是依托于他们的产品而来;

            CocosEditor基本产品线结构:一个引擎及三个工具
    • Cocos2d-Java跨平台引擎
    • 基于Intellij Idea终极版的插件:CocosEditor For  Cocos2d-JS
    • 基于Intellij Idea社区版的单独工具:CocosEditor For  Cocos2d-Java
    • 基于AppCode和CppIde的工具: CocosEditor For  Cocos2d-X  (计划中)
           



    CocosEditor2.0介绍(因Cocos2d-Java而生的开发工具


    • CocosEditor2.0工具简介
              cocoseditor2.0是基于Intellij Idea开放平台上进行定制而来的手机游戏开发工具,可运行在Window/Mac系统,1.x版本支持js和lua脚本语言。 2.x版本暂支持Java语言,所有游戏发布包可快速移植到Android和ios平台。 工具集合代码编辑,可见可得的场景设计,动画制作,字体设计,图片打包 、粒子编辑,物理系统,地图等功能,且调试方便,和实时模拟。如果有兴趣了解该工具源码,可直接查看intellij idea community源码,另外google的android studio也是源自于Intellij Idea开放平台


             

    • 基本特征:



     

    • 界面设计cce;总体上类似于android的xml界面设计,1 你可以通过拖动控件,可见即可得;2 你可以通过切换到Text目录,通过xml编写




    •  图片TexturePacker自动打包:1.x版本你需要手动导入图片进行TexturePacker,现在2.x版本通过识别便签.plist直接自动图片打包,省去不少功夫




    •  字体设计:通过截取图片获得图片字体



     

    • 物理系统:通过可视化shape编辑物理形状,这是2.x版本的特色。功能基本可用,但还存在一些改进的地方;




    • 代码编写和提示:intellij idea被成为业内最好的java开发工具,对于这句话,我表示非常赞同;cocoseditor继承了它的所有优点,代码提示,代码重构,代码审查等,这一块是开发者的福音




    • 模拟器和代码调试:windows和mac上通过cocosplayer实时模拟调试,这是开发游戏的标配。



     


    • 第三方sdk:内置丰富的第三方库,满足你大部分需要




    • 支持mac和windows双系统开发





    • 快速发布多平台:ios和Android

                        





    Cocos2d-Java开发的游戏


    基于cocos2d-java引擎的跳楼游戏 ,成功发布到app store和android市场,已验证其跨平台发布

    ~  ios

    下载链接:https://itunes.apple.com/us/app/jump-building/id890384335?mt=8


     

    ~ android

    下载链接:http://url.cn/Kv7q3X






    后记


      1   在此,提示一下,引擎和工具基本稳定可用,但不排除存在bug和小坑,如果你使用中遇到了,希望你可以向我们反馈,我们真诚感谢;

      2  cocos2d-java现在比较适合中小型游戏,大型游戏还没经过验证;另外引擎在热更新和增量是存在薄弱的,我们会不断的攻克技术难关;

      3  请放心使用,我们自己也在不断通过开发游戏让这套系统更稳定更好用;

      4  感谢cocos2d-x,intellij idea,avian等的开源项目,让我们可以站在巨人的肩膀上做一些有趣的事情;


      我们前行,只因为相信;





    展开全文
  • cocos2dx 是款很优秀的轻量级引擎,受游戏行业7成同行的拥护。而且完全开源,我是其中的受益者,我感恩 简单聊聊 cocos2dx 的几个版本,最开始的c++版本,之后的脚本版本 lua js html5 ,版本很多,所以引擎维护...

    cocos2dx 是款很优秀的轻量级引擎,受游戏行业7成同行的拥护。而且完全开源,我是其中的受益者,我感恩

    简单聊聊 cocos2dx 的几个版本,最开始的c++版本,之后的脚本版本 lua  js html5 ,版本很多,所以引擎维护成本高,难度大,从而造吐槽的 就像家常便饭。但是,大陆的手游行业没它还不行。

    cocos studio(ccs) 主要是打算将之前几种合成一种引擎,但是似乎项目搁浅了


    这里简单说说cocos creat(cc)

    为什么有这个设计,主要是处于触控的商业计划,去年(2015)中旬,cocos play 发布,今年的CC ,体现出了触控要向手机页游进军,而且是不遗余力,对于占有70%的份额的游戏市场,自然也会被带向手机页游。2016是手机页游的兴起年,2017是手机页游的鼎盛之年,你准备好了吗,这是谢男君的预测,就算测不准,同学们也不要打脸。


    大家都可以去看看这个视频,http://v.qq.com/page/c/6/6/c0181szoh66.html

    王哲,我很崇拜他,拍马屁就此打住。

    CC 出现解决了触控关于cocos2dx 包括studio所有棘手的问题,用户作为改变的只是从c++ 、lua 转向js

    我有时候担心js的性能,但是在网页上,才是js的天下。

    用过unity3d,都觉得组件化用起来bili bili的,从而吐槽cocos的涉及就是渣渣,现在CC也组件化了,相信用户份额会有所提高

    其余的我就不累赘了 ,大家可以看看这个帖子

    http://ol.tgbus.com/news/cyxw/201601/13772206.shtml

    以下是其内容,主要是方便比较懒的同学看的


      1月19日,由Cocos创始人王哲亲手撰写的一篇Cocos Creator新品发布稿件在朋友圈被行业人士疯狂转载,短短数小时阅读量突破五位数。Cocos Creator被誉为“注定将揭开Cocos开发世界中全新的一页”,究竟它有什么魅力?下面让我们来细细阅读这篇文章。

      Cocos Creator下载地址:cocos.com/creator/

      以下为全文:

      上周我在厦门的「哎哟,2016」酒会上,宣布了今年会发布一款新的编辑器。是的,今天我来了:

    新编辑器Cocos Creator发布:对不起我来晚了!

      Cocos Creator在经历了一年多的低调研发之后,今天终于发布了第一个正式对外的公测版,大家可以从 cocos.com/creator 下载。

      那么相比Cocos家族之前的编辑器产品,Creator有哪些不同呢?咱们先看一段视频,引擎开发团队全体出镜哦:

      http://v.qq.com/page/c/6/6/c0181szoh66.html

      产品定位

      如果今天让我重新设计一次游戏引擎,只考虑用户体验和开发效率,那么我希望这个引擎能:

      · 脚本化,我希望GC自动回收和手动回收都要有,这样易用性、性能保证两手抓两手都要硬。我再也不想看到恶心的retain / release了。C++是门好语言,但是考虑到开发效率,我更倾向于纯脚本;

      · 组件化,而不是面向对象继承的扩展方式。各位读者谁曾经直接在Node,甚至Object里面增加函数的请举手?不敢举手是吧,一定怕被你们CTO拍死?这就对了。以后请严格用组件化思路来扩展引擎,习惯后你就会觉得浑身每个毛孔都很爽,因为告别了恶心的hack代码;

      · 高效工作流,策划和美术能够通过引擎编辑器独立生产和调试,让程序员减轻资源管理更新上的负担,专注于功能开发,而不是参与「无尽」的调数值、调UI;

      · 高度可扩展,引擎框架和编辑器都需要灵活扩展,并且希望能通过统一的编辑环境整合各种自定义工作流和扩展工具。其实组件化和数据驱动都是为高度可扩展服务的;

      · 纯粹,专注,我希望仅用一门编程语言就可以完成所有工作。我说的「所有工作」包括游戏逻辑编码、引擎扩展、编辑器扩展。我讨厌的现状是:需要用C++扩展引擎框架、用Lua编写游戏逻辑、用C#扩展编辑器,很多端游时代过来的公司都是这么干的,但是成本太高了。我们需要仅一门编程语言就可以完成所有工作!

      · 广义多平台,不仅仅是原生的多平台。我希望可以一次开发后,将游戏一键发布到iOS, Android, Windows, HTML5以及Cocos Play平台,也就是兼容Native, HTML5, Runtime三种技术形态,哪里有用户,我就可以把游戏发布到哪里,最大化流量获取。

      Cocos Creator就是这样的一个产品,实现了我的所有希望与抱负。在Cocos Creator里,我们结合了以数据驱动和组件化为核心的游戏开发方式,并在此基础上无缝融合了Cocos引擎成熟的JavaScript API体系,一方面能够适应Cocos系列引擎开发者用户习惯,另一方面也为美术和策划人员提供前所未有的内容创作生产和即时预览测试环境。

      如果让我用一句话描述:

      Cocos Creator是以内容创作为核心的游戏开发工具,在Cocos2d-x的基础上实现了彻底脚本化、组件化和数据驱动等特点。

      嗯,上面这句话你在未来的几个月会听到耳朵长茧,因为这就是我和引擎团队对Cocos Creator产品的定位描述。

      来张靓照吧:

    新编辑器Cocos Creator发布:对不起我来晚了!

      所以,如果您正在考虑这些问题:

      · 希望能用更低成本、更高效率地开发出来一个基于cocos2d-x的游戏。特别是有cocos2d-js的使用经验;

      · 希望一次开发,可以把游戏同时发布到iOS和Android,以及新兴HTML5手机页游平台;

      · 希望程序和策划、美术的工作进行解耦,让策划和美术可以独立生产和调试;

      · 希望自己很容易对引擎的框架和编辑器进行定制、扩展;

      那么Cocos Creator是一个非常合适的选择。

      核心理念

      高效工作流

      引擎和编辑器的结合,带来的是数据驱动和组件化的功能开发方式,以及设计和程序两类人员的完美分工合作:

      · 设计师在场景编辑器中搭建场景的图像表现

      · 程序员开发可以挂载到场景任意物体上的功能组件

      · 设计师负责为需要展现特定行为的物体挂载组件,并通过调试改善各项参数

      · 程序员开发游戏所需要的数据结构和资源

      · 设计师通过图形化的界面配置好各项数据和资源

      就这样从简单到复杂,各种你能想像到的工作流程都可以实现。

      以工作流为核心的开发理念,让策划、美术、程序都能在工具里快速找到最大化自己战斗力的切入点,并能够默契流畅地和团队其他成员配合。

      所以,神马调UI调数值,策划美术可以自己妥妥搞定,老子准时下班泡妞去了。(各位程序员朋友,此处应有掌声)

      数据驱动

      这其中最实用的功能是,脚本中可以轻松声明可以在编辑器中随时调整的数据属性,对参数的调整可以由设计人员独立完成。也就是说你代码按照指定的格式声明变量,然后这个变量就可以在Cocos Creator编辑器里面暴露出来,让策划人员直接在编辑器里调整数值,直接看运行效果了。

      一体化,包含代码编辑器

      Cocos Creator包含游戏引擎、资源管理、场景编辑、游戏预览和发布等游戏开发所需的全套功能,并且将所有的功能和工具链都整合在了一个统一的应用程序里。它以数据驱动和组件化作为核心的游戏开发方式,并且在此基础上无缝融合了Cocos引擎成熟的JavaScript API 体系,能够一方面适应Cocos系列引擎开发者用户习惯,另一方面为美术和策划人员提供前所未有的内容创作生产和即时预览测试环境。 编辑器在提供强大完整工具链的同时,提供了开放式的插件架构,开发者能够用HTML + JavaScript等前端通用技术轻松扩展编辑器功能,定制个性化的工作流程。

      对于无数用户反复追问的Cocos IDE到哪里去了?我第一次开诚布公地说,很抱歉,不用等了,Code IDE项目已经终结了,不会再有更新。因为不论是Eclipse方案,还是IntelliJ IDEA方案,都无法彻底和Studio或Creator融合。但是作为一个未竟的夙愿,我和引擎团队在Cocos Creator补偿了这一点:Cocos Creator带有一个JavaScript的代码编辑器,编辑器不仅带有大家迫切需要的函数提示、自动补完等功能,而且和Cocos Creator的场景编辑器无缝衔接——这点是Code IDE做不到的。最后是依托于Chrome浏览器强大的JavaScript调试功能,我们可以在启动调试之后,很方便又流畅地调试脚本代码啦!

      要调试JavaScript脚本?从Cocos Creator里面一键启动Chrome立刻开始调试:

    新编辑器Cocos Creator发布:对不起我来晚了!

      附带一个好消息是,微软的VS Code开源项目,和Cocos Creator用的是同样的底层框架Electron,所以我们正在评估考虑如何复用VS Code这个大轮子,以快速提升Creator里的编码体验哦!

      大幅改进的UI 系统

      各位可能在上面的视频里面看到了新UI系统如何动态适配不同分辨率的情况。是的,我们改进了整个UI系统,也许改到你已经不太认识了,但事情的关键是:我们解决了多年以来积累的许多问题和需求。Creator里面的UI系统,支持智能画布适配和免编程元素对齐的UI,使之可以完美适配任意分辨率的设备屏幕。这点对于HTML5游戏特别重要,而原生游戏也能从中收益颇多。

      在Cocos Creator里面,UI编辑、动画编辑都整合在这样一个界面里:

    新编辑器Cocos Creator发布:对不起我来晚了!

      广义的多平台发布

      目前Cocos Creator支持发布游戏到传统的iOS, Android平台,以及新兴的HTML5手机页游平台上,特别是支持Cocos Play的runtime加速器。所以这里的多平台已经比之前cocos2d-x的多平台更广义了:横跨Native和HTML5。当然我们也不需要再和各平台的工程文件、晦涩的makefile打交道了,在纯脚本的世界里一切都变得简单,配置开发环境的要求已经被完全移除,在运行之后就可以立刻开始游戏内容创作或功能开发,是不是很简单?这就是我下很大决心做「彻底脚本化」的明显收益之一。

    新编辑器Cocos Creator发布:对不起我来晚了!

      完善的配套文档和社区支持

      文档,首先当然是文档。你可以从cocos.com/docs/creator获取产品的用户手册,而更简单的方式是直接从Creator的菜单里面点「文档」打开用户手册的离线版,离线版,离线版哦!

    新编辑器Cocos Creator发布:对不起我来晚了!

      在示例游戏方面,我们这次版本发布就带了4个游戏示例。其中一个21点扑克牌游戏还是和腾讯游戏合作开发的,美术资源全部由腾讯游戏授权。反正引擎团队这帮技术宅是画不出这种品质的游戏美术。再次特别感谢腾讯游戏对Cocos Creator的帮助与加持!

      除了文档和示例游戏之外,我们还录制了Cocos Creator的教学视频,你可以在离线文档里很容易找到。我们会陆续更新更多的教学视频放到文档里面。

      回答Cocos2d-x老用户关心的问题

      Cocos Creator和Cocos Studio的定位区别?

    新编辑器Cocos Creator发布:对不起我来晚了!

      我这人很诚恳,既然说到「产品定位」,那么我一定不会只说Cocos Creator的好处,这里我也要说说Creator不合适以下情况:

      · C++和Lua的死忠粉,希望学一门语言吃一辈子的程序员 —— 不适合。为了Cocos Creator的纯粹,我选择了JavaScript作为引擎、编辑器、游戏逻辑的核心语言。虽然从技术角度讲Creator也可以支持Lua和C++游戏,但是今天我仍然希望保持这个产品的「纯粹、专一」。所以不论你们怎么喷,在编程语言方面,我今天不打算妥协。别TMD和我吵,难道您不知道“PHP是全世界最好的语言”么?嘿嘿。至于为什么在Cocos Creator里面选择JavaScript,下文我会详细解释原因,请耐心往下看;

      · 对包体积「极端」敏感人群。以Android版的引擎runtime.so文件为例,v3.x版本的引擎上,Lua空包体积3.6M,JavaScript空包体积5.2M,所以JavaScript会比Lua大出1.6M,主要是因为JavaScript VM的体积要大一些。我们正在做各种包体压缩的工作,未来空包体积会进一步降低,但Lua始终会有1M左右的优势;

      · 希望用Cocos 3D的编辑器功能。目前Creator的研发进度还无法支撑3D编辑需求,支持3D和VR的时间点待定,不会很快,有这方面需求请选择Studio。

      所以,对于有上述需求的用户,可以继续使用Cocos Studio编辑器。Studio和Creator是两条平行的产品线,我打算平行地维持很长一段时间。

      为什么不Cocos Studio上实现这些功能?

      多种编程语言门槛使得Cocos Studio难以扩展。虽然我们在Studio里推出了自定义控件的扩展功能,但实际上由于引擎修改用C++,游戏逻辑编码用C++ / Lua / JavaScript三选一,编辑器扩展用C#或Lua,一般团队需要掌握三门编程语言才能完成Studio的扩展插件。所以实际使用中极少团队可以能够轻松 Studio做扩展插件。

      在Cocos Creator里面,「仅需要」一门JavaScript语言,就可以覆盖游戏逻辑编写、引擎框架扩展、编辑器扩展三个工作量最大的区域。如果配合node.js做服务端框架,那么只要掌握JavaScript就可以全盘通吃了。如果再从npm上捞一点方便使用的package,这日子可就滋润多了。

      为什么抛弃C++做彻底脚本化

      框架层面:我们尝试过在C++上实现组件式结构,结果引擎组的高手写出来的C++代码像极了STL库的风格,我觉得至少有1/3的Coocs引擎团队人员无法一眼看懂这些C++代码,更不用说各位用户了。如果我们硬要走C++这条路,最后会导致引擎框架代码难以理解和进行调试。如果我们非要发展现代游戏引擎的组件式结构,那么只能选择脚本化了。另外,脚本化的附带好处就是不需要处理各平台的工程文件和makefile。

      在编辑器层面,如果C++一条路走到黑的话,必然要选择用Qt来开发编辑器。但是C++在编辑器的缺点很明显,就是一定要通过编译才能够使用。这导致了两个结果:

      (1) 编辑器插件的分享者提供全部源码,让策划和美术人员自己编译去用;

      (2) 编辑器插件的分享者提供windows 32bit, windwos 64bit, mac 64bit, linux 32bit, linux 64bit, ios 64bit, android 32bit, android 64bit给策划和美术人员自行选择下载;

      上述两种情况,都不是策划和美术人员可以承受的。换成脚本就简单了:上传脚本(可开源、可混淆加密) -> 下载脚本 -> 解释运行。直接跳开了编译过程。

      但是脚本化并不是意味着整个引擎都用脚本来写。Cocos Creator的框架核心仍然是大家熟悉的整个Cocos 2d-x C++引擎,引擎的主循环和绝大多数计算工作都在C++层面完成。只是利用JavaScript bindings绑定出Cocos Creator的JavaScript API。所以大家无需担心性能问题。

      为什么在脚本里面选择JavaScript而不是Lua

      哈哈,这是个好问题,good question,pretty good!我知道一定会被国内无数的Lua程序员的口水淹死。首先声明,Cocos Creator的架构,完全可以支持在上面用Lua把所有工作全部重新实现一遍。仅仅是翻译和资源投入的问题。

      但是,我不打算这么做。

      我更希望「纯粹、专注」地先做好JavaScript,不承诺对Lua和C++的支持时间点。未来也许有1%的概率会改主意,但是今天我很坚决。有几个主要原因:

      1. 无数的大公司,包括Microsoft, Google, Apple, Facebook, Intel等都在大力投入JavaScript的研发上面,但Lua则没有这个生态。JavaScript领域,有node.js,有npm,这些Lua都没有;有Intel的nw.js(node-webkit),有Facebook的React,有Apple和Google鼎力支持的HTML5和WebGL,有Mozilla的asm.js,在桌面跨平台领域有Github的Electron和Atom,有Adobe的Brackets,而我们没有见到上述哪家大公司投入资源大把资源在Lua上,这-是-事-实。请各位老板深思为什么巨头们都做出这样的选择,或者你们觉得自己比这些大公司的决策者更聪明也无妨。

      2. JavaScript可以让游戏跨Native, Runtime, 纯HTML5三种模式,也就是我上文所说的「广义跨平台」,而Lua只能发布前两种。今天腾讯QQ浏览器、QQ空间、QQ游戏大厅已经都开放手机页游接入了,腾讯工作室的《欢乐斗地主》已经发布了基于Cocos Play加速器的手机页游版本。如果哪一天微信或手机QQ开放了 HTML5游戏领域,那时候再来Lua转JavaScript就已经来不及了,各位老板只能面壁哭去了。

      3. Cocos Creator底层选择了Github公司开发的开源项目Electron。而Eletron是Github官方的代码编辑器Atom,以及微软开源项目VS Code所用的底层基础。其实我们很有幸和国际巨头公司做出了同样的架构选择。如我前文所说,当然也不排除未来和VS Code合作、快速提高Creator开发体验的各种可能。

      引用我一个好友对Cocos Creator的评论:「有了这玩意儿我还管什么Lua啊,游戏公司要的就是降低开发成本,管它是什么编程语言」。恩,此人是Lua死忠粉,并且出过cocos2d-lua教程书籍。

      已有的cocos2d-html5, cocos2d-js项目可以平滑升级到Cocos Creator吗?

      抱歉不能。毕竟继承式和组件式是完全不同的两种设计思路,区别类似于蒸汽动力和电力时代一样巨大。Cocos Creator里面的框架API,和cocos2d-js API大概有80%是一致的,但是改动了其中的20%。如果您熟悉cocos2d-js api,那么您只需要几天的重新学习和适应,然后会发现开发速度越来越快。所以,无法「无缝」移植,您需要一些移植工作量。

      Cocos Creator开源吗?

      鉴于游戏引擎领域已经有诸多竞争对手,恕我无法将整个团队一年多心血的Cocos Creator100%开源。但是我始终不忘cocos2d-x开源社区的初衷,所以在Cocos Creator里面,得益于高度可扩展的架构设计,对于不涉及核心技术门槛的编辑器组件,我们全部开源奉献给行业。完全开源的部分包括:

      · 代码编辑器

      · Spine导入插件

      · Tilemap插件

      · 引擎框架部分,就是加入了entity-component结构的定制版cocos2d-x

      以上部分100%开源,这个列表后续还会持续增加。今天发布的是Cocos Creator v0.7,我们计划在春节后的2月份之内发布v1.0,然后在v1.0之后新开发的插件,都讲按照Cocos Creator标准插件扩展的开发方式进行,并开源。大家可以参照这些开源的编辑器扩展的标准和范例,开发出自己的扩展插件出来用。

      来自精英团队的有力支持

      如Cocos Creator设计师、项目负责人王楠在视频中所说,Cocos Creator团队实际上是由两批精英游戏和工具开发者汇合而成,一方面保持了跨平台原生开发领域的多年研发经验积累,另一方面又加入了熟悉游戏开发各个流程和图形界面工具开发技术的新鲜血液,算得上是目前国内游戏工具研发领域的全明星团队。Oh yeah,我最喜欢这样B格满满的全明星团队了。我长期的梦想就是汇聚国内的技术精英,打造出一款对世界产生影响的软件产品来。Cocos2d-x已经实现了第一步,今天我希望用Cocos Creator更近一步。

      同时,我们幸运地获得了腾讯游戏的认可与加持:

    新编辑器Cocos Creator发布:对不起我来晚了!

      在Cocos Creator发布之际,我们和腾讯游戏一起,为开发者们准备了一个小惊喜:《21点游戏》全部源码与资源,100%开源供大家学习。《21点游戏》是Cocos Creator的示例项目之一,由腾讯游戏和Cocos引擎团队联合开发。开发者们可以借此快速学习使用Cocos Creator开发游戏界面和玩法等。

      《21点游戏》示例包括:

      · 完整的菜单、排行榜和游戏循环

      · 大量需要通过数据动态读取修改的图片和字体资源

      · 高质量的帧动画特效

      · 多分辨率自适应的 UI 布局

      · 外部导入的状态机代码库

      · 使用曲线动画和脚本混合呈现的动效细节

      《21点游戏》示例体验地址:

      http://www.cocos.com/creator/blackjack/

      《21点游戏》示例源码下载:

      https://github.com/cocos-creator/tutorial-blackjack

      特别感谢腾讯游戏的授权与支持!

      这款工具能够真正改善Cocos游戏开发的工作流,全面提高游戏的开发效率,进一步降低游戏开发门槛,手游市场还在飞速增长,竞争、挑战、需求也越来越多样化,Cocos团队正在以更高效率为目的为越来越庞大的开发者大军提供更直接有力的帮助和支持,让更多的开发者能从容应对瞬息万变的市场。

      Cocos Creator下载地址:cocos.com/creator/

      我是王哲,欢迎您试用Cocos Creator之后给我们引擎团队开喷或者点赞。我决定这几天亲自回复这篇文章下面的所有留言,所以不论你对Cocos系列产品是爱是恨,是捧是喷,尽管留言,所有意见都是欢迎的!


    展开全文
  • 手游引擎Unity和Cocos各有什么优劣?

    万次阅读 2017-11-22 09:24:28
    以下我以“大型3D、大型2D、中小型2D和微型2D”来划分,尽可能减少”纠结“感。 因为引擎的选择一向做不到“以偏概全”,他们各有所长,应选择自己适合的。 尤其是差异化这么明显的两个引擎
  • 本站文章均为 李华明Himi 原创,转载务必在明显处注明:转载自【黑米GameDev街区】 ... -昨天刚写了如何搭建Cocos2d-X开发环境,这一篇就开始总结了。。。。。 不得不说要说总结,因为Cocos2d-X的代码和Cocos2d-ipho
  • cocos2dx 是热门的二维游戏引擎,可以开发win32,iphone,android游戏。我们将一步一步的带着大家完成一款自己的游戏。定位是入门教程,高手勿喷。网上对于这款入门程序有很多教程,但是都是写的,感觉没有视频教程...
  • 15款Cocos2d-x游戏源码

    万次阅读 2017-11-30 17:52:12
    (1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象棋游戏游戏中可以实现、新局面、悔棋、游戏音乐、胜利后会显示游戏结果。 源码下载:http://www.okbase.net/file/item/27881 ...
  • cocos2dx 3D游戏制作参考

    千次阅读 2016-05-24 12:47:15
    第一种是《三国之刃》用Flash完成所有动画、UI制作,然后用JSFL开发一个Flash扩展来做导出,最后到Cocos引擎里面解析播放。这种搭配方案非常流行,《刀塔传奇》、《火柴人联盟》也是使用这种方式。很多CP都有类似的...
  • 一 手游开发工具cocos2d-x editor初识

    万次阅读 多人点赞 2014-04-24 10:49:14
    cocos2dx editor是开发跨平台的手机游戏工具 运行window和mac系统上,javascript脚本语言,基于cocos2d-x跨平台游戏引擎, 集合代码编辑,场景设计,动画制作,字体设计,还有粒子,物理系统,地图等等的,而且调试...
  • cocos2d-x刚开始的初衷就不是给企业用来开发大型游戏的,一个开源引擎后边又没有大牛支着,可以说它作为一个广大游戏爱好者用来研究娱乐的作用远大于其商业价值。 而14年开始大批的创业公司都想在移动游戏开发中“套...
  • 吐槽:cocos2dx真心难学

    千次阅读 2014-12-17 16:58:22
    做安卓游戏开发两年了。一直用的Andengine游戏引擎。...Andengine引擎已基本停止更新,所以cocos2dx已成为开发2D手机游戏的唯一选择。 ​ ​于是,不得不开始学习和研究cocos2dX了。本人有五年的C
  • Cocos2d-x引擎想必大家都已经非常熟悉,这次向大家介绍一下Cocos2d的Android平台移植版---Cocos2d-android引擎,该引擎采用Java编写,适合所有已经掌握了Java基础和Android的基础的朋友们学习。
  • Cocos Creator 极速入门

    万次阅读 2018-11-26 13:17:34
    该课程对 Cocos Creator 官方实例工程做了详尽解说,并从作者多年引擎开发经验的角度,深入分析了其中的技术要点。对于想要快速掌握 Cocos Creator 功能用法的开发者,这是一个很不错的参考资料。 —...
  • 李华明Himi 原创,转载务必在明显处注明:转载自【黑米GameDev街区】 原文链接: ...尤其是网龙公司的《91部落》手机网游更让Himi有了深入cocos2dX的价值,那么今天Himi来
  • Cocos2d-x 3.2 大富翁游戏项目开发

    千次阅读 2014-12-11 20:12:09
    由于该引擎的天生缺陷,不支持跨平台,只能在Android设备上运行,所以刻苦研究C++ ,搜罗关于Cocos2d-x 的资料,终于把CC引擎算是入门了,从今天开始,我用CC引擎重写大富翁游戏。做好笔记,以备写过之后就忘记了...
  • Cocos Creator之打包设置横竖屏

    千次阅读 2018-12-07 16:22:33
    其实这个东西跟Unity3d 那个游戏引擎很像的,只不过是开发语言不同。 Portrait ---&gt; 这个是竖屏展示; Upside Down --&gt; 这个是手机竖屏,但是你的手机需要倒过来; Landscape Left --&gt; ...
  • 老早之前我对手游开发两款引擎Unity和Cocos都有接触过,也有过相关项目的开发经历,我个人谈谈这两款引擎的对比和看法:cocos的有点在于他的轻巧,导出的包比较小,一些动画方面也比较好用,但缺点在于他的UI,UI...
  • 1.先说说为什么cocos2d-x之前那么火: a.开源:每个CTO都认为开源可以更好的掌控引擎,万一引擎坑了可以马上改,包的大小比较容易控制,跟平台语言相互调用也方便。2.x时期,坑是一点点填得差不多了,许多技术实力...
  • 我们使用CocosCreator官方的polished_project例子来讲解如何生成微信小游戏。 1、下载polished_project工程,地址:https://github.com/cocos-creator/tutorial-first-game/releases/download/v1.2/polished_p
1 2 3 4 5 ... 20
收藏数 5,857
精华内容 2,342
关键字:

手机游戏引擎是cocos