Cocos2D-Android-1之源码详解:2.ActionManagerTest
//现在我们开始注释,他的第一个activity
package org.cocos2d.tests;
import org.cocos2d.actions.CCActionManager;
import org.cocos2d.actions.base.CCAction;
import org.cocos2d.actions.instant.CCCallFunc;
import org.cocos2d.actions.instant.CCCallFuncN;
import org.cocos2d.actions.interval.CCDelayTime;
import org.cocos2d.actions.interval.CCFadeOut;
import org.cocos2d.actions.interval.CCMoveBy;
import org.cocos2d.actions.interval.CCRotateBy;
import org.cocos2d.actions.interval.CCScaleBy;
import org.cocos2d.actions.interval.CCScaleTo;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.menus.CCMenu;
import org.cocos2d.menus.CCMenuItemImage;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCLabel;
import org.cocos2d.nodes.CCNode;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.opengl.CCGLSurfaceView;
import org.cocos2d.opengl.CCTextureAtlas;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.CGSize;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
// There is a downloadable demo on this test
// http://code.google.com/p/cocos2d-android-1/downloads/detail?name=ActionManagerTest.3gp&can=2&q=#makechanges
//上面是下载地址
public class ActionManagerTest extends Activity {//是个普通的activity
// private static final String LOG_TAG = ActionManagerTest.class.getSimpleName();
//上面注释本来想获取包名
public static final int kTagNode = 0;//
public static final int kTagGrossini = 1;
public static final int kTagSister= 2;
public static final int kTagSlider= 3;
public static final int kTagSequence= 4;
private CCGLSurfaceView mGLSurfaceView;//这个ccg的view是opengl中的类,最终还是继承了sufaceview,先不做详细解释
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//没有标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,//保持不暗不关闭
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mGLSurfaceView = new CCGLSurfaceView(this);//产生这个avtivity下的surfaceview
CCDirector director = CCDirector.sharedDirector();//获得“导演”
director.attachInView(mGLSurfaceView);//把背景给导演,导演一会把数据画上去
director.setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft);//横屏显示
setContentView(mGLSurfaceView);//展示出这个view
// show FPS
CCDirector.sharedDirector().setDisplayFPS(true);//显示fps分辨率
// frames per second
CCDirector.sharedDirector().setAnimationInterval(1.0f / 30);//设置动画多少秒刷一帧
CCScene scene = CCScene.node();//获得一个场景
scene.addChild(nextAction());//给场景添加一个子类
// Make the Scene active
CCDirector.sharedDirector().runWithScene(scene);//导演开始放映
}
static int sceneIdx = -1;
static Class<?> transitions[] = {
CrashTest.class,
LogicTest.class,
PauseTest.class,
RemoveTest.class,
Issue835.class,
};
@Override
public void onStart() {//下面几个方法看名字就能明白..
super.onStart();
}
@Override
public void onPause() {
super.onPause();
CCDirector.sharedDirector().onPause();
}
@Override
public void onResume() {
super.onResume();
CCDirector.sharedDirector().onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
CCDirector.sharedDirector().end();
// CCTextureCache.sharedTextureCache().removeAllTextures();
}
//
// Actions here
//
static CCLayer nextAction() {//实现的图层
sceneIdx++;//动画帧
sceneIdx = sceneIdx % transitions.length;//让动画的图层帧始终循环,比如0-》1-》2-》3-》4
return restartAction();//返回的是另一个类的属性,上述变量是全局静态变量
}
static CCLayer backAction() {//同理回退一个图层
sceneIdx--;
int total = transitions.length;
if (sceneIdx < 0)
sceneIdx += total;
return restartAction();
}
static CCLayer restartAction() {
try {
Class<?> c = transitions[sceneIdx];//按照数值计算显示的图层
return (CCLayer) c.newInstance();//返回显示的图层
} catch (Exception e) {
return null;
}
}
static abstract class ActionManagerDemo extends CCLayer {
CCTextureAtlas atlas;//定义一个大图
public ActionManagerDemo() {//构造方法
CGSize s = CCDirector.sharedDirector().winSize();//从导演那里得到宽高
CCLabel label = CCLabel.makeLabel(title(), "DroidSans", 32);//画一个label,字体是“DroidSans”,32的大小
addChild(label, 1);//把对象添加到图层
label.setPosition(CGPoint.make(s.width / 2, s.height / 2 - 50));设置label的位置
String subtitle = subtitle();//把subtitle变成空
if( subtitle != null ) {//...这个不执行
CCLabel l = CCLabel.makeLabel(subtitle, "DroidSerif", 16);
addChild(l, 1);
l.setPosition(CGPoint.ccp(s.width/2, s.height - 80));
}
CCMenuItemImage item1 = CCMenuItemImage.item("b1.png", "b2.png", this, "backCallback");
//菜单项目1,最后点击backCallback方法
CCMenuItemImage item2 = CCMenuItemImage.item("r1.png", "r2.png", this, "restartCallback");
//同理
CCMenuItemImage item3 = CCMenuItemImage.item("f1.png", "f2.png", this, "nextCallback");
CCMenu menu = CCMenu.menu(item1, item2, item3);//把3个项目添加进menu
menu.setPosition(CGPoint.make(0, 0));//设置菜单的位置
item1.setPosition(CGPoint.make(s.width / 2 - 100, 30));//屏幕的一半-100,30的位置
item2.setPosition(CGPoint.make(s.width / 2, 30));
item3.setPosition(CGPoint.make(s.width / 2 + 100, 30));
addChild(menu, 1);//设置顺序,
}
public void restartCallback(Object sender) {//重来一遍
CCScene s = CCScene.node();
s.addChild(restartAction());
CCDirector.sharedDirector().replaceScene(s);
}
public void nextCallback(Object sender) {//下一个动画
CCScene s = CCScene.node();//建立一个场景
s.addChild(nextAction());//在场景添加下一个动画的图层
CCDirector.sharedDirector().replaceScene(s);//把当前的动画的图层替换掉,其实是放在图层栈顶
}
public void backCallback(Object sender) {//上一个
CCScene s = CCScene.node();
s.addChild(backAction());
CCDirector.sharedDirector().replaceScene(s);
}
public String title() {//返回没题目
return "No Title!";
}
public String subtitle() {//返回空
return null;
}
}
static class CrashTest extends ActionManagerDemo {//继承了刚才建的通用类
public CrashTest() {//构造
super();//继承方法
CCSprite child = CCSprite.sprite("grossini.png");//用这张图建立一个精灵
child.setPosition(CGPoint.ccp(200,200));//设置这个精灵的地点
addChild(child, 1);//把这个图层添加到图层中
//Sum of all action's duration is 1.5 second.
child.runAction(CCRotateBy.action(1.5f, 90));//让这个图像执行一个旋转动作1.5秒,90度,立即执行,是旋转,不是旋转到
child.runAction(CCSequence.actions(//执行一个队列,挨个运行,是个迭代类
CCDelayTime.action(1.4f),//队列中有第一个是延时1.4秒
CCFadeOut.action(1.1f) ));//淡出在1.1秒
//After 1.5 second, self will be removed.
this.runAction(CCSequence.actions(
CCDelayTime.action(1.4f),//延迟1.4秒
CCCallFunc.action(this, "removeThis")//执行方法,这个类中的removeThis方法
));
}
public void removeThis() {
this.getParent().removeChild(this, true);//把他从他父类立去除,以后在父类里就找不到也连接不到他了
this.nextCallback(null);//播下一个,括号里本来就是个没用的参数..
}
@Override
public String title(){
return "Test 1. Should not crash";//返回Test 1. Should not crash
}
}
static class LogicTest extends ActionManagerDemo {//同理
public LogicTest() {
super();
CCSprite grossini = CCSprite.sprite("grossini.png");//创建精灵,同理
addChild(grossini);
grossini.setPosition(CGPoint.ccp(200,200));
grossini.runAction(CCSequence.actions( //执行动作
CCMoveBy.action(1.0f, CGPoint.ccp(150,0)),//相对移动
CCCallFuncN.action(this, "bugMe")));//执行bugMe方法
}
public void bugMe(CCNode node) {
node.stopAllActions(); //After this stop next action not working, if remove this stop everything is working
node.runAction(CCScaleTo.action(2.0f, 2.0f));//比例放大
}
public String title() {
return "Logic test";
}
}
static class PauseTest extends ActionManagerDemo {
public PauseTest() {
super();
}
public void onEnter() {
//
// This test MUST be done in 'onEnter' and not on 'init'
// otherwise the paused action will be resumed at 'onEnter' time
//
super.onEnter();
//
// Also, this test MUST be done, after [super onEnter]
//
CCSprite grossini = CCSprite.sprite("grossini.png");//同理创建精灵
addChild(grossini, 0, kTagGrossini);
grossini.setPosition(CGPoint.ccp(200,200));
CCAction action = CCMoveBy.action(1.0f, CGPoint.ccp(150,0));//动作相对移动,CCMoveBy是个静态类,但是他的action方法在内部创建了他的实例,CCMoveBy就是把moveto的ccdelta值变成了自己的pos
CCActionManager.sharedManager().addAction(action, grossini, true);//得到动作控制器,用这个动作控制器,把action放进grossini节点中,动作控制器是零时建的,但是他自己的引用是个静态变量,所以只有一个
this.schedule("unpause", 3);//设置一个时间表,间隔3
}
public void unpause(float dt) {
unschedule("unpause");//这就停止了..
CCNode node = getChildByTag(kTagGrossini);//得到这样一个节点
CCActionManager.sharedManager().resume(node);//恢复节点,就是让暂停状态为false;
}
@Override
public String title() {
return "Pause Test";
}
public String subtitle() {
return "After 3 seconds grossini should move";
}
}
static class RemoveTest extends ActionManagerDemo {//同理
public RemoveTest() {
super();
CCMoveBy move = CCMoveBy.action(2,CGPoint.ccp(200,0));//移动
CCCallFunc callback = CCCallFunc.action(this, "stopAction");//得到某个函数
CCSequence sequence = CCSequence.actions(move, callback);
sequence.setTag(kTagSequence);
CCSprite child = CCSprite.sprite("grossini.png");
child.setPosition(CGPoint.ccp(200,200));
this.addChild(child, 1, kTagGrossini);
child.runAction(sequence);
}
public void stopAction(Object sender) {//以下均同理...
CCNode sprite = getChildByTag(kTagGrossini);
sprite.stopAction(kTagSequence);
}
public String title() {
return "Remove Test";
}
public String subtitle() {
return "Should not crash. Testing issue #841";//以下均同理...
}
}
static class Issue835 extends ActionManagerDemo {//同理
public Issue835() {
super();
}
public void onEnter() {
super.onEnter();
CGSize s = CCDirector.sharedDirector().winSize();//仍然是获得窗口大小
CCSprite grossini = CCSprite.sprite("grossini.png");//以下均同理...
addChild(grossini, 0, kTagGrossini);
grossini.setPosition(CGPoint.ccp(s.width/2, s.height/2));
// An action should be scheduled before calling pause, otherwise pause won't pause a non-existang target
grossini.runAction(CCScaleBy.action(2.0f, 2.0f));
CCActionManager.sharedManager().pause(grossini);//以下均同理...
grossini.runAction(CCRotateBy.action(2.0f, 360));
this.schedule("resumeGrossini", 3);
}
public String title() {
return "Issue 835";
}
public String subtitle() {
return "Grossini only rotate/scale in 3 seconds";
}
public void resumeGrossini(float dt) {
this.unschedule("resumeGrossini");//以下均同理...
CCNode grossini = this.getChildByTag(kTagGrossini);
CCActionManager.sharedManager().resume(grossini);
}
}
}
转载于:https://blog.51cto.com/abab99/1720594
Cocos2D-Android-1之源码详解:2.ActionManagerTest相关推荐
- android五子棋源代码,Android五子棋游戏源码详解
最近看了鸿洋大牛的五子棋教程,受益匪浅,讲的非常好,关于五子棋的游戏原理非常清楚,并且学到了不少知识,在这里感谢鸿洋大神的分享.我觉得我的源码注释写的非常清楚了,希望能给你带来不少的收获. 布局< ...
- Android 事件分发机制分析及源码详解
Android 事件分发机制分析及源码详解 文章目录 Android 事件分发机制分析及源码详解 事件的定义 事件分发序列模型 分发序列 分发模型 事件分发对象及相关方法 源码分析 事件分发总结 一般 ...
- Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解
Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 目录 Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 一.OpenGL ES渲染管线 1.基本处 ...
- 源码详解Android 9.0(P) 系统启动流程之SystemServer
源码详解Android 9.0(P) 系统启动流程目录: 源码详解Android 9.0(P)系统启动流程之init进程(第一阶段) 源码详解Android 9.0(P)系统启动流程之init进程(第 ...
- Android编程之Intent源码详解
Intent源码详解,直接开始入题: Intent源码6700多行代码,但真正核心代码 就那么几百行,大部分都用来定义常量字符串了 先来看一下 public class Intent implemen ...
- cocos android-1,Cocos2D-Android-1之源码详解:5.Box2dTest
Cocos2D-Android-1之源码详解:5.Box2dTest 发布时间:2020-08-06 06:19:28 来源:51CTO 阅读:398 作者:abab99 package org.co ...
- Integer源码详解
尊重原创,转载请标明出处 http://blog.csdn.net/abcdef314159 对于Integer这个类估计大家也都非常熟悉了,以前看过他的源码,但也只是粗略的看了一下,最近有时间 ...
- OkHttp3源码详解
前言:为什么有些人宁愿吃生活的苦也不愿吃学习的苦,大概是因为懒惰吧,学习的苦是需要自己主动去吃的,而生活的苦,你躺着不动它就会来找你了. 一.概述 OKHttp是一个非常优秀的网络请求框架,已经被谷歌 ...
- 【Live555】live555源码详解(九):ServerMediaSession、ServerMediaSubsession、live555MediaServer
[Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的三个类所在的位置: ServerMediaSession.ServerMediaSubsession.Dy ...
- 【Live555】live555源码详解系列笔记
[Live555]liveMedia下载.配置.编译.安装.基本概念 [Live555]live555源码详解(一):BasicUsageEnvironment.UsageEnvironment [L ...
最新文章
- 11CSS框架协助前端布局
- 第十五周程序阅读-范型程序设计(2)
- java swing http请求_JavaWeb核心编程之(三.5)HTTP请求和接受表单数据
- 整合Tomcat和Nginx实现动静态负载均衡
- c库函数-strtol()介绍
- C语言 二级指针内存模型混合实战
- 这个 HTTP 实战项目,帮你理清 Go 网络编程的底层逻辑
- LeetCode(235)——二叉搜索树的最近公共祖先(JavaScript)
- Webpack入门教程十四
- 如何用 10 句话激怒程序猿?
- ehcache 在web项目中使用
- 测试技术-兼容性测试
- 两台电脑通过网线直连共享数据(超详细)
- 阿里软件测试面试记录
- 北师大 外国教育史-2(古罗马教育、中世纪教育)
- 电路:过零检测是什么意思?
- python贺卡编程_一种卡片编程机及其编程方法与流程
- mysql中常用动词_mysql常用sql语句总结
- 计算机博士 英语词汇,2017考博英语词汇
- 【uniapp】【QA】