2012-08-23 53 views
2

我有一個用「Tiled」創建的等軸測.TMX文件,我使用的是AndEngine GLES1。我想用它作爲背景或地圖。如果可能的話,我也希望將我的「玩家」運動綁在瓦片上。我知道有一些問題需要處理,但我需要實際的代碼來顯示背景。與AndEngine一起使用TMX文件

這是我唯一的java文件

package com.example.game; 

import java.util.LinkedList; 

import org.anddev.andengine.engine.Engine; 
import org.anddev.andengine.engine.camera.Camera; 
import org.anddev.andengine.engine.options.EngineOptions; 
import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation; 
import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; 
import org.anddev.andengine.entity.modifier.MoveModifier; 
import org.anddev.andengine.entity.scene.Scene; 
import org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener; 
import org.anddev.andengine.entity.scene.background.ColorBackground; 
import org.anddev.andengine.entity.sprite.Sprite; 
import org.anddev.andengine.entity.util.FPSLogger; 
    import org.anddev.andengine.input.touch.TouchEvent; 
import org.anddev.andengine.opengl.texture.TextureOptions; 
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; 
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory; 
import org.anddev.andengine.opengl.texture.region.TextureRegion; 
import org.anddev.andengine.ui.activity.BaseGameActivity; 

import android.view.Display; 

public class SimpleGame extends BaseGameActivity implements 
IOnSceneTouchListener { 
//Set up camera 
private Camera mCamera; 

//Set main scene 
private Scene mMainScene; 
//?? graphics variables? 
private BitmapTextureAtlas mBitmapTextureAtlas; 
private TextureRegion mPlayerTextureRegion; 
//declaring sprite variable for player character 
private Sprite player; 
//Equiping ammunition 
private LinkedList projectileLL; 
private LinkedList projectilesToBeAdded; 
private TextureRegion mProjectileTextureRegion; 


@Override 
public Engine onLoadEngine() { 
    //Preparing Engine giving it proper resolution (what you see on the screen) 
    final Display display = getWindowManager().getDefaultDisplay(); 
    int cameraWidth = display.getWidth(); 
    int cameraHeight = display.getHeight(); 

    mCamera = new Camera(0, 0, cameraWidth, cameraHeight); 

    return new Engine(new EngineOptions(true, ScreenOrientation.LANDSCAPE, 
    new RatioResolutionPolicy(cameraWidth, cameraHeight), mCamera)); 
} 

@Override 
public void onLoadResources() { 
    mBitmapTextureAtlas = new BitmapTextureAtlas(512, 512, 
     TextureOptions.BILINEAR_PREMULTIPLYALPHA); 

    BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); 
    // assinging the player.png image for the mPlayerTextureRegion 
    mPlayerTextureRegion = BitmapTextureAtlasTextureRegionFactory 
     .createFromAsset(this.mBitmapTextureAtlas, this, "player.png", 
     0, 0); 
    mEngine.getTextureManager().loadTexture(mBitmapTextureAtlas); 

    mProjectileTextureRegion = BitmapTextureAtlasTextureRegionFactory 
     .createFromAsset(this.mBitmapTextureAtlas, this, 
     "Projectile.png", 64, 0); 
} 

@Override 
public Scene onLoadScene() { 
    //??? Creating the scene? 
    mEngine.registerUpdateHandler(new FPSLogger()); 

    mMainScene = new Scene(); 

    mMainScene 
     .setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f)); 

    final int PlayerX = this.mPlayerTextureRegion.getWidth()/2; 
    final int PlayerY = (int) ((mCamera.getHeight() - mPlayerTextureRegion 
      .getHeight())/2); 

    // Using sprite to illustrate player 
    player = new Sprite(PlayerX, PlayerY, mPlayerTextureRegion); 
    // Place player on game screen 
    mMainScene.attachChild(player); 

    projectileLL = new LinkedList(); 
    projectilesToBeAdded = new LinkedList(); 

    mMainScene.setOnSceneTouchListener(this); 

    return mMainScene; 
} 
    // This method is used for shooting "bullets" 
    // Need to find a way to limit ammunition based on in game inventory 
     private void shootProjectile(final float pX, final float pY) { 

int offX = (int) (pX - player.getX()); 
int offY = (int) (pY - player.getY()); 
if (offX <= 0) 
    return; 

//Using projectile.png as sprite, what is .deepCopy??? 
final Sprite projectile; 
projectile = new Sprite(player.getX(), player.getY(), 
mProjectileTextureRegion.deepCopy()); 
mMainScene.attachChild(projectile, 1); 

int realX = (int) (mCamera.getWidth() + projectile.getWidth()/2.0f); 
float ratio = (float) offY/(float) offX; 
int realY = (int) ((realX * ratio) + projectile.getY()); 

int offRealX = (int) (realX - projectile.getX()); 
int offRealY = (int) (realY - projectile.getY()); 
float length = (float) Math.sqrt((offRealX * offRealX) 
     + (offRealY * offRealY)); 
float velocity = 480.0f/1.0f; // 480 pixels per 1 sec// 
float realMoveDuration = length/velocity; 

MoveModifier mod = new MoveModifier(realMoveDuration, 
projectile.getX(), realX, projectile.getY(), realY); 
projectile.registerEntityModifier(mod.deepCopy()); 

projectilesToBeAdded.add(projectile); 
    } 

public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { 

    if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN) { 
     final float touchX = pSceneTouchEvent.getX(); 
     final float touchY = pSceneTouchEvent.getY(); 
     shootProjectile(touchX, touchY); 
     return true; 
    } 
return false; 
} 


@Override 
public void onLoadComplete() { 


} 
    } 

編輯 切換到GLES2這是給我一些錯誤之後。我正在使用一個新類並插入提供的代碼。我是否需要爲其中的任何一個創建類?通過屬性 - android和頁面底部的「add」框鏈接TMXproject?謝謝

package com.example.game; 

import org.andengine.engine.camera.Camera; 
import org.andengine.engine.options.EngineOptions; 
import org.andengine.engine.options.ScreenOrientation; 
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; 
import org.andengine.entity.scene.Scene; 
import org.andengine.entity.scene.background.Background; 
import org.andengine.opengl.texture.TextureOptions; 
import org.andengine.ui.activity.SimpleBaseGameActivity; 
import org.andengine.util.debug.Debug; 

public class StarterGame extends SimpleBaseGameActivity { 

static final int CAMERA_WIDTH = 800; 
static final int CAMERA_HEIGHT = 480; 
private Object tiledMap; 

@Override 
public EngineOptions onCreateEngineOptions() { 
    //Create view for the scene?? 
    Camera mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
    return new EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR, 
      new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera); 
} 

@Override 
protected void onCreateResources() { 
    // TODO Auto-generated method stub 
    try { 
     final TMXLoader tmxLoader = new TMXLoader(context.getAssets(), textureManager, TextureOptions.NEAREST, vertexBufferObjectManager, new ITMXTilePropertiesListener() { 
      @Override 
      public void onTMXTileWithPropertiesCreated(final TMXTiledMap pTMXTiledMap, final TMXLayer pTMXLayer, final TMXTile pTMXTile, final TMXProperties<TMXTileProperty> pTMXTileProperties) { 
        // do stuff with tiles that have properties... 
      } 
     }); 
     this.tiledMap = tmxLoader.loadFromAsset("tmx/bg.tmx"); 
      this.tiledMap.setIsometricDrawMethod(TMXIsometricConstants.DRAW_METHOD_ISOMETRIC_CULLING_PADDING); 
    } catch (final TMXLoadException e) { 
      Debug.e(e); 
    } 
} 

@Override 
protected Scene onCreateScene() { 
    //Setup scene with background color only 
    Scene scene = new Scene(); 
    scene.setBackground(new Background(0.09804f, 0.6274f, 0)); 
    return scene; 
} 

    } 

回答

4

不幸的是,我只能告訴你我是怎麼用AndEngine GLES2做的。但我不確定,GLES1版本可能會這樣。但也許你可以嘗試告訴我們你的經歷。

第一下載從Git倉庫的TMX tilemap的擴展:https://github.com/nicolasgramlich/AndEngineTMXTiledMapExtension

第二鏈路與AndEngineTMXTiledMapExtension工程項目(需要將其標記爲庫)

當這些兩個項目鏈接,你可以實際使用這樣的擴展:

import org.andengine.extension.tmx.TMXLayer; 
import org.andengine.extension.tmx.TMXLoader; 
import org.andengine.extension.tmx.TMXLoader.ITMXTilePropertiesListener; 
import org.andengine.extension.tmx.TMXProperties; 
import org.andengine.extension.tmx.TMXTile; 
import org.andengine.extension.tmx.TMXTileProperty; 
import org.andengine.extension.tmx.TMXTiledMap; 
import org.andengine.extension.tmx.util.constants.TMXIsometricConstants; 
import org.andengine.extension.tmx.util.exception.TMXLoadException; 


public class YourActivity extends SimpleBaseGameActivity { 
    private TMXTiledMap tiledMap; 
    private TMXLayer tmxLayer; 

    @Override 
    protected void onCreateResources() { 
     try { 
      final TMXLoader tmxLoader = new TMXLoader(getAssets(), getTextureManager(), TextureOptions.NEAREST, getVertexBufferObjectManager(), new ITMXTilePropertiesListener() { 
      @Override 
      public void onTMXTileWithPropertiesCreated(final TMXTiledMap tmxTiledMap, final TMXLayer tmxLayer, final TMXTile tmxTile, final TMXProperties<TMXTileProperty> tmxTileProperties) { 
        // do stuff with tiles that have properties... 
      } 
      }); 
      this.tiledMap = tmxLoader.loadFromAsset("tmx/yourMap.tmx"); 
      this.tiledMap.setIsometricDrawMethod(TMXIsometricConstants.DRAW_METHOD_ISOMETRIC_CULLING_PADDING); 
     } catch (final TMXLoadException e) { 
      Debug.e(e); 
     } 

    } 

    @Override 
    protected Scene onCreateScene() { 
      this.tmxLayer = this.tiledMap.getTMXLayers().get(0); // the 0 is just an index of the layer. It depends on how many layers you created within Tiled 
      attachChild(this.tmxLayer); 
    } 

} 

當您包含等軸測圖時,您可能會看到一些像素僞像(黑色線條,拼貼塊在一起) - 這是一個常見問題,並且存在以下修復: http://code.google.com/p/andenginetmxtiledmapartifactfixer/ 此處您會發現一個Java程序,可以加載你的地圖文件,這將產生一個固定的地圖,你可以在你的項目中使用。查看的使用情況查看您需要哪些參數。

希望這有助於反正:)

克里斯托夫

+0

Christoph,謝謝你的回答。我只是想要移植到GLES2,無論如何我需要,我正在嘗試將TMXextension與GLES1鏈接起來。 – AspiretoCode

+0

GLES2確實可以正常工作。我希望你沒有太多的麻煩移植。如果您有任何問題需要解決TMX問題,請告訴我 - 我會很樂意分享我所做的體驗,即使它不是Mouch;) – GameDroids

+0

Christoph,我已經更改爲GLES2,將所有擴展加載爲圖書館項目並鏈接到我的項目。但是我在這些命令中遇到了一些錯誤。就像它說「新的TMXLoader」已被棄用。然後它給了我關於context.getAssets(),vertexBufferObjectManager的錯誤。還有一些等距的東西。如果你能幫助我,那會很棒。 – AspiretoCode

3

請確保您有主TMXExtension,先通過拉回購下來(我想克隆)。然後使用我的repo url添加遙控器。

然後你想拉下等軸測分支並檢查出來。

學習git的好地方是here