CocosEditor-java中的android项目传数据给Java项目(NodeReader相关)

以下介绍三种方法,给出大概思路:

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。这个还没试过,看了下源码,应该可行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值