以下介绍三种方法,给出大概思路:
1.用回调函数的办法,基于helloWorld写了个中介类。可以在Activity中更新数据,在Cocos2d中刷新数据。如下
package org.ccj.game.hello;
import org.ccj.Logger;
/**
* Created by Administrator on 2014/10/3.
*/
public class ActivityController {
public int getScore() {
return mScore;
}
public void setScore(int pScore) {
mScore = pScore;
if(mCallback!=null){
Logger.log("mCallback!=null");
mCallback.onChangeCallback();
}
}
private int mScore;
static boolean CALLBACK_SETTED;
private static ActivityController mController;
private onChangeCallback mCallback;
public static ActivityController getInstance(){
if(mController == null){
mController = new ActivityController();
}
return mController;
}
public void setChangeCallback(onChangeCallback callback){
mCallback = callback;
}
}
接口类
package org.ccj.game.hello;
/**
* Created by Administrator on 2014/10/3.
*/
public interface onChangeCallback {
public void onChangeCallback();
}
有了这两个类,就可以在Activity中操作cocos2d的项目变更了。
一般情况下Activity没办法控制SceneController.java(默认类),但利用回调,就可以,SceneController.java初始化如下
package org.ccj.game.hello;
import org.ccj.Director;
import org.ccj.Logger;
import org.ccj.base.Color3B;
import org.ccj.base.Ref;
import org.ccj.d2.Label;
import org.ccj.d2.Node;
import org.ccj.d2.Sprite;
import org.ccj.d2.action.RepeatForever;
import org.ccj.d2.action.RotateBy;
import org.ccj.d2.action.ScaleTo;
import org.ccj.d2.action.Sequence;
import org.ccj.editor.cce.Action;
import org.ccj.editor.cce.Bind;
import org.ccj.editor.cce.NodeController;
/**
*/
public class SceneController extends NodeController{
@Bind()
public Sprite bgSprite;
/* @Bind()
public Label scoreLabel;
*/
public ActivityController mController;
@Override
public void onEnter() {
super.onEnter();
bgSprite.runAction(Sequence.create(ScaleTo.create(0.5f, 0.3f), ScaleTo.create(0.5f, 1f)));
bgSprite.setColor(new Color3B(50, 100, 30));
mController = ActivityController.getInstance();
org.ccj.Logger.log("onEnter");
mController.setChangeCallback(new onChangeCallback() {
@Override
public void onChangeCallback() {
int _Score = mController.getScore();
//setScore(_Score);
}
});
org.ccj.Logger.log("mController.setChangeCallback");
mController.CALLBACK_SETTED=true;
}
/* public void setScore(int score){
scoreLabel.setString(score+"");
}*/
@Override
public void onExit() {
super.onExit();
}
@Override
public void onUpdate(float delta) {
super.onUpdate(delta);
}
@Bind("closeButton")
@Action(Action.ActionType.WidgetTouchUp)
public void onCloseClicked(Ref ref) {
Logger.log("count==" + owner.getChildrenCount());
if(owner.getChildrenCount()<=1) {
Director.getInstance().end();
}
int counts = owner.getChildrenCount();
for (int i = 0; i < counts; i++) {
owner.removeChildByTag(101);
}
}
}
Activity类
package org.ccj.game.hello;
/**
* Copyright(c) Shanghai YiJun Network Technologies Inc. All right reserved.
*/
import android.os.Bundle;
import android.util.Log;
import org.ccj.android.CocosJavaActivity;
/**
* -
* -Game Engine:Cocos2d-Java
* -
* -Game Develop Tool:CocosEditor
* -
* -Doc Links
* http://www.cocoseditor.com/ (Office Website)
* http://blog.makeapp.co/ (Office Blog(
* http://blog.csdn.net/touchsnow (csdn Blog)
* https://github.com/makeapp (github)
* -
* -Support
* E-Mail: zuowen@makeapp.co
* QQ : 232361142
*/
public class GameActivity
extends CocosJavaActivity {
static String TAG = "GameActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"onCreate");
new Thread(new ScoreRun()).start();
}
public class ScoreRun implements Runnable{
int score;
public ScoreRun(){score = 0;}
@Override
public void run() {
ActivityController controller = ActivityController.getInstance();
while(!ActivityController.CALLBACK_SETTED){
Log.e(TAG,"sleep");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
while(true){
Log.e("GameActivity", score + "");
controller.setScore(score);
score++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void main(String[] strings) {
Main.main(strings);
}
public void onBackPressed() {
finish();
}
}
2.获取控件(NodeReader.create()相关)
后来发现,在Activity中,也可以用下面方法获得控件,但是我刷新控件值时候,会报错,暂时还没解决。据说是多线程造成的,可能是Activity和Java项目同时操作这个控件了。synchronize了mLabel后发现永远不会有机会执行。看来要研究下多线程的设计。
10-03 21:46:08.949 22181-22181/org.ccj.game.hello E/GameActivity﹕ handle msg
10-03 21:46:08.949 22181-22181/org.ccj.game.hello A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x3f800000 (code=1), thread 22181 (.ccj.game.hello)
mScene = NodeReader.create().readScene("layouts/main.cce");
Log.e(TAG, mScene.toString());
mLayer = Layer.cast(mScene.getChildByName("mainLayer"));
Log.e(TAG,mLayer.toString());
mLabel = Label.cast(mLayer.getChildByName("scoreLabel"));
Log.e(TAG,mLabel.toString());
float x = mLabel.getPosition().getX();
float y = mLabel.getPosition().getY();
运行结果
10-03 21:46:07.949 22181-22220/org.ccj.game.hello E/GameActivity﹕ org.ccj.Scene[address=0x76e8a9f0,position=0,limit=0,capacity=0,deallocator=null]
10-03 21:46:07.949 22181-22220/org.ccj.game.hello E/GameActivity﹕ org.ccj.d2.Layer[address=0x76e8ac20,position=0,limit=0,capacity=0,deallocator=null]
10-03 21:46:07.949 22181-22220/org.ccj.game.hello E/GameActivity﹕ org.ccj.d2.Label[address=0x76e8c440,position=0,limit=0,capacity=0,deallocator=null]
10-03 21:46:07.949 22181-22220/org.ccj.game.hello E/GameActivity﹕ x = 101.0|y= 96.0
10-03 21:46:07.949 22181-22220/org.ccj.game.hello E/GameActivity﹕ 0
3.调用FunctionFactory。这个还没试过,看了下源码,应该可行。