文章目录

  • 1.游戏引擎Cocos2D
  • 2.图形引擎Cocos2D Graphic
  • 3.实践一
  • 4.Cocos2D的坐标体系
  • 5.CCNode
  • 6.实践二
  • 7.CCAction
  • 8.实践三
  • 9.CCAnimate
  • 10.实践四
  • 11.总结

1.游戏引擎Cocos2D

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

这里要学习的Cocos2d-android,就是一款游戏引擎。

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

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

Cocos2d的优点如下:

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

Cocos2d的架构如图所示:

下面来详细介绍下Cocos2d的一些组件

2.图形引擎Cocos2D Graphic

Cocos2D Graphic引擎的架构图如下所示:

之前用SurfaceView做游戏,就像放电影。而使用cocos2D开发游戏,就像拍电影

拍电影需要以下几个要素:

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

它们之间的结构图如下:

下面就让我们新建一个工程,开始尝试使用Cocos2D吧

3.实践一

这次,我们使用Cocos2D来制作一款移动端上很热门的游戏《植物大战僵尸》

  1. 导入cocos2d-android.jar,放入libs中,右键选择“add as library”,将jar包导入到项目中,如图所示:


2. 修改MainActivvity,分别获取CCGLSurfaceView、CCDirector、CCLayer、CCScene对象,代码如下:

package com.example.cocos2ddemo;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import org.cocos2d.layers.CCLayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.opengl.CCGLSurfaceView;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获取视图CCGLSurfaceView view = new CCGLSurfaceView(this); // 创建一个SurfaceView,类似导演眼前的小屏幕setContentView(view);// 获取导演的单例对象CCDirector director = CCDirector.sharedDirector();director.attachInView(view); // 开启绘制线程的方法// 获取场景对象CCScene scene = CCScene.node();// 获取图层对象CCLayer layer = CCLayer.node();// 配置环境scene.addChild(layer); // 给场景添加图层director.runWithScene(scene); // 导演运行场景}
}
  1. 新建一个FirstLayer,用于实现一个自定义的图层。**注意:Cocos2d下的所有资源文件,都必须放在assets目录下。另外,在assets目录下必须要有fps_images.png图片,用于显示帧率,否则程序会崩溃!**代码如下:
package com.example.cocos2ddemo;import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCSprite;/*** 第一个图层*/
public class FirstLayer extends CCLayer {public FirstLayer() {CCSprite sprite = CCSprite.sprite("z_1_attack_01.png"); // 参数表示图片在assets目录下的相对路径this.addChild(sprite); // 添加一个精灵}
}
  1. 修改MainActivity,以此让图层显示出来,代码如下:
package com.example.cocos2ddemo;import android.app.Activity;
import android.os.Bundle;import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.opengl.CCGLSurfaceView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获取视图CCGLSurfaceView view = new CCGLSurfaceView(this); // 创建一个SurfaceView,类似导演眼前的小屏幕setContentView(view);// 获取导演的单例对象CCDirector director = CCDirector.sharedDirector();director.attachInView(view); // 开启绘制线程的方法// 获取场景对象CCScene scene = CCScene.node();// 获取图层对象FirstLayer layer = new FirstLayer();// 配置环境scene.addChild(layer); // 给场景添加图层director.runWithScene(scene); // 导演运行场景}
}

4.Cocos2D的坐标体系

cocos2D的默认坐标点,在屏幕的左下角,而不是我们常识的左上角。

为了调整图层的位置,引入一个锚点的概念。

锚点,类似于图钉,首先在墙上找好一个点,这个点就是图片的展示位置,默认(0.5,0.5),然后在图片上找好一个点,用来向墙上钉图片。锚点默认是中心位置

锚点的相对坐标解析如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CyT87nBs-1577952525676)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200101201457945.png)]

5.CCNode

在介绍锚点之后,接下来简单介绍一下CCNode,这里引入CCNode官方文档中的一段话

Anything thats gets drawn or contains things that get drawn is a CCNode.
The most popular CCNodes are: CCScene, CCLayer, CCSprite, CCMenu.

翻译为:所有可被绘制的东西, 或者可以包含可绘制东西的事物, 都认为是一个CCNode对象

在进行以下的实践之前,在assets目录下添加一张图片,图片如下:

6.实践二

  1. 修改FirstLayer,设置图层的锚点和图层的显示位置,代码如下:
package com.example.cocos2ddemo;import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCSprite;/*** 第一个图层*/
public class FirstLayer extends CCLayer {public FirstLayer() {CCSprite sprite = CCSprite.sprite("z_1_attack_01.png"); // 参数表示图片在assets目录下的相对路径sprite.setAnchorPoint(0,0);  // 设置锚点,默认是0.5,0.5sprite.setPosition(ccp(100,0)); // 设置僵尸的显示位置this.addChild(sprite); // 添加一个精灵}
}
  1. 修改MainActivity,配置CCDirector的各项参数,并且在Activity的生命周期中添加相应的恢复、暂停和结束逻辑,代码如下:
package com.example.cocos2ddemo;import android.app.Activity;
import android.os.Bundle;import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.opengl.CCGLSurfaceView;public class MainActivity extends Activity {/*** 导演*/CCDirector director = CCDirector.sharedDirector();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获取视图CCGLSurfaceView view = new CCGLSurfaceView(this); // 创建一个SurfaceView,类似导演眼前的小屏幕setContentView(view);// 获取导演的单例对象director.attachInView(view); // 开启绘制线程的方法director.setDisplayFPS(true); // 显示帧率,表示每秒刷新页面的次数。一般当帧率大于30帧时,基本上人眼看起来比较流畅,帧率和手机性能与程序性能有关director.setAnimationInterval(1/60f); // 设置最高帧率位60director.setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft); // 设置屏幕方式为横屏显示director.setScreenSize(480,320); // 设置分辨率,用于屏幕适配,会基于不同大小的屏幕等比例缩放,设置我们开发时候的分辨率// 获取场景对象CCScene scene = CCScene.node();// 获取图层对象FirstLayer layer = new FirstLayer();// 配置环境scene.addChild(layer); // 给场景添加图层director.runWithScene(scene); // 导演运行场景}@Overrideprotected void onResume() {super.onResume();director.resume(); // 游戏继续}@Overrideprotected void onPause() {super.onPause();director.pause(); // 游戏暂停}@Overrideprotected void onDestroy() {super.onDestroy();director.end(); // 游戏结束}
}
  1. 修改FirstLayer,配置CCSprite的各项参数,代码如下:
package com.example.cocos2ddemo;import android.view.MotionEvent;import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.CGRect;/*** 第一个图层*/
public class FirstLayer extends CCLayer {/*** 定义标志位*/private static final int TAG = 1;public FirstLayer() {CCSprite sprite = CCSprite.sprite("z_1_attack_01.png"); // 参数表示图片在assets目录下的相对路径sprite.setAnchorPoint(0,0);  // 设置锚点为左下角,默认是0.5,0.5sprite.setPosition(ccp(0,0)); // 设置僵尸的显示位置//sprite.setFlipX(true); // 水平翻转//sprite.setFlipY(true); // 垂直翻转//sprite.setOpacity(0); // 设置不透明度,值的范围为0~255,0为不透明,25为完全透明//sprite.setScale(2); // 设置宽高的缩放比例,宽高变为2倍,面积变为4倍//this.addChild(sprite); // 添加一个精灵(1)this.addChild(sprite,0,TAG); // 添加一个精灵(2)// 再设置一个图层(僵尸)// CCSprite sprite2 = CCSprite.sprite("z_1_attack_01.png"); // 参数表示图片在assets目录下的相对路径// sprite2.setAnchorPoint(0,0);  // 设置锚点为左下角,默认是0.5,0.5// sprite2.setPosition(ccp(0,0)); // 设置僵尸的显示位置// sprite2.setScale(2);// this.addChild(sprite2); // 添加一个精灵(3),第二个参数表示为展现优先级,越大展示在越上面,默认为0setIsTouchEnabled(true); // 打开点击事件,默认为关闭,为了避免误操作而导致bug}/*** 监听点击事件* @param event* @return*/@Overridepublic boolean ccTouchesBegan(MotionEvent event) {CGPoint cgPoint = convertTouchToNodeSpace(event);  // 转化为cocos2d的坐标体系CCSprite ccSprite = (CCSprite) this.getChildByTag(TAG); // 通过tag找到图层(僵尸)对象// 判断该坐标点有没有落在图层(僵尸)的身上if (CGRect.containsPoint(ccSprite.getBoundingBox(),cgPoint)){//ccSprite.setVisible(false); // 隐藏图层(僵尸)//ccSprite.removeSelf(); // 移除图层(僵尸)}return super.ccTouchesBegan(event);}
}

7.CCAction

CCAction是一个重要的事件触发机制,其中包含以下几个种类

  • CCFiniteTimeAction:有限时间的动作

    • CCInstantAction:瞬时动作 //CCHide. CCShow
    • CCIntervalAction:延时动作
  • CCFollow:跟随

  • CCRepeatForever:循环

  • CCSpeed;速度

至于XXTo表示变化到某个绝对值,而xxBy则表示基于原来的状态,偏移多少个像素

8.实践三

  1. 新建ActionLayer,用于模拟图层(僵尸)的动画,代码如下:
package com.example.cocos2ddemo;import org.cocos2d.actions.interval.CCMoveBy;
import org.cocos2d.actions.interval.CCMoveTo;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCSprite;/*** 动作图层*/
public class ActionLayer extends CCLayer {/*** 图层(僵尸)对象*/private CCSprite sprite;public ActionLayer() {sprite = CCSprite.sprite("z_1_attack_01.png");sprite.setAnchorPoint(ccp(0,0));sprite.setPosition(0,100);this.addChild(sprite);moveTo();}/*** 图层(僵尸)移动(1)绝对*/private void moveTo(){CCMoveTo action = CCMoveTo.action(3,ccp(200,0));sprite.runAction(action);}/*** 图层(僵尸)移动(2)相对*/private void moveBy(){CCMoveBy action = CCMoveBy.action(3,ccp(200,0));sprite.runAction(action);}
}
  1. 修改MainActivity,使其不再使用FirstLayer,转而使用刚刚创建的ActionLayer,代码如下:
package com.example.cocos2ddemo;import android.app.Activity;
import android.os.Bundle;import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.opengl.CCGLSurfaceView;public class MainActivity extends Activity {/*** 导演*/CCDirector director = CCDirector.sharedDirector();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获取视图CCGLSurfaceView view = new CCGLSurfaceView(this); // 创建一个SurfaceView,类似导演眼前的小屏幕setContentView(view);// 获取导演的单例对象director.attachInView(view); // 开启绘制线程的方法director.setDisplayFPS(true); // 显示帧率,表示每秒刷新页面的次数。一般当帧率大于30帧时,基本上人眼看起来比较流畅,帧率和手机性能与程序性能有关director.setAnimationInterval(1/60f); // 设置最高帧率位60director.setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft); // 设置屏幕方式为横屏显示director.setScreenSize(480,320); // 设置分辨率,用于屏幕适配,会基于不同大小的屏幕等比例缩放,设置我们开发时候的分辨率// 获取场景对象CCScene scene = CCScene.node();// 获取图层对象//FirstLayer layer = new FirstLayer();ActionLayer layer = new ActionLayer();// 配置环境scene.addChild(layer); // 给场景添加图层director.runWithScene(scene); // 导演运行场景}@Overrideprotected void onResume() {super.onResume();director.resume(); // 游戏继续}@Overrideprotected void onPause() {super.onPause();director.pause(); // 游戏暂停}@Overrideprotected void onDestroy() {super.onDestroy();director.end(); // 游戏结束}
}
  1. 修改ActionLayer,实现一些Cocos2D封装的一些简单的动作效果,代码如下:
package com.example.cocos2ddemo;import org.cocos2d.actions.ease.CCEaseOut;
import org.cocos2d.actions.interval.CCBezierBy;
import org.cocos2d.actions.interval.CCBlink;
import org.cocos2d.actions.interval.CCFadeIn;
import org.cocos2d.actions.interval.CCJumpBy;
import org.cocos2d.actions.interval.CCMoveBy;
import org.cocos2d.actions.interval.CCMoveTo;
import org.cocos2d.actions.interval.CCRotateBy;
import org.cocos2d.actions.interval.CCRotateTo;
import org.cocos2d.actions.interval.CCScaleTo;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.types.CCBezierConfig;/*** 动作图层*/
public class ActionLayer extends CCLayer {/*** 图层(僵尸)对象*/private CCSprite sprite;public ActionLayer() {sprite = CCSprite.sprite("z_1_attack_01.png");sprite.setAnchorPoint(ccp(0,0));sprite.setPosition(0,100);this.addChild(sprite);moveTo();//moveBy();//rotateTo();//roteteBy();//scale();//jump();//fade();//bazier();//ease();//blink();}/*** 闪烁*/private void blink(){CCBlink action = CCBlink.action(10,50); // 第二个参数表示闪烁的次数sprite.runAction(action);}/*** 加速度*/private void ease(){CCMoveBy move = CCMoveBy.action(5,ccp(200,0));//CCEaseIn action = CCEaseIn.action(move,5); // 第二个参数表示速率,渐快CCEaseOut action = CCEaseOut.action(move,5); // 第二个参数表示速率,渐慢sprite.runAction(action);}/*** 贝塞尔曲线*/private void bazier(){CCBezierConfig config = new CCBezierConfig();config.controlPoint_1 = ccp(100,50);config.controlPoint_2 = ccp(150,100);config.endPosition = ccp(200,50);CCBezierBy action = CCBezierBy.action(3,config);sprite.runAction(action);}/*** 淡入淡出*/private void fade(){CCFadeIn action = CCFadeIn.action(2); // 淡入//CCFadeOut action2 = CCFadeOut.action(2); // 淡出sprite.runAction(action);}/*** 跳跃*/private void jump(){CCJumpBy action = CCJumpBy.action(2,ccp(100,100),150,1); // 第三个参数表示跳跃最高点,第四个参数表示跳跃次数//reverse():表示动作逆向执行CCSequence sequence = CCSequence.actions(action,action.reverse());// 顺序执行一系列动作sprite.runAction(sequence);}/*** 缩放*/private void scale(){CCScaleTo action = CCScaleTo.action(3,2); // 第二个参数表示缩放比例sprite.runAction(action);}/*** 图层(僵尸)旋转(1),达到一定角度,在例子中会走捷径(逆时针转90度)*/private void rotetaTo(){CCRotateTo action = CCRotateTo.action(3,270);sprite.setAnchorPoint(0.5f,0.5f);sprite.runAction(action);}/*** 图层(僵尸)旋转(2),偏移量,在例子走会转完(顺时针转270度)*/private void roteteBy(){CCRotateBy action = CCRotateBy.action(3,270);sprite.setAnchorPoint(0.5f,0.5f);sprite.runAction(action);}/*** 图层(僵尸)移动(1)绝对,坐标*/private void moveTo(){CCMoveTo action = CCMoveTo.action(3,ccp(200,0));sprite.runAction(action);}/*** 图层(僵尸)移动(2)相对,偏移量*/private void moveBy(){CCMoveBy action = CCMoveBy.action(3,ccp(200,0));sprite.runAction(action);}
}
  1. 修改ActionLayer,实现一些Cocos2D封装的一些复杂的动作效果(后空翻),代码如下:
package com.example.cocos2ddemo;import org.cocos2d.actions.base.CCRepeatForever;
import org.cocos2d.actions.ease.CCEaseOut;
import org.cocos2d.actions.interval.CCBezierBy;
import org.cocos2d.actions.interval.CCBlink;
import org.cocos2d.actions.interval.CCDelayTime;
import org.cocos2d.actions.interval.CCFadeIn;
import org.cocos2d.actions.interval.CCJumpBy;
import org.cocos2d.actions.interval.CCMoveBy;
import org.cocos2d.actions.interval.CCMoveTo;
import org.cocos2d.actions.interval.CCRotateBy;
import org.cocos2d.actions.interval.CCRotateTo;
import org.cocos2d.actions.interval.CCScaleTo;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.actions.interval.CCSpawn;
import org.cocos2d.actions.interval.CCTintBy;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCLabel;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.types.CCBezierConfig;
import org.cocos2d.types.CGSize;/*** 动作图层*/
public class ActionLayer extends CCLayer {/*** 图层(僵尸)对象*/private CCSprite sprite;public ActionLayer() {sprite = CCSprite.sprite("z_1_attack_01.png");sprite.setAnchorPoint(ccp(0,0));sprite.setPosition(0,100);this.addChild(sprite);//moveTo();//moveBy();//rotateTo();//roteteBy();//scale();//jump();//fade();//bazier();//ease();//blink();//tint();//demo();}/*** 让图层(僵尸)进行后空翻*/private void demo(){sprite.setAnchorPoint(0.5f,0.5f);CCJumpBy jump = CCJumpBy.action(2,ccp(100,100),150,2);CCDelayTime delay = CCDelayTime.action(1); // 延迟一秒钟,也是一个CCActionCCRotateBy rotate = CCRotateBy.action(1,360);CCSequence sequence1 = CCSequence.actions(delay,rotate); // 先延时,再旋转CCSpawn spawn = CCSpawn.actions(jump,sequence1); // 多个动作同时执行CCSequence sequence2 = CCSequence.actions(spawn,spawn.reverse());CCRepeatForever repeat = CCRepeatForever.action(sequence2);sprite.runAction(repeat);}/*** 渐变*/private void tint(){CCLabel label = CCLabel.labelWithString("渐变效果","hkbd.ttf",20); // 初始化一段文字,第二个参数表示字体类型,第三个参数表示字体大小label.setColor(ccc3(100,50,0));CGSize cgSize = CCDirector.sharedDirector().winSize(); // 通过导演拿到屏幕尺寸label.setPosition(ccp(cgSize.width / 2 ,cgSize.height / 2));this.addChild(label);CCTintBy tint = CCTintBy.action(3,ccc3(50,-50,100));CCSequence sequence = CCSequence.actions(tint,tint.reverse());CCRepeatForever repeat = CCRepeatForever.action(sequence); // 动作永远循环label.runAction(repeat);}/*** 闪烁*/private void blink(){CCBlink action = CCBlink.action(10,50); // 第二个参数表示闪烁的次数sprite.runAction(action);}/*** 加速度*/private void ease(){CCMoveBy move = CCMoveBy.action(5,ccp(200,0));//CCEaseIn action = CCEaseIn.action(move,5); // 第二个参数表示速率,渐快CCEaseOut action = CCEaseOut.action(move,5); // 第二个参数表示速率,渐慢sprite.runAction(action);}/*** 贝塞尔曲线*/private void bazier(){CCBezierConfig config = new CCBezierConfig();config.controlPoint_1 = ccp(100,50);config.controlPoint_2 = ccp(150,100);config.endPosition = ccp(200,50);CCBezierBy action = CCBezierBy.action(3,config);sprite.runAction(action);}/*** 淡入淡出*/private void fade(){CCFadeIn action = CCFadeIn.action(2); // 淡入//CCFadeOut action2 = CCFadeOut.action(2); // 淡出sprite.runAction(action);}/*** 跳跃*/private void jump(){CCJumpBy action = CCJumpBy.action(2,ccp(100,100),150,1); // 第三个参数表示跳跃最高点,第四个参数表示跳跃次数//action.reverse():表示动作逆向执行CCSequence sequence = CCSequence.actions(action,action.reverse());// 顺序执行一系列动作sprite.runAction(sequence);}/*** 缩放*/private void scale(){CCScaleTo action = CCScaleTo.action(3,2); // 第二个参数表示缩放比例sprite.runAction(action);}/*** 图层(僵尸)旋转(1),达到一定角度,在例子中会走捷径(逆时针转90度)*/private void rotetaTo(){CCRotateTo action = CCRotateTo.action(3,270);sprite.setAnchorPoint(0.5f,0.5f);sprite.runAction(action);}/*** 图层(僵尸)旋转(2),偏移量,在例子走会转完(顺时针转270度)*/private void roteteBy(){CCRotateBy action = CCRotateBy.action(3,270);sprite.setAnchorPoint(0.5f,0.5f);sprite.runAction(action);}/*** 图层(僵尸)移动(1)绝对,坐标*/private void moveTo(){CCMoveTo action = CCMoveTo.action(3,ccp(200,0));sprite.runAction(action);}/*** 图层(僵尸)移动(2)相对,偏移量*/private void moveBy(){CCMoveBy action = CCMoveBy.action(3,ccp(200,0));sprite.runAction(action);}
}

9.CCAnimate

CCAnimate是CCAction下的一个子类,表示帧动画。要想实现僵尸在移动时展现不同的动画,则需要使用到这个类,需要与CCAnimation、CCSprite进行联动

10.实践四

  1. 在实践之前,添加相应的素材(僵尸行走图),总共7张,如图所示:




  1. 修改ActionLayer,增加让图层(僵尸)行走的方法(move),代码如下:
package com.example.cocos2ddemo;import org.cocos2d.actions.base.CCRepeatForever;
import org.cocos2d.actions.ease.CCEaseOut;
import org.cocos2d.actions.interval.CCAnimate;
import org.cocos2d.actions.interval.CCBezierBy;
import org.cocos2d.actions.interval.CCBlink;
import org.cocos2d.actions.interval.CCDelayTime;
import org.cocos2d.actions.interval.CCFadeIn;
import org.cocos2d.actions.interval.CCJumpBy;
import org.cocos2d.actions.interval.CCMoveBy;
import org.cocos2d.actions.interval.CCMoveTo;
import org.cocos2d.actions.interval.CCRotateBy;
import org.cocos2d.actions.interval.CCRotateTo;
import org.cocos2d.actions.interval.CCScaleTo;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.actions.interval.CCSpawn;
import org.cocos2d.actions.interval.CCTintBy;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCAnimation;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCLabel;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.nodes.CCSpriteFrame;
import org.cocos2d.types.CCBezierConfig;
import org.cocos2d.types.CGSize;import java.util.ArrayList;/*** 动作图层*/
public class ActionLayer extends CCLayer {/*** 图层(僵尸)对象*/private CCSprite sprite;public ActionLayer() {sprite = CCSprite.sprite("z_1_attack_01.png");sprite.setAnchorPoint(ccp(0,0));sprite.setPosition(0,0);this.addChild(sprite);//moveTo();//moveBy();//rotateTo();//roteteBy();//scale();//jump();//fade();//bazier();//ease();//blink();//tint();//demo();walk();}/*** 图层(僵尸)行走*/private void walk(){sprite.setFlipX(true); // 水平翻转CCMoveBy move = CCMoveBy.action(5,ccp(200,0));sprite.runAction(move);ArrayList<CCSpriteFrame> frames = new ArrayList<>();String format = "z_1_%02d.png"; // %02d表示两位数字,如果是个位,用0去补位(01,02);如果是十位,则不用补位(10,11)// 初始化7帧图片for (int i = 1; i <= 7 ; i++) {frames.add(CCSprite.sprite(String.format(format,i)).displayedFrame());}CCAnimation animation = CCAnimation.animation("walk",.2f,frames); // 第二个参数表示每一帧显示时间CCAnimate animate = CCAnimate.action(animation);CCRepeatForever repeat = CCRepeatForever.action(animate); // 表示动画永远循环,若不循环则会报出空指针异常sprite.runAction(repeat);}/*** 让图层(僵尸)进行后空翻*/private void demo(){sprite.setAnchorPoint(0.5f,0.5f);CCJumpBy jump = CCJumpBy.action(2,ccp(100,100),150,2);CCDelayTime delay = CCDelayTime.action(1); // 延迟一秒钟,也是一个CCActionCCRotateBy rotate = CCRotateBy.action(1,360);CCSequence sequence1 = CCSequence.actions(delay,rotate); // 先延时,再旋转CCSpawn spawn = CCSpawn.actions(jump,sequence1); // 多个动作同时执行CCSequence sequence2 = CCSequence.actions(spawn,spawn.reverse());CCRepeatForever repeat = CCRepeatForever.action(sequence2);sprite.runAction(repeat);}/*** 渐变*/private void tint(){CCLabel label = CCLabel.labelWithString("渐变效果","hkbd.ttf",20); // 初始化一段文字,第二个参数表示字体类型,第三个参数表示字体大小label.setColor(ccc3(100,50,0));CGSize cgSize = CCDirector.sharedDirector().winSize(); // 通过导演拿到屏幕尺寸label.setPosition(ccp(cgSize.width / 2 ,cgSize.height / 2));this.addChild(label);CCTintBy tint = CCTintBy.action(3,ccc3(50,-50,100));CCSequence sequence = CCSequence.actions(tint,tint.reverse());CCRepeatForever repeat = CCRepeatForever.action(sequence); // 动作永远循环label.runAction(repeat);}/*** 闪烁*/private void blink(){CCBlink action = CCBlink.action(10,50); // 第二个参数表示闪烁的次数sprite.runAction(action);}/*** 加速度*/private void ease(){CCMoveBy move = CCMoveBy.action(5,ccp(200,0));//CCEaseIn action = CCEaseIn.action(move,5); // 第二个参数表示速率,渐快CCEaseOut action = CCEaseOut.action(move,5); // 第二个参数表示速率,渐慢sprite.runAction(action);}/*** 贝塞尔曲线*/private void bazier(){CCBezierConfig config = new CCBezierConfig();config.controlPoint_1 = ccp(100,50);config.controlPoint_2 = ccp(150,100);config.endPosition = ccp(200,50);CCBezierBy action = CCBezierBy.action(3,config);sprite.runAction(action);}/*** 淡入淡出*/private void fade(){CCFadeIn action = CCFadeIn.action(2); // 淡入//CCFadeOut action2 = CCFadeOut.action(2); // 淡出sprite.runAction(action);}/*** 跳跃*/private void jump(){CCJumpBy action = CCJumpBy.action(2,ccp(100,100),150,1); // 第三个参数表示跳跃最高点,第四个参数表示跳跃次数//action.reverse():表示动作逆向执行CCSequence sequence = CCSequence.actions(action,action.reverse());// 顺序执行一系列动作sprite.runAction(sequence);}/*** 缩放*/private void scale(){CCScaleTo action = CCScaleTo.action(3,2); // 第二个参数表示缩放比例sprite.runAction(action);}/*** 图层(僵尸)旋转(1),达到一定角度,在例子中会走捷径(逆时针转90度)*/private void rotetaTo(){CCRotateTo action = CCRotateTo.action(3,270);sprite.setAnchorPoint(0.5f,0.5f);sprite.runAction(action);}/*** 图层(僵尸)旋转(2),偏移量,在例子走会转完(顺时针转270度)*/private void roteteBy(){CCRotateBy action = CCRotateBy.action(3,270);sprite.setAnchorPoint(0.5f,0.5f);sprite.runAction(action);}/*** 图层(僵尸)移动(1)绝对,坐标*/private void moveTo(){CCMoveTo action = CCMoveTo.action(3,ccp(200,0));sprite.runAction(action);}/*** 图层(僵尸)移动(2)相对,偏移量*/private void moveBy(){CCMoveBy action = CCMoveBy.action(3,ccp(200,0));sprite.runAction(action);}
}

注意:这里如果不使用CCRepeatForever包装动画,会报出空指针异常:因为动画只提供了7帧,没有后面的帧数了。解决这个问题的另一个方法是让这个动画只执行一次,即在CCAnimate.action()的第二个参数写入一个false。

11.总结

Cocos2D调用顺序:视图(CCGLSurfaceView) ——> 导演(CCDirector) ——> 场景(CCScene) ——> 图层(CCLayer) ——> 精灵(CCSprite) ——> 动作(CCMove)

Cocos2d游戏开发学习记录——2.使用Cocos2D Graphic实现僵尸的移动相关推荐

  1. Cocos2d游戏开发学习记录——4.开发《植物大战僵尸》

    文章目录 1.植物大战僵尸 2.开发前导 3.载入页面 4.菜单页面 & 预备战斗页面 5.植物准备页面 6.正式战斗页面 7.战斗逻辑 8.向日葵逻辑 9.进度条逻辑 10.音乐逻辑 11. ...

  2. 微信小游戏开发学习记录2

    接上一篇:微信小游戏开发学习记录_寂静流年韶华舞的博客-CSDN博客_微信小游戏开发学习 目录 一.UI系统 1.基础渲染组件-精灵组件 (1)操作: (2)Sprite 属性 (3)渲染模式 2.L ...

  3. 游戏开发学习记录01-关于在Unity开发的游戏中部署后端云的选择

    目前我还是一名在校学生,而且现在还没有学习数据库方面的知识,所以目前我不具备后端搭建服务器和数据库的知识.所以在之前学习安卓开发过程中,了解到了现在有一种服务-后端云,可以不用费时的去完成后端的开发, ...

  4. 微信小游戏开发学习记录

    目录 一.基础知识 二. cocos creator 1. 项目文件夹功能介绍: 2. 基本概念 3.游戏资源管理 一.基础知识 1. 编程语言选择:C,C++,java,javascript,lua ...

  5. 初学者开发iOS游戏的入门必备用书——iOS 5 cocos2d游戏开发实战(第2版)

    如果想接触iOS游戏开发,今天笔者就推荐一本"大杀器"--<iOS 5 cocos2d游戏开发实战(第2版)>(当当链接) 为零基础的"设想过自己写个电脑游戏 ...

  6. iOS 5 cocos2d游戏开发实战(第2版)

    <iOS 5 cocos2d游戏开发实战(第2版)> 基本信息 作者: [美]Steffen Itterheim Andreas Low [作译者介绍] 译者: 同济大学苹果俱乐部 丛书名 ...

  7. [转]cocos2d游戏开发,常用工具集合

    cocos2d游戏开发,常用工具集合 原文地址:http://www.cocoachina.com/bbs/read.php?tid-68951.html 位图字体工具Bitmap Font Tool ...

  8. Cocos2d游戏开发之如何解包获得pvr.ccz中的美术资源

    Cocos2d游戏开发之如何解包获得pvr.ccz中的美术资源 在大部分时候,Cocos2d游戏会将美术资源打包以减轻性能要求,提高加载速度.而如果我们需要获得其中的美术资源,就得解包.这里以plis ...

  9. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

最新文章

  1. poj2723详解(二分 + 2-SAT)( 两种方法求解 )
  2. 使用ELK 搭建core文件展示平台
  3. mysql gbk支持_mysql如何支持gbk编码
  4. 计算机网络抓包参考文献,计算机网络课程设计二(网络抓包与分析)
  5. php oracle 删除 数据,oracle怎么清空表数据
  6. Typora Mermaid 使用指南
  7. 静态路由的设置以及缺省路由的发布
  8. TamronOS IPTV系统任意用户添加修改
  9. html中复选框只能选一个,HTML选择三个不同的复选框并显示它们
  10. 火狐浏览器复制网页文字_从Firefox中的网页链接的多种“复制”格式中选择
  11. (附源码)Node.js图书管理小程序 毕业设计 250858
  12. python 病毒 基因_#Python#提取基因对应的蛋白质名
  13. bug管理工具bugfree配置之一:php mysql apache 配置篇
  14. Oracle字符串类型扩容隐患
  15. 秋月之谋:早评黄金1505空单精准出击,空军在下一城!原油保持观望
  16. 超大型数据中心正在改变精密空调市场
  17. 父类,子类中方法的调用
  18. Halcon 采集助手批量文件夹下图像读取
  19. 目标既定 使命必达 | 麒麟信安举行营销中心2023年度工作计划部署会
  20. 程序员沟通障碍之普遍缺乏同理心

热门文章

  1. 为啥要放引流条_引流条放几个小时管用
  2. Windows服务器补丁列表及介绍_Windows server 2012 R2 部署WSUS补丁服务
  3. 问题 D: 哪一天,哪一秒?
  4. task_struct结构体的优先级参数详解:prio、static_prio、normal_prio、rt_priority
  5. Elitebook735安装ubuntu18
  6. 连马云都自愧不如 真正的草根创业者
  7. 教育平台线上课程数据分析
  8. java oshi查看cpu信息
  9. T1056点和正方形的关系 (信息学一本通C++)
  10. 天蝎座生存法则 | 因为恐惧,所以要不断面对害怕的事情