我正在使用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();
}
}
答案 0 :(得分:1)
首先,谷歌碰撞检测 - 这将帮助您解决第一个问题。
其次,只保留1个子弹对象实例,当它(a)与敌人或其他物体发生碰撞,或者(b)离开屏幕时,你可以再次射击子弹。 / p>