this code works fine. all it's doing is setting collision around enemy. and if player touches player from the right than player moves to the right. if player touches enemy from left than player moves to the left.

playerX = player x postion
playerY = player y postion
playerW = player width
playerH = player height
x = enemy x postion
y - enemy y postion
width - enemy width
height - enemy height
p.setX = set player x postion 
...



if(playerX + playerW >= x && playerX <= x + width)
        {
            if(playerY+playerH >= y && playerY <= y+height)
            {
                if (playerX <= x)  //player on left
                {
                    System.out.println(playerX +"--"+x);
                    p.setX(x - width);
                }
                else if(playerX >= x)//player on right
                {
                    p.setX(x + width);
                }
            }
        }

this code below i understand how its working

if(playerX + playerW >= x && playerX <= x + width)
        {
            if(playerY+playerH >= y && playerY <= y+height)
            {

but this code is like magic!
ok so if player x postion is on left of enemy x, than move player to right

  if (playerX <= x)  //player on left
p.setX(x - width);

but i dont get it. bc if want to to see if player is on left of enemy than i should take playerX+playerW so collsion point is on right of player head. for ex.

if (playerX+playerW <= x) 

  //thsi i understand but its not right why??

and next line shoud be enemy x - player width.

p.setX(x - playerW) //this i understand but its not right. why??

i was thinking if playerx+playerW will get me a point at right of player head. and
this will test if player right side of head is <= enemy x(which is left of enemy head)
if (playerX+playerW <= x) //this shoudl work.........

Edited 3 Years Ago by Reverend Jim: Fixed formatting

well, how do you expect us to understand it? you want us to explain variables while we have no idea of what type they are...

also: saying - the code is right - just to be followed by // this I understand but it's not right...

either it's right, or it's not, it can't be both. can you be more complete and clear about what it is you're asking and providing?

It is not about the code, it is about the concept. OK, I'm going to try to explain it graphically...

/* 
 1.if(playerX + playerW >= x && playerX <= x + width) {
 2.  if(playerY+playerH >= y && playerY <= y+height) {
 3.    if (playerX <= x)  //player on left {
 4.      System.out.println(playerX +"--"+x);
 5.      p.setX(x - width);
 6.    }
 7.    else if(playerX >= x) { //player on right
 8.      p.setX(x + width);
 9.    }
10.  }
11.}

I'm going to talk about X only
pX = playerX
pW = playerW
 pX        pX+pW
  +---------+
  | playerX |
  +---------+
If it is collide...
 pX        pX+pW
  +---------+
  |   x+----|---+ x+enemy_width
  +----|----+---|
       +--------+
So if (pX<=x), the enemey is on the right hand side.
If you use if (playerX+playerW <= x), it does not guarantee the result.
Show below is the case when playerX+playerW>x, but it is still collide
  on the same side.
 pX             pX+pW
  +-----------+
  |   x+---+  |
  +----|---|--+
       +---+

      pX        pX+pW
       +---------+
  x+---|----+    |
   |   +----|----+
   +--------+
and if (pX>x), the enemy is on the left hand side
*/

When you deal with collision, you must compare the same reference point. In this case, you are using top-left position. You must not use different position to compare (top-right from player and top-left from enemy).

Hope this help.

Edited 4 Years Ago by Taywin

This article has been dead for over six months. Start a new discussion instead.