How to detect if an enemy was touched ?

Forum for the Android Game Development Workshop. See http://code.google.com/p/agd-101/

How to detect if an enemy was touched ?

Postby Mr Zero » Fri Oct 21, 2016 12:13 pm

I want to add to the score of my game +1 when an enemy was touched, I tried two methods "addListener" and "touchDown" but not worked for me or I didn't use them right , However "Gdx.input.isTouched()" worked but if i touch the right side of the shape that's mean there is a coordinate problem .

How can I do that my (enemy object is linked to an userData and Actor classes, I regroup many different sizes for my enemy in an enum class also those enemies move from the top of the screen to bot , this code is based from William Mora Tutorial ). please How to detect if an enemy was touched ? (sorry for my english)

my GameStage Code :

Code: Select all
public class GameStage extends Stage  implements InputProcessor {
    // This will be our viewport measurements while working with the debug renderer
    private static final int VIEWPORT_WIDTH = 12;
    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();
        bounds = new Rectangle(enemy.getX(),enemy.getY(),enemy.getWidth(),enemy.getHeight());

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

    }

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

    private void createEnemy() {
        enemy = new Enemy(WorldUtils.createEnemy(world));
       // enemy.setBounds(enemy.getBody().getPosition().x, enemy.getBody().getPosition().y, enemy.getUserData().getWidth(),  enemy.getUserData().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();
  // (3) **** isTouched Method

     /*  if (Gdx.input.isTouched()){

           Vector3 tmp=new Vector3(Gdx.input.getX(),Gdx.input.getY(),0);
            camera.unproject(tmp);
            Rectangle textureBounds=new Rectangle(enemy.getX(),enemy.getY(),enemy.getWidth(),enemy.getHeight());
            // texture x is the x position of the texture
            // texture y is the y position of the texture
            // texturewidth is the width of the texture (you can get it with texture.getWidth() or textureRegion.getRegionWidth() if you have a texture region
            // textureheight is the height of the texture (you can get it with texture.getHeight() or textureRegion.getRegionhHeight() if you have a texture region
            if(textureBounds.contains(tmp.x,tmp.y))
            {
                score++;
                yourScoreName = "score: " + score;
            };
        }*/


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

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

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

            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();
         renderer.render(world, camera.combined);

    }
}


Image
Mr Zero
 
Posts: 1
Joined: Fri Oct 21, 2016 11:53 am

Re: How to detect if an enemy was touched ?

Postby heatherreynolds » Thu Aug 24, 2017 10:50 am

Have you solved this problem?
I am a new game developer and I want to find here useful tips for me this problem?
heatherreynolds
 
Posts: 1
Joined: Wed Aug 23, 2017 12:54 pm


Return to Android Game Development Workshop

Who is online

Users browsing this forum: No registered users and 1 guest