2011-08-24 64 views
-5

我正在使用Android的Andengine,并且我创建了一个代码,当我触摸屏幕时,我的播放器将会拍摄一颗子弹。AndEngine如何去除子弹并一次发射一颗子弹?

现在我想要做的两件事情

第一:我想,当它与敌人 二碰撞被取出子弹:我希望能够在同一时间只拍摄子弹。所以只要子弹没有击中敌人,我不希望发射子弹的方法被调用。

这里是我创建 的代码我最小化所有不属于真正重要

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(); 
} 

}

+0

我已经提供了一个答案,可以让你在某个地方,但丹有一个问题 - 你的问题的答案是“实施碰撞检测”,这不是可以简洁地解释 - 因此你不太可能得到一个代码样本作为答案,除非你的问题更加狭隘和集中。 – jefflunt

+0

我知道提供更多信息,或者我是如何提问的? –

回答

1

首先,谷歌的碰撞检测的代码 - 这将帮助你解决第一个问题。其次,只保留1个子弹对象的实例,当它或者(a)与敌人或其他物体相撞,或者(b)离开屏幕时,则让子弹能够再次被射击。

+0

我知道碰撞检测。如果你看了我的代码,我已经在那里,并且还有关于它的评论。我不知道的是如何在碰撞发生时去除子弹。我知道只有两种方法可以删除精灵。 detachChild()和detachSelf(); –

+0

你可以在它上面设置一个布尔类型,叫做'inFlight',当'true'表示子弹正在飞行,并且还没有和任何东西发生冲突时。当它与某物碰撞时,计算伤害,并将'inFlight'设置为false。这表明子弹(a)不应该呈现在屏幕上,并且(b)它已准备好再次被触发。您还需要重置其位置,并且在“inFlight”为false时不会移动它。点击屏幕会将'inFlight'更改为true,只有当它已经是false时才会触发点火。 – jefflunt

+0

非常感谢。我解决了一次只能拍一颗子弹的问题,你知道我该如何彻底清除子弹?将其设置为false并将其分离仅使其不可见。这就像我的游戏中的玩家与一个看不见的物体相撞。 –