Android Touch Event Collision Detection
Posted
by
chrissb
on Game Development
See other posts from Game Development
or by chrissb
Published on 2012-07-29T12:35:17Z
Indexed on
2012/08/29
9:51 UTC
Read the original article
Hit count: 339
I'm relatively new to both Java and Android, so hopefully the problem I'm having is stemming from something pretty minor that I've overlooked.
I've got a (very early stage) game that I've started working on, for Android using Java. At this stage, when the user touches the screen, if they touched a point at which there is an enemy, the enemies health is decreased and they become immobile (for the current implementation at least).
The issue that I'm having is that the touch detection doesn't always seem to work. I've got a testing sprite set up that goes to the eventX and eventY coordinates of the touch down event, and it always seems to collide with the enemy object. Yet, the enemy doesn't always register as being hit, and sometimes a hit is registered when the sprite indicates the touch coordinates were outside of the enemies bounding box.
I realise that this probably doesn't mean much without any code, so here's what I've got so far. Be gentle, as this is literally my first attempt at something more than basic movement etc.
First off, the MainGamePanel class registers the touch event, and informs the levelmanager class (which is what I set up to monitor/handle enemies)
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
levelManager.handleActionDown((int)event.getX(), (int)event.getY());
targetX=event.getX();
targetY=event.getY();
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
//the gestures
} if (event.getAction() == MotionEvent.ACTION_UP) {
//touch was released
}
return true;
}
From there, in the levelmanager class the touch event is passed on to all of the enemies within a list array:
public static void handleActionDown(int eventX,int eventY){
hit=false;
for (enemy1 en : enemy1array){
en.handleActionDown(eventX, eventY);
}
}
The rest of the collision code is handled within the enemies handleActionDown function:
public void handleActionDown(int eventX, int eventY) {
if(eventX>this.x-enemy1bitmap.getWidth() && eventX<this.x+enemy1bitmap.getWidth() && eventY>this.y-enemy1bitmap.getHeight() && eventY<this.x+enemy1bitmap.getHeight()){
takeDamage(1);
levelmanager.setHit();
}
}
I should probably be using getWidth()/2 and getHeight()/2 for it to be more accurate, but I expanded the area to test this - although I've noticed no improvement.
At this stage, the games detection over whether or not the enemy is hit is spotty at best. Generally it takes two or three attempts before a collision is successfully registered, even though the sprite that is being used for testing and set to the eventX and eventY coordinates always indicates that the collision should have worked.
Hopefully someone can steer me in the right direction here, and if more information is needed, ask away!
Cheers, -Chris
© Game Development or respective owner