Java-Gaming.org Hi !
Featured games (90)
games approved by the League of Dukes
Games in Showcase (731)
Games in Android Showcase (217)
games submitted by our members
Games in WIP (799)
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 973 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: 326
Projects: 4


All coding knowledge will be useless at peak oil.


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

 
Archive (337 views)
2017-04-27 17:45:51

buddyBro (536 views)
2017-04-05 03:38:00

CopyableCougar4 (979 views)
2017-03-24 15:39:42

theagentd (1016 views)
2017-03-24 15:32:08

Rule (994 views)
2017-03-19 12:43:22

Rule (976 views)
2017-03-19 12:42:17

Rule (973 views)
2017-03-19 12:36:21

theagentd (1073 views)
2017-03-16 05:07:07

theagentd (992 views)
2017-03-15 22:37:06

theagentd (762 views)
2017-03-15 22:32:18
List of Learning Resources
by elect
2017-03-13 14:05:44

List of Learning Resources
by elect
2017-03-13 14:04:45

SF/X Libraries
by philfrei
2017-03-02 08:45:19

SF/X Libraries
by philfrei
2017-03-02 08:44:05

SF/X Libraries
by SkyAphid
2017-03-02 06:38:56

SF/X Libraries
by SkyAphid
2017-03-02 06:38:32

SF/X Libraries
by SkyAphid
2017-03-02 06:38:05

SF/X Libraries
by SkyAphid
2017-03-02 06:37:51
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!