我有一个用“Tiled”创建的等距.TMX文件,我正在使用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() {
}
}
EDIT 切换到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;
}
}
答案 0 :(得分:4)
不幸的是,我只能告诉你我是如何用AndEngine GLES2做的。我不确定,这可以通过GLES1版本实现。但也许你可以尝试告诉我们你的经历。
首先从Git存储库下载TMX Tilemap Extension: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程序,您可以使用该程序加载地图文件,这将生成一个可以在项目中使用的固定地图。在使用情况下查看您需要的参数。
希望这无论如何都有帮助:)
了Christoph
答案 1 :(得分:3)