Java-Gaming.org Hi !
Featured games (85)
games approved by the League of Dukes
Games in Showcase (611)
Games in Android Showcase (172)
games submitted by our members
Games in WIP (657)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Got some collision code problems  (Read 552 times)
0 Members and 1 Guest are viewing this topic.
Offline Delta517

Senior Devvie


Medals: 4
Projects: 2



« Posted 2013-11-19 13:30:38 »

Hi Smiley I made this collision code, but its a little buggy. My player cant move either right or left and up or down when standing next to a wall. I'm pretty sure it has to do with detecting which rectangle is close to the player. I also want to optimise it so that it only checks the rectangles closest to the player Smiley Any help would be nice Smiley

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
public void collision(){
           
           //Collision
            //Save old position
            float oldX = getX();
            float oldY = getY();
            boolean collisionX = false, collisionY = false;
           
            rectPlayer.setSize(rectPlayer.getWidth() / world.getUnitScale(), rectPlayer.getWidth() / world.getUnitScale());

            // move on x
            setX(getX() + speedX / world.getUnitScale());

            if(speedX < 0) { // going left
                    for(int i = 0; i < world.getCollisionBoxes().size(); i++){
                       if(getX() > world.getCollisionBoxes().get(i).x){
                          if(rectPlayer.overlaps(world.getCollisionBoxes().get(i))){
                             collisionX = true;
                             
                             System.out.println("Left");
                          }
                       }
                    }
            }else if(speedX > 0) { // going right
               for(int i = 0; i < world.getCollisionBoxes().size(); i++){
                   if(getX() < world.getCollisionBoxes().get(i).x){
                      if(rectPlayer.overlaps(world.getCollisionBoxes().get(i))){
                         collisionX = true;
                         
                         System.out.println("Right");
                      }
                     
                   }
                }
            }
            // react to x collision
            if(collisionX) {
                    setX(oldX);
                    speedX = 0;
            }

            // move on y
            setY(getY() + speedY / world.getUnitScale());

            if(speedY < 0) { // going down
               for(int i = 0; i < world.getCollisionBoxes().size(); i++){
                   if(getY() > world.getCollisionBoxes().get(i).y){
                      if(rectPlayer.overlaps(world.getCollisionBoxes().get(i))){
                         collisionY = true;
                         
                         System.out.println("Down");
                      }
                     
                   }
                }
            }else if(speedY > 0) { // going up
               for(int i = 0; i < world.getCollisionBoxes().size(); i++){
                   if(getY() < world.getCollisionBoxes().get(i).y){
                      if(rectPlayer.overlaps(world.getCollisionBoxes().get(i))){
                         collisionY = true;
                         
                         System.out.println("Up");
                      }
                     
                   }
                }
            }
           
            // react to y collision
            if(collisionY) {
                    setY(oldY);
                    speedY = 0;
            }

            rectPlayer.setSize(rectPlayer.getWidth() * world.getUnitScale(), rectPlayer.getHeight() * world.getUnitScale());
           
        }
Offline wessles

JGO Kernel


Medals: 213
Projects: 4


Enthusiast of amusement. Lover of code.


« Reply #1 - Posted 2013-11-20 03:58:19 »

All of this code seems, unnessecary...

The way I move things, is pretty clean, and standard in most code:
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
   public boolean move(float x, float y, float delta) {
      // Whether or not we moved.
      boolean moved = false;
      // Hypothetical x and y after move.
      float hx = this.x + x * delta, hy = this.y + y * delta;

      // Is it a valid move on the x axis?
      if (/* validLocation, meaning "is this point colliding with anything?" */validLocation(hx, this.y)) {
         this.x = hx;
         moved = true;
      }

      // Is it a valid move on the y axis?
      if (/* validLocation, meaning "is this point colliding with anything?" */validLocation(this.x, hy)) {
         this.y = hy;
         moved = true;
      }

      return moved;
   }


Hope this helps! Wink

RFLEX.
Offline trollwarrior1
« Reply #2 - Posted 2013-11-20 13:59:20 »

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
int xa = 0, ya = 0;

if(KEY_W.down) ya -= 1;
if(KEY_S.down) ya += 1;
if(KEY_A.down) xa -= 1;
if(KEY_D.down) xa += 1;

float speed = 2;

float xspeed = xa * speed;
float yspeed = ya * speed;

int xs = (int) xspeed;
int ys = (int) yspeed;

if(xs > 0) xs += 1;
if(xs < 0) xs -= 1;
if(ys > 0) ys += 1;
if(ys < 0) ys -= 1;

int checkx = (this.xpos + xs) / level.getTileSize();
int checky = (this.ypos + ys) / level.getTileSize();

if(level.getTile(checkx, ypos).canMove()) {
   xpos += xspeed;
}

if(level.getTile(xpos, checky).canMove()) {
   ypos += yspeed;
}
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 
GamerC4 (19 views)
2015-08-22 20:38:50

GamerC4 (18 views)
2015-08-22 20:37:18

GamerC4 (21 views)
2015-08-22 20:37:01

Kefwar (24 views)
2015-08-22 18:07:24

GamerC4 (21 views)
2015-08-22 01:00:24

GamerC4 (33 views)
2015-08-22 01:00:17

GamerC4 (19 views)
2015-08-22 00:57:35

GamerC4 (21 views)
2015-08-22 00:56:59

BurntPizza (26 views)
2015-08-21 01:38:01

KaiHH (40 views)
2015-08-19 15:01:05
Rendering resources
by Roquen
2015-08-17 12:42:29

Rendering resources
by Roquen
2015-08-17 09:36:56

Rendering resources
by Roquen
2015-08-13 07:40:51

Networking Resources
by Roquen
2015-08-13 07:40:43

List of Learning Resources
by gouessej
2015-07-09 11:29:36

How Do I Expand My Game?
by bashfrog
2015-06-14 11:34:43

List of Learning Resources
by PocketCrafter7
2015-05-31 05:37:30

Intersection Methods
by Roquen
2015-05-29 08:19:33
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!