Использовать файл TMX с AndEngine

У меня есть изометрический файл .TMX, созданный с помощью «Tiled», я использую AndEngine GLES1. Я хочу использовать его в качестве фона или карты. Я также хочу, чтобы движение моих «игроков» было привязано к тайлам, если это возможно. Я знаю, что есть некоторые вопросы, связанные с этим, но мне нужен фактический код только для отображения фона.

Вот мой единственный файл 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 это дает мне некоторые ошибки. Я использую новый класс и вставляю предоставленный код. Нужно ли создавать классы для любого из них? Связывание TMXproject выполняется через свойства - android и поле «добавить» внизу этой страницы?? Спасибо

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

    }

person AspiretoCode    schedule 23.08.2012    source источник


Ответы (2)


К сожалению, я могу только показать вам, как я это делаю с AndEngine GLES2. Однако я не уверен, что это возможно с версией GLES1. Но, может быть, вы можете попробовать рассказать нам о своем опыте.

сначала загрузите расширение TMX Tilemap из репозитория Git: 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 здесь вы найдете программу Java, с помощью которой вы можете загрузить файл карты и получить фиксированный карту, которую вы можете использовать в своем проекте. Посмотрите в разделе использование, какие параметры вам нужны.

надеюсь, что это все равно поможет :)

Кристоф

person GameDroids    schedule 23.08.2012
comment
Кристоф, спасибо за ответ. Я просто собираюсь портировать на GLES2, мне это нужно в любом случае, и у меня возникли проблемы с попыткой связать расширение TMX с GLES1. - person AspiretoCode; 23.08.2012
comment
GLES2 действительно отлично работает. Надеюсь, у вас не возникнет особых проблем с портированием. Если у вас есть проблемы с запуском этого TMX, просто скажите мне - я был бы рад поделиться опытом, который я получил, даже если он невелик ;) - person GameDroids; 25.08.2012
comment
Кристоф, я перешел на GLES2, все расширения были загружены как библиотечные проекты и связаны с моим проектом. Но я получаю ошибки в некоторых из этих команд. Как говорится, новый TMXLoader устарел. Затем он дает мне ошибки в context.getAssets(), vertexBufferObjectManager. А также о некоторых изометрических вещах. Если бы вы могли мне помочь, это было бы здорово. - person AspiretoCode; 27.08.2012
comment
Я немного отредактировал код, надеясь, что теперь он более понятен. методы getAssets() и `getVertexBufferObjectManager()` являются методами действия, поэтому вы можете использовать этот код в своем действии. Но вы также можете использовать его в отдельной сцене (как это сделал я. Вот почему они разные). - person GameDroids; 27.08.2012
comment
Спасибо, попробую и отпишусь как получилось! - person AspiretoCode; 27.08.2012
comment
Извините за боль, я все еще не могу заставить это работать. Я импортировал изометрическую ветвь Niffy TMXTiledMapExtension и пример (не клонировал подмодули), и я получил код в eclipse без ошибок. (хотя мне пришлось немного изменить attachChild (this.tmxLayer), так как он выдавал мне ошибки. Но по какой-то причине я получаю принудительное закрытие. Моя карта TMX была сжата gzip, она должна быть XML или что-то в этом роде? - person AspiretoCode; 28.08.2012

Убедитесь, что у вас есть основной TMXExtension, сначала потянув репозиторий вниз (я думаю, клон). Затем добавьте удаленный, используя мой URL-адрес репозитория.

Затем вы хотите спустить изометрическую ветвь и проверить ее.

Хорошее место для изучения git — здесь.

person NiffyDroid    schedule 28.08.2012