AndEngine如何一次性移除子弹并射出一颗子弹?

时间:2011-08-24 22:15:18

标签: java android andengine

我正在使用Andengine for android,我创建了一个代码,当我触摸屏幕时,我的播放器会发射子弹。

现在我想做两件事

首先:我希望子弹在与敌人发生碰撞时被移除 第二:我希望一次只能射击子弹。因此,只要子弹没有击中敌人,我就不希望发射子弹的方法被召唤。

这是我创建的代码 我最小化了所有不重要的代码

public class ShooterActivity extends BaseGameActivity implements IOnSceneTouchListener,IAccelerometerListener{

//Variables
private static final int CAMERA_WIDTH = 720;
private static final int CAMERA_HEIGHT = 480;
private Camera mCamera;
private BitmapTextureAtlas mBitmapTextureAtlas;
private TiledTextureRegion mTiledTextureRegion;
private TextureRegion mBulletTextureRegion;
private AnimatedSprite facebox;
private AnimatedSprite enemy;
private Sprite bulletsprite;
private Scene mScene;
private PhysicsWorld mPhysicsWorld;
private Shape ground, roof, right, left;
private Body body, bulletbody, enemybody;
private FixtureDef mFixtureDef = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);
private TiledTextureRegion enemyTiled;
private boolean pFlippedHorizontal = true;



@Override
public Engine onLoadEngine() {
    // TODO Auto-generated method stub
    this.mCamera = new Camera(0,0,CAMERA_WIDTH,CAMERA_HEIGHT);
    return new Engine(new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH,CAMERA_HEIGHT),this.mCamera));
}

@Override
public void onLoadResources() {
    // TODO Auto-generated method stub
    this.mBitmapTextureAtlas = new BitmapTextureAtlas(1024,1024, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
    this.mTiledTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mBitmapTextureAtlas, this, "gfx/player.png", 0, 0, 8, 1);
    this.enemyTiled = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mBitmapTextureAtlas, this, "gfx/enemy.png", 200, 500, 8, 1);
    this.mBulletTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mBitmapTextureAtlas, this, "gfx/badge.png", 200, 200);
    this.mEngine.getTextureManager().loadTexture(mBitmapTextureAtlas);
}

@Override
public Scene onLoadScene() {
    // TODO Auto-generated method stub
    this.mEngine.registerUpdateHandler(new FPSLogger());
    mScene = new Scene();
    mScene.setBackground(new ColorBackground(0,0,0));
    this.mPhysicsWorld = new PhysicsWorld(new Vector2(0,SensorManager.GRAVITY_EARTH), false);
    //Walls
    final FixtureDef wallFixture = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);
    roof = new Rectangle(0, 0, CAMERA_WIDTH, 2);
    ground = new Rectangle(0,CAMERA_HEIGHT ,CAMERA_WIDTH,2);
    left = new Rectangle(0,0,2,CAMERA_HEIGHT);
    right = new Rectangle(CAMERA_WIDTH -2, 0,2,CAMERA_HEIGHT);
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, wallFixture);
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, wallFixture);
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, wallFixture);
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, wallFixture);
    this.mScene.attachChild(roof);
    this.mScene.attachChild(ground);
    this.mScene.attachChild(left);
    this.mScene.attachChild(right);
    //facebox
    facebox = new AnimatedSprite(150,150, this.mTiledTextureRegion);
    facebox.setScale(.75f);
    facebox.animate(200);
    body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, facebox, BodyType.DynamicBody, mFixtureDef);
    this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(facebox,body,true,false));
    this.mScene.attachChild(facebox);
    //enemy
    enemy = new AnimatedSprite(500,150,this.enemyTiled);
    enemy.animate(200);
    enemy.setScale(.75f);
    enemy.setFlippedHorizontal(pFlippedHorizontal);
    this.mScene.attachChild(enemy);
    enemybody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, enemy, BodyType.DynamicBody, mFixtureDef);
    this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(enemy,enemybody,true,false));
    //scene
    this.mScene.setOnSceneTouchListener(this);
    this.mScene.registerUpdateHandler(mPhysicsWorld);
    return mScene;

}

@Override
public void onLoadComplete() {
    // TODO Auto-generated method stub

}

//touch the screen to create bullets
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
    // TODO Auto-generated method stub
    if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN){
        runOnUpdateThread(new Runnable(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
            fire();
            }

        });

        //here I want to be able to remove the bullets when it hits the enemy but not sure what method to use
        this.mScene.registerUpdateHandler(new IUpdateHandler(){

            @Override
            public void onUpdate(float pSecondsElapsed) {
                // TODO Auto-generated method stub
                if(bulletsprite.collidesWith(enemy)){
                }   
            }
            @Override
            public void reset() {
                // TODO Auto-generated method stub
            }
        });
    }
    return false;
}
//method to create bullets
public void fire(){
    bulletsprite = new Sprite(this.facebox.getX() + 15, this.facebox.getY() -5, this.mBulletTextureRegion);
    bulletsprite.setScale(.5f);
    bulletbody = PhysicsFactory.createCircleBody(this.mPhysicsWorld, bulletsprite, BodyType.DynamicBody, mFixtureDef);
    this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(bulletsprite, bulletbody, true, true));
    final Vector2 speed = Vector2Pool.obtain(50, 0);
    bulletbody.setLinearVelocity(speed);
    Vector2Pool.recycle(speed);
    this.mScene.attachChild(bulletsprite);
}

//nothing here just accelerometer
@Override
public void onAccelerometerChanged(AccelerometerData pAccelerometerData) {
    // TODO Auto-generated method stub
    final Vector2 gravity = Vector2Pool.obtain(pAccelerometerData.getX() *3, 10);
    this.mPhysicsWorld.setGravity(gravity);
    Vector2Pool.recycle(gravity);
}
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    this.enableAccelerometerSensor(this);
}
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    this.disableAccelerometerSensor();
}   

}

1 个答案:

答案 0 :(得分:1)

首先,谷歌碰撞检测 - 这将帮助您解决第一个问题。

其次,只保留1个子弹对象实例,当它(a)与敌人或其他物体发生碰撞,或者(b)离开屏幕时,你可以再次射击子弹。 / p>