开发者

AndEngine how to remove bullets and shoot one bullets at a time?

I'm using Andengine for android and I created a code where my player will shoot a bullet when I touch the screen.

Now I want to do 2 things

first: I want the bullet to be removed when it collides with the enemy Second: I want to be able to shoot only bullet at a time. So as long as the bullets haven't hit the enemy I don't want the method of firing a bullet to be called.

Here's the code I created I minimized all the codes that are not really important

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.createC开发者_高级运维ircleBody(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();
}   

}


First, google collision detection - that will help you solve the first problem.

Second, only keep 1 instance of the bullet object, and when it either (a) collides with the enemy or another object, or (b) goes off the screen, then you make the bullet able to be shot again.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜