AndEngine如何取出子弹并一次发射一颗子弹?

发布于 2024-12-01 09:56:14 字数 6305 浏览 0 评论 0原文

我正在使用 Android 版 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();
}   

}

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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

偏闹i 2024-12-08 09:56:14

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

其次,只保留子弹对象的 1 个实例,当它 (a) 与敌人或另一个对象碰撞,或 (b) 离开屏幕时,你可以让子弹再次被射击。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文