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);

}

}

}

时间: 2024-10-05 21:33:27

Cocos2D-Android-1之源码详解:2.ActionManagerTest的相关文章

android自定义SlideMenu源码详解之最简单侧滑实现

实现原理:在一个Activity的布局中需要有两部分,一个是菜单(menu)的布局,一个是内容(content)的布局.两个布局横向排列,菜单布局在左,内容布局在右.初始化的时候将菜单布局向左偏移,以至于能够完全隐藏,这样内容布局就会完全显示在Activity中.然后通过监听手指滑动事件,来改变菜单布局的左偏移距离,从而控制菜单布局的显示和隐藏. 下来来实现这个效果: 1.打开layout下的activity_main.xml <LinearLayout xmlns:android="ht

Android编程之Fragment动画加载方法源码详解

上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

Android View 事件分发机制源码详解(View篇)

前言 在Android View 事件分发机制源码详解(ViewGroup篇)一文中,主要对ViewGroup#dispatchTouchEvent的源码做了相应的解析,其中说到在ViewGroup把事件传递给子View的时候,会调用子View的dispatchTouchEvent,这时分两种情况,如果子View也是一个ViewGroup那么再执行同样的流程继续把事件分发下去,即调用ViewGroup#dispatchTouchEvent:如果子View只是单纯的一个View,那么调用的是Vie

Android ArrayMap源码详解

尊重原创,转载请标明出处    http://blog.csdn.net/abcdef314159 分析源码之前先来介绍一下ArrayMap的存储结构,ArrayMap数据的存储不同于HashMap和SparseArray,在上一篇<Android SparseArray源码详解>中我们讲到SparseArray是以纯数组的形式存储的,一个数组存储的是key值一个数组存储的是value值,今天我们分析的ArrayMap和SparseArray有点类似,他也是以纯数组的形式存储,不过不同的是他的

IntentService源码详解

IntentService可以做什么: 如果你有一个任务,分成n个子任务,需要它们按照顺序完成.如果需要放到一个服务中完成,那么IntentService就会使最好的选择. IntentService是什么: IntentService是一个Service(看起来像废话,但是我第一眼看到这个名字,首先注意的是Intent啊.),所以如果自定义一个IntentService的话,一定要在AndroidManifest.xml里面声明. 从上面的"可以做什么"我们大概可以猜测一下Inten

butterknife源码详解

butterknife源码详解 作为Android开发者,大家肯定都知道大名鼎鼎的butterknife.它大大的提高了开发效率,虽然在很早之前就开始使用它了,但是只知道是通过注解的方式实现的,却一直没有仔细的学习下大牛的代码.最近在学习运行时注解,决定今天来系统的分析下butterknife的实现原理. 如果你之前不了解Annotation,那强烈建议你先看注解使用. 废多看图: 从图中可以很直观的看出它的module结构,以及使用示例代码. 它的目录和我们在注解使用这篇文章中介绍的一样,大体

Java concurrent AQS 源码详解

一.引言 AQS(同步阻塞队列)是concurrent包下锁机制实现的基础,相信大家在读完本篇博客后会对AQS框架有一个较为清晰的认识 这篇博客主要针对AbstractQueuedSynchronizer的源码进行分析,大致分为三个部分: 静态内部类Node的解析 重要常量以及字段的解析 重要方法的源码详解. 所有的分析仅基于个人的理解,若有不正之处,请谅解和批评指正,不胜感激!!! 二.Node解析 AQS在内部维护了一个同步阻塞队列,下面简称sync queue,该队列的元素即静态内部类No

深入Java基础(四)--哈希表(1)HashMap应用及源码详解

继续深入Java基础系列.今天是研究下哈希表,毕竟我们很多应用层的查找存储框架都是哈希作为它的根数据结构进行封装的嘛. 本系列: (1)深入Java基础(一)--基本数据类型及其包装类 (2)深入Java基础(二)--字符串家族 (3)深入Java基础(三)–集合(1)集合父类以及父接口源码及理解 (4)深入Java基础(三)–集合(2)ArrayList和其继承树源码解析以及其注意事项 文章结构:(1)哈希概述及HashMap应用:(2)HashMap源码分析:(3)再次总结关键点 一.哈希概

Spring IOC源码详解之容器依赖注入

Spring IOC源码详解之容器依赖注入 上一篇博客中介绍了IOC容器的初始化,通过源码分析大致了解了IOC容器初始化的一些知识,先简单回顾下上篇的内容 载入bean定义文件的过程,这个过程是通过BeanDefinitionReader来完成的,其中通过 loadBeanDefinition()来对定义文件进行解析和根据Spring定义的bean规则进行处理 - 事实上和Spring定义的bean规则相关的处理是在BeanDefinitionParserDelegate中完成的,完成这个处理需

Spring IOC源码详解之容器初始化

Spring IOC源码详解之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比较典型的代码 ClassPathResource res = new ClassPathResource("beans.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDe