一 跨平臺Cocos2d-Java引擎基礎教程之項目框架介紹

項目結構:

瞭解本章的時候,相信大家已經成功把hello world在工具cocoseditor運行起來了,現在我們來分析cocos2d-java的項目結構

  • src聚合java代碼和asserts資源,assets裏面可以存放cce佈局文件,圖片textures,聲音,字體等;java裏面用戶可以自定義包名,裏面存放java代碼;
  • target存放了代碼編譯後的文件,target的assets裏面的文件基本從main-assets目錄拷貝而來,而帶有.plist的文件將自動圖片打包,工作目錄默認是target-assets;
  • 因爲cocoseditor是基於idea而來,其他.idea和.iml文件都是idea工具自動生成的,無需關心;
  • 在External Libraries裏面有CocosJDK,裏面包含了Java的jdk(在classpath-1.1.jar文件)和cocos2d-java的引擎api(在cocosjava-3.2.jar裏面)





cce是什麼:


   cce是cocoseditor的簡稱,可以理解爲是界面設計,可以去表示一個scene,sprite,layer,node等,默認的main.cce是一個場景。cce和官方的cocostudio意思比較接近,它不僅支持可見可得的拖動控件,而且可以通過xml代碼直接編寫。推薦先通過可見可得搭建好基礎控件,然後通過xml代碼調整。

有一點需要記清楚:cce裏面只是結構化的代碼,最後編譯的時候還是會轉化成相應的java或者c++代碼,比如裏面有<Sprite name="xx"  positionX=100 positionY=100/>

最終還是會轉成Sprite sprite=Sprite.create()  sprite.setPosition(100,100) 這樣的java的代碼





cce關聯controller:

 controller表面很好理解,就是控制中心,對一個cce進行控制,也可以對任何控件進行控制;

我們通過xml代碼簡單分析一下cce文件。基本遵從cocos的元素,一個Scene上有一個Layer,Layer上面有背景Sprite,而這個Sprite上面有一個關閉按鈕Button。通過Compenent可以關聯代碼SceneController;java包名需要寫明org.ccj.game.hello;



可見可得界面設計區域,可看圖片文字瞭解基本概念



元素如何綁定@Bind(Sprite,Button等)

進入hello工程是,我們發現背景圖片cocos2dx有縮放的動畫,我們可能疑問,在cce裏面設計好的圖片,代碼裏面怎麼關聯並進行操作?

首先在cce裏面命名該精靈,如在main.cce裏面的代碼:圖片Sprite name=“bgSprite"  按鈕Button name="closeButton"

 <Sprite name="bgSprite" texture="textures/main.plist/HelloWorld.png" positionX="241.0" positionY="162.0">
            <Button name="closeButton" positionX="441.0" positionY="284.0" textureNormal="textures/main.plist/CloseNormal.png"
                    texturePressed="textures/main.plist/CloseSelected.png"/>
        </Sprite>

我們已經通過
<Component name="org.ccj.game.hello.SceneController"/>
把main.cce和SceneController.java關聯好了,所以在SceneController裏面通過@Bind標籤直接關聯精靈。這裏bgSprite名字和cce裏面的名字是一致的,而按鈕button還需要@Action綁定。下面的方法是通用,以後其他操作基本類似

 @Bind()
 public Sprite bgSprite;

    @Override
    public void onEnter() {
        super.onEnter();
        bgSprite.runAction(Sequence.create(ScaleTo.create(0.5f, 0.3f), ScaleTo.create(0.5f, 1f)));
    }

 @Bind("closeButton")
 @Action(Action.ActionType.WidgetTouchUp)
    public void onCloseClicked(Ref ref) {
        Director.getInstance().end();
    }


如何調用讀取cce文件

我們分析一下Main.java文件;首先進入public static void main,Application啓動,getTargetPlatform判斷當前的系統,調取openGL,創建了一個指定大小的View;

然後進入mainScene函數裏面,實例導演,設置分辨率,狀態參數,然後runWithScene(場景跳轉函數),去調取main.cce文件。這裏我們封裝了一個NodeReader函數,來獲取layouts文件下面的cce文件,可以readScene,也可以readLayer等等;

public class Main {

    public static final int DESIGN_WIDTH = 480;
    public static final int DESIGN_HEIGHT = 320;

    public static void mainScene() {
        String paths[] = {
                ""
        };
        for (String path : paths) {
            FileUtils.getInstance().addSearchPath(path);
        }
        Director director = Director.getInstance();
        director.setDisplayStats(true);

        director.getOpenGLView().setDesignResolutionSize(DESIGN_WIDTH, DESIGN_HEIGHT, GLView.POLICY_EXACT_FIT);
        director.runWithScene(NodeReader.create().readScene("layouts/main.cce"));
    }

    public static void main(String[] args) {
        int w = DESIGN_WIDTH;
        int h = DESIGN_HEIGHT;

        if (args != null && args.length >= 2) {
            w = Integer.parseInt(args[0]);
            h = Integer.parseInt(args[1]);
        }

        final int width = w;
        final int height = h;

        Application app = new Application() {
            public boolean applicationDidFinishLaunching() {
                if (OS_WINDOWS == getTargetPlatform()
                        || OS_ANDROID == getTargetPlatform()
                        || OS_MAC == getTargetPlatform()) {
                    GLView eglView = GLView.create("CocosPlayer");
                    eglView.setFrameSize(width, height);
                    Logger.log("width  " + width + " height " + height);
                    Director.getInstance().setOpenGLView(eglView);
                }
                Main.mainScene();
                return true;
            }
        };
        app.run();
    }
}



API在哪裏:

很多同學一直在問,api在哪裏,因爲cocos2d-java只是jni,所以你看到的都是和c++對應好的jni接口代碼;比如,你在SceneController.java裏面看到Sprite,你可以通過ctrl+鼠標單擊,進入Sprite的api,如下圖;你發現命名和使用和coos2dx是一樣。





JNI到底如何運作:

還是以Sprite爲例子,看上面的Sprite圖片,假如用戶在代碼裏面使用Sprite.create()這樣的函數;首先我們看到JNI裏面是存在create()這個函數的,代碼運行的時候,這個create()會去調取工具cdk-bin-cocosjava.dll裏面的c++庫,庫裏面有對應的代碼存在;引擎底層核心還是c++,所以保證java引擎的效率;


簡單代碼修改:

現在我修改SceneController裏面的代碼,實現功能如下:創建5*5的圖片表格,小圖片各自隨機旋轉動畫,點擊按鈕,創建的5*5圖片表格全部刪除;

代碼如下,童鞋可以把下面代碼拷貝過去,試試運行效果。

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

    @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));
        createManySprites();
    }

    public void createManySprites() {
        for (int i = 0; i < 25; i++) {
            Sprite sprite = Sprite.createWithSpriteFrameName("HelloWorld.png");
            sprite.setScale(0.1f);
            sprite.setAnchorPoint(0.5f, 0.5f);
            sprite.setTag(101);
            sprite.setPosition(50 + i / 5 * 80, 50 + i % 5 * 60);
            sprite.runAction(RepeatForever.create(RotateBy.create((float) (Math.random()), 90)));
            owner.addChild(sprite);
        }
    }

    @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());
        int counts = owner.getChildrenCount();
        for (int i = 0; i < counts; i++) {
            owner.removeChildByTag(101);
        }
    }
}

運行效果圖









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章