Libgdx:如何检测敌人是否被触碰?

时间:2016-10-18 16:30:13

标签: java android libgdx

我希望在敌人被触摸时加上我的游戏+1的分数,我尝试了两种方法addListenertouchDown但不适用于我或我没有使用它们右。

我怎么能这样做(敌人对象链接到userData和Actor类,我在枚举类中为我的敌人重新组合了许多不同的大小,那些敌人也从屏幕顶部移动到僵尸。如何检测是否一个敌人被触动了?

public class GameStage extends Stage {
    // This will be our viewport measurements while working with the debug renderer
    private static final int VIEWPORT_WIDTH = 13;
    private static final int VIEWPORT_HEIGHT = 20;

    private World world;
    private Ground ground;
    private Enemy enemy;
    private final float TIME_STEP = 1 / 300f;
    private float accumulator = 0f;
    private Rectangle bounds;
    private Vector3 touchPoint = new Vector3();;
    private int score;
    private String yourScoreName;
    BitmapFont yourBitmapFontName;
    private SpriteBatch batch;
    private OrthographicCamera camera;
    private Box2DDebugRenderer renderer;

    public GameStage() {
        world = WorldUtils.createWorld();
        renderer = new Box2DDebugRenderer();
        Gdx.input.setInputProcessor(this);
        batch = new SpriteBatch();
        score = 0;
        yourScoreName = "score: 0";
        yourBitmapFontName = new BitmapFont();
        setUpWorld();
        setUpCamera();
    }

    public void setUpWorld(){
        world = WorldUtils.createWorld();
        setUpGround();
        createEnemy();
    }

    private void setUpGround(){
        ground = new Ground (WorldUtils.createGround(world));
        addActor(ground);
    }

    private void createEnemy() {
        enemy = new Enemy(WorldUtils.createEnemy(world));

     // (1) *****using addListener method
        enemy.addListener(new InputListener()
        {
            @Override
            public boolean touchDown(InputEvent event, float x, float y,
                                     int pointer, int button)
            {
                score++;
                yourScoreName = "score: " + score;
                return true;
            }
        });
        /*enemy.addListener(new ClickListener() {
            public void clicked() {
                world.destroyBody(enemy.getBody());
            }});*/
        //bounds = new Rectangle(enemy.getX(), enemy.getY(), enemy.getWidth(),  enemy.getHeight());
        addActor(enemy);

    }

    private void setUpCamera() {
        camera = new OrthographicCamera(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
        camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0f);
        camera.update();
    }

    @Override
    public void act(float delta) {
        super.act(delta);
        checkEnemy();

        // Fixed timestep
        accumulator += delta;

        while (accumulator >= delta) {
            world.step(TIME_STEP, 6, 2);
            accumulator -= TIME_STEP;
        }

        //TODO: Implement interpolation

    }

    private void checkEnemy(){
       final Body  body = enemy.getBody();
        UserData userData = enemy.getUserData();

       bounds = new Rectangle(enemy.getBody().getPosition().x, enemy.getBody().getPosition().y, enemy.getUserData().getWidth(),  enemy.getUserData().getHeight());
       // bounds = new Rectangle(body.getPosition().x, body.getPosition().y,userData.getWidth() ,userData.getHeight());

       if (!BodyUtils.enemyInBounds(body,userData)){
           world.destroyBody(body);
             createEnemy();}
    }

    public World getWorld(){
        return world;
    }

 // (2) ****using TouchDown method
      @Override
        public boolean touchDown(int x, int y, int pointer, int button) {

            // Need to get the actual coordinates
            translateScreenToWorldCoordinates(x, y);
          //  score++;
           // yourScoreName = "score: " + score;
            if(enemyTouched(touchPoint.x,touchPoint.y)){
              //  world.destroyBody(enemy.getBody());
                score++;
                yourScoreName = "score: " + score;
            }
            return super.touchDown(x, y, pointer, button);
        }
    private boolean enemyTouched(float x, float y) {
        return bounds.contains(x, y);
    }

    private void translateScreenToWorldCoordinates(int x, int y) {
        getCamera().unproject(touchPoint.set(x, y, 0));
    }




    @Override
    public void draw() {
        super.draw();
        batch.begin();
        yourBitmapFontName.setColor(1.0f, 1.0f, 1.0f, 1.0f);
        yourBitmapFontName.draw(batch, yourScoreName, 25, 100);
        batch.end();
        enemy.setBounds(enemy.getBody().getPosition().x,enemy.getBody().getPosition().y,enemy.getUserData().getWidth(),enemy.getUserData().getHeight());
        renderer.render(world, camera.combined);
    }
}

我游戏中的一个屏幕:

1 个答案:

答案 0 :(得分:0)

它应该按照您的方式工作(使用fork方法)。但是你必须设置actor的正确边界(宽度,高度,位置):addListener()。我会用身体来获取这些值。您也可以使用actor.setBounds(x, y, width, height)代替ClickListener