Andengine - 在旋转精灵(炮塔/舰船)前射击子弹

时间:2013-11-01 16:21:41

标签: android rotation 2d andengine game-engine

我正在与Andengine进行一场比赛,我在旋转精灵的拍摄中被困了2天。我不是几何学的英雄,已经问过老师,但他也没能给我正确的答案。那么谁是数学英雄并帮助我:)。

问题在于我无法弄清楚子弹在炮塔前面产卵的位置。旋转并找到子弹必须到达的目的地是没有问题的。它只涉及产卵点。

我为这个问题删除了很多不感兴趣的代码。

好的,这是转塔旋转的旋转代码:

public class AlienShip extends Ship {

public static final float BASE_ROTATION_SPEED = 0.25f;
public static final int DEFAULT_IMAGE_ROTATION = 90; //90 degrees 



protected PlayerShip ship;


public AlienShip(float pX, float pY, TextureRegion pTextureRegion,
        VertexBufferObjectManager pVertexBufferObject,FixedStepPhysicsWorld pw, int baseDurability) {

    super(pX, pY, pTextureRegion, pVertexBufferObject, pw, baseDurability);
}

public void rotateToPlayer()
{
    if (ship != null) {

        float dX = this.getX() - ship.getX();
        float dY = this.getY() - ship.getY();

        float angle = (float) Math.atan2(-dY, dX);

        float rotation = MathUtils.radToDeg(angle) + DEFAULT_IMAGE_ROTATION;

        RotationModifier rotMod = new RotationModifier(BASE_ROTATION_SPEED, this.getRotation(), rotation);
        this.registerEntityModifier(rotMod);

    }

}

public void rotateToInitPos() {

    RotationModifier rotMod = new RotationModifier(BASE_ROTATION_SPEED, this.getRotation(), 0);
    this.registerEntityModifier(rotMod);
}
}

上面的代码工作正常。

以下是该船正在拍摄的激光代码。 阅读评论,找出女巫部分不起作用。

public class GameScene extends Scene {

protected PlayerShip playerShip;



private SpawnCallback createShootCallback(boolean player) {

 return new SpawnCallback() {
            @Override
            public void spawn(SpawnTimer spawnTimer) {
                PhysicsSprite laser = null;
                AlienShip alienShip = (AlienShip) spawnTimer.getPhysicsSprite();


                    // laser = alienMissilePool.getMissileFromPool(x,y)
                    //spawn the laser in front of the rotating ship [Not working :( ]
                    laser = alienMissilePool.getMissileFromPool( ( alienShip.getX() * FloatMath.cos(MathUtils.degToRad(rotation)) - ((1280 - alienShip.getY() - alienShip.getY()/2) * FloatMath.sin(MathUtils.degToRad(rotation)) ) ) ,
                                                              ( alienShip.getX() * FloatMath.sin(MathUtils.degToRad(rotation)) + ((1280 - alienShip.getY() - alienShip.getY()/2) * FloatMath.cos(MathUtils.degToRad(rotation)) ) ) );

                    //Set the rotation from the laser same to the ship rotation [Is working perfectly].
                    float rotation = alienShip.getRotation();
                    laser.setRotation(rotation);

                    //Set laser speed and direction [Is working perfectly]
                    float pX = 0.01f * (playerShip.getX() - laser.getX());
                    float pY = 0.01f * (playerShip.getY() - laser.getY());

                    laser.getSpriteBody().setLinearVelocity(pX, pY);


                spawnPhysicsSprite(laser);
                }

        };
}

}

以下是指向显示x轴和y轴值的图形的链接。 http://s24.postimg.org/citz29339/gamescene.png

谢谢!

1 个答案:

答案 0 :(得分:0)

为什么不把一个物体(实体)放在炮塔的位置而不是进入数学,而是将它的位置用作激光的生成点?

所以你的炮塔会在枪的地方附上一个实体。 告诉我你是否需要一个示例代码