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

Senior Member


Medals: 2
Projects: 1



« 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 Wizard


Medals: 66
Projects: 4
Exp: 3 years


Profile picture isn't relevant.


« 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

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.

 

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

The first screenshot will be displayed as a thumbnail.

Nickropheliac (15 views)
2014-08-31 22:59:12

TehJavaDev (23 views)
2014-08-28 18:26:30

CopyableCougar4 (33 views)
2014-08-22 19:31:30

atombrot (41 views)
2014-08-19 09:29:53

Tekkerue (40 views)
2014-08-16 06:45:27

Tekkerue (35 views)
2014-08-16 06:22:17

Tekkerue (25 views)
2014-08-16 06:20:21

Tekkerue (37 views)
2014-08-16 06:12:11

Rayexar (72 views)
2014-08-11 02:49:23

BurntPizza (49 views)
2014-08-09 21:09:32
List of Learning Resources
by Longor1996
2014-08-16 10:40:00

List of Learning Resources
by SilverTiger
2014-08-05 19:33:27

Resources for WIP games
by CogWheelz
2014-08-01 16:20:17

Resources for WIP games
by CogWheelz
2014-08-01 16:19:50

List of Learning Resources
by SilverTiger
2014-07-31 16:29:50

List of Learning Resources
by SilverTiger
2014-07-31 16:26:06

List of Learning Resources
by SilverTiger
2014-07-31 11:54:12

HotSpot Options
by dleskov
2014-07-08 01:59:08
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!