-5

Android 用の Andengine を使用しており、画面に触れるとプレーヤーが弾丸を発射するコードを作成しました。

今やりたいことは2つ

1つ目:敵と衝突したときに弾丸を取り除きたい 2つ目:一度に弾丸だけを発射できるようにしたい. そのため、弾丸が敵に当たらない限り、弾丸を発射するメソッドを呼び出したくありません。

これが私が作成したコードです。あまり重要ではないすべてのコードを最小化しました

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

}

4

1 に答える 1

1

まず、Google 衝突検出 - 最初の問題を解決するのに役立ちます。

次に、弾丸オブジェクトのインスタンスを 1 つだけ保持し、(a) 敵または別のオブジェクトと衝突するか、(b) 画面から消えると、弾丸を再び発射できるようにします。

于 2011-08-25T01:35:21.017 に答える