Android的AndEngine物理 - 图像问题 [英] Android AndEngine Physics - images issue

查看:198
本文介绍了Android的AndEngine物理 - 图像问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的一个小游戏/项目,我决定使用 AndEngine 它因为基本上添加/在发动机上拆下物理功能是所有我需要的。但似乎我与它一点点问题。我要像36不同的图片上添加一个场景,并能够将其删除的选择。问题是,我的图片被损坏且它没有显示所有图像,就在第2位。我缺少的东西或我做的不对吗?下面是我得到我的设备上:

I'm working on a little game/project and I decide to use AndEngine for it because basically the Add/Remove Physics functionality in that engine was all I need. But it seems that I have a little problem with it. I have to add like 36 different pictures on a scene and be able to remove them on select. The problem is that my images are damaged and it's not showing all the images, just the first two. Am I missing something or I'm doing it wrong? Here is what I get on my device :

和这里是我的code:

and here is my code :

public class Game extends BaseExample implements IAccelerometerListener, IOnSceneTouchListener, IOnAreaTouchListener {

// ===========================================================
// Constants
// ===========================================================
private static final int CAMERA_WIDTH = 980;
private static final int CAMERA_HEIGHT = 560;

// ===========================================================
// Fields
// ===========================================================


private BitmapTextureAtlas mBitmapTextureAtlas;

private TextureRegion firstSprite;
private TextureRegion secondSprite;
private TextureRegion thirdSprite;
private TextureRegion fourthSprite;
private TextureRegion fifthSprite;
private TextureRegion sixSprite;
private TextureRegion sevenSprite;
private TextureRegion eightSprite;
private TextureRegion nineSprite;
private TextureRegion tenSprite;

private Scene mScene;

private PhysicsWorld mPhysicsWorld;
private int mFaceCount = 0;

@Override
public Engine onLoadEngine() {
    Toast.makeText(this, "Touch the screen to add objects. Touch an object to remove it.", Toast.LENGTH_LONG).show();
    final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);

    final EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
    engineOptions.getTouchOptions().setRunOnUpdateThread(true);
    return new Engine(engineOptions);
}

@Override
public void onLoadResources() {
    this.mBitmapTextureAtlas = new BitmapTextureAtlas(128, 128, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
    this.firstSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "1.png", 0, 0); // 64x32
    this.firstSprite.setTextureRegionBufferManaged(false);
    this.secondSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "2.png", 0, 32); // 64x32
    this.secondSprite.setTextureRegionBufferManaged(false);
    this.thirdSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "3.png", 0, 32); // 64x32
    this.thirdSprite.setTextureRegionBufferManaged(false);
    this.fourthSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "4.png", 0, 32); // 64x32
    this.fourthSprite.setTextureRegionBufferManaged(false);
    this.fifthSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "5.png", 0, 32); // 64x32
    this.fifthSprite.setTextureRegionBufferManaged(false);
    this.sixSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "6.png", 0, 32); // 64x32
    this.sixSprite.setTextureRegionBufferManaged(false);
    this.sevenSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "7.png", 0, 32); // 64x32
    this.sevenSprite.setTextureRegionBufferManaged(false);
    this.eightSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "8.png", 0, 32); // 64x32
    this.eightSprite.setTextureRegionBufferManaged(false);
    this.nineSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "9.png", 0, 32); // 64x32
    this.nineSprite.setTextureRegionBufferManaged(false);
    this.tenSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "10.png", 0, 32); // 64x32
    this.tenSprite.setTextureRegionBufferManaged(false);
    this.mEngine.getTextureManager().loadTexture(this.mBitmapTextureAtlas);

}

@Override
public Scene onLoadScene() {
    this.mEngine.registerUpdateHandler(new FPSLogger());

    this.mScene = new Scene();
    this.mScene.setBackground(new ColorBackground(204f, 204f, 204f));
    this.mScene.setOnSceneTouchListener(this);

    this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false);

    final Shape ground = new Rectangle(0, CAMERA_HEIGHT - 2, CAMERA_WIDTH, 2);
    final Shape roof = new Rectangle(0, 0, CAMERA_WIDTH, 2);
    final Shape left = new Rectangle(0, 0, 2, CAMERA_HEIGHT);
    final Shape right = new Rectangle(CAMERA_WIDTH - 2, 0, 2, CAMERA_HEIGHT);

    final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f);
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, wallFixtureDef);
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, wallFixtureDef);
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, wallFixtureDef);
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, wallFixtureDef);

    this.mScene.attachChild(ground);
    this.mScene.attachChild(roof);
    this.mScene.attachChild(left);
    this.mScene.attachChild(right);

    this.mScene.registerUpdateHandler(this.mPhysicsWorld);

    this.mScene.setOnAreaTouchListener(this);

    return this.mScene;
}

@Override
public void onLoadComplete() {

}

@Override
public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
        ITouchArea pTouchArea, float pTouchAreaLocalX,
        float pTouchAreaLocalY) {

    if(pSceneTouchEvent.isActionDown()) {
        this.removeFace((Sprite)pTouchArea);
        return true;
    }

    return false;
}

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
    if(this.mPhysicsWorld != null) {
        if(pSceneTouchEvent.isActionDown()) {
            this.addFace(pSceneTouchEvent.getX(), pSceneTouchEvent.getY());
            return true;
        }
    }
    return false;
}

@Override
public void onAccelerometerChanged(AccelerometerData pAccelerometerData) {
    final Vector2 gravity = Vector2Pool.obtain(pAccelerometerData.getX(), pAccelerometerData.getY());
    this.mPhysicsWorld.setGravity(gravity);
    Vector2Pool.recycle(gravity);
}

private void addFace(final float pX, final float pY) {
    this.mFaceCount++;

    Sprite face = null;
    Body body = null;

    final FixtureDef objectFixtureDef = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);

    /*if(this.mFaceCount % 2 == 0) {
        face = new Sprite(pX, pY, this.firstSprite);
        body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
    } else {
        face = new Sprite(pX, pY, this.secondSprite);
        body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
    }*/

    switch(this.mFaceCount){
    case 1:
            face = new Sprite(pX, pY, this.firstSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;
    case 2:
            face = new Sprite(pX, pY, this.secondSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;
    case 3:
            face = new Sprite(pX, pY, this.thirdSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;
    case 4:
            face = new Sprite(pX, pY, this.fourthSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;
    case 5:
            face = new Sprite(pX, pY, this.fifthSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;
    case 6:
            face = new Sprite(pX, pY, this.sixSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;
    case 7:
            face = new Sprite(pX, pY, this.sevenSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;
    case 8:
            face = new Sprite(pX, pY, this.eightSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;
    case 9:
            face = new Sprite(pX, pY, this.nineSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;
    case 10:
            face = new Sprite(pX, pY, this.tenSprite);
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
        break;

    }

    if(this.mFaceCount<=9){
        this.mScene.registerTouchArea(face);
        this.mScene.attachChild(face);
        this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true));
    }
}

@Override
public void onResumeGame() {
    super.onResumeGame();

    this.enableAccelerometerSensor(this);
}


private void removeFace(final Sprite face) {
    final PhysicsConnector facePhysicsConnector = this.mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(face);

    this.mPhysicsWorld.unregisterPhysicsConnector(facePhysicsConnector);
    this.mPhysicsWorld.destroyBody(facePhysicsConnector.getBody());

    this.mScene.unregisterTouchArea(face);
    this.mScene.detachChild(face);

    System.gc();
    }

}

任何想法,是我的错?

推荐答案

的主要问题是与你的 onLoadResources 方法。

The main problem is with your onLoadResources method.

一个纹理(你的情况BitmapTextureAtlas)仅仅是一个包含所有小图像的大画布。

A Texture (BitmapTextureAtlas in your case) is simply a large canvas containing all small images.

现在,该方法 BitmapTextureAtlasTextureRegionFactory.createFromAsset(..) 2接收数字参数(2最后参数)。这些都是用于在纹理图像位置。

Now, the method BitmapTextureAtlasTextureRegionFactory.createFromAsset(..) receives 2 numerical parameters (the 2 last parameters). These are used for the image position on the texture.

现在,看看你在做什么:加载所有图像在相同的位置!因此,一些图像(加载的最后一个图像 - 10.png)覆盖其他...

Now, take a look at what are you doing: Loading all of the images in the same position! So some images (The last image loaded - 10.png) override the others...

有关更多信息,请阅读纹理和放大器; TextureRegions 这里

For more information, read about Textures & TextureRegions here.

这是你在你的code另一个问题 - 在你的 addFace 方法,当你调用 PhysicsFactory.createBoxBody(...) 身体的创建的,它会自动的加入的你的物理世界,即使你没有注册它之间和精灵之间的物理连接器,即使你不重视精灵现场。

Another problem that you have in your code - In your addFace method, when you call PhysicsFactory.createBoxBody(...) the body is created and it automatically joins your physics world, even if you don't register a physics connector between it and between the sprite, and even if you don't attach the sprite to the scene.

创建只有当你是一个身体的确定的你会需要它。否则,一定要摧毁它。

Only create a body when you are sure you'll need it. Otherwise, make sure you destroy it.

这篇关于Android的AndEngine物理 - 图像问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆