Java-Gaming.org    
Featured games (91)
games approved by the League of Dukes
Games in Showcase (576)
games submitted by our members
Games in WIP (497)
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 370 times)
0 Members and 1 Guest are viewing this topic.
Offline Delta517

Senior Member


Medals: 2
Projects: 1



« Posted 2013-11-19 14: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 Ninja


Medals: 49
Projects: 4
Exp: 3 years


Coding with bad posture since 2011... Nonstop.


« Reply #1 - Posted 2013-11-20 04: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

You don't know nerdiness yet; you haven't even met me!
www.wessles.com
Offline trollwarrior1
« Reply #2 - Posted 2013-11-20 14: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  
 
 

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

xsi3rr4x (12 views)
2014-04-15 18:08:23

BurntPizza (10 views)
2014-04-15 03:46:01

UprightPath (24 views)
2014-04-14 17:39:50

UprightPath (10 views)
2014-04-14 17:35:47

Porlus (27 views)
2014-04-14 15:48:38

tom_mai78101 (49 views)
2014-04-10 04:04:31

BurntPizza (107 views)
2014-04-08 23:06:04

tom_mai78101 (207 views)
2014-04-05 13:34:39

trollwarrior1 (176 views)
2014-04-04 12:06:45

CJLetsGame (182 views)
2014-04-01 02:16:10
List of Learning Resources
by Longarmx
2014-04-08 03:14:44

Good Examples
by matheus23
2014-04-05 13:51:37

Good Examples
by Grunnt
2014-04-03 15:48:46

Good Examples
by Grunnt
2014-04-03 15:48:37

Good Examples
by matheus23
2014-04-01 18:40:51

Good Examples
by matheus23
2014-04-01 18:40:34

Anonymous/Local/Inner class gotchas
by Roquen
2014-03-11 15:22:30

Anonymous/Local/Inner class gotchas
by Roquen
2014-03-11 15:05:20
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!