awt - Java Platformer: Player Jumps Through Platform -


so, i'm nearing end of making simple java platformer there's 1 big problem left, when player jumps , collides platform below, player (and if they're close platform) jumps through platform , lands on 1 above. here code:

package main;  import java.applet.applet; import java.awt.color; import java.awt.font; import java.awt.frame; import java.awt.graphics; import java.awt.graphics2d; import java.awt.image; import java.awt.event.keyevent; import java.awt.event.keylistener; import java.awt.geom.rectangle2d; import java.util.arraylist;  public class platformer extends applet implements runnable, keylistener {      // buffering variables     private image dbimage;     private graphics dbg;      // running boolean     private boolean running = true;      // player coords     private int rectx = 100;     private int recty = 420;      // initialise dx , dy @ 0     private double dx = 0;     private double dy = 0;      private boolean jumping = false;      //debug strings     private string inter = new string();     private string coords = new string();     private string debugx = "", debugy = "";      //for moving player     private int worldshift = 0;      //sprites     rectangle2d player = new rectangle2d.double();// = new rectangle2d.double(rectx, recty, 10, 10);     rectangle2d ground = new rectangle2d.double(0, 420, 800, 150);     int[][] platforms = { {300, 300, 100, 20}, { 450, 200, 100, 20 },              { 500, 250, 100, 20 }, { 100, 200, 100, 20 }, { 600, 300, 100, 20 } };     arraylist<rectangle2d> platformlist = new arraylist<rectangle2d>();      int level = 1;      @override     public void init() {          setsize(800, 480);         setfocusable(true);         addkeylistener(this);         frame frame = (frame) this.getparent().getparent();         frame.settitle("test");         setvisible(true);          (int = 0; < platforms.length; i++){             // platforms             rectangle2d platform = new rectangle2d.double();             platform.setrect(platforms[i][0] + worldshift, platforms[i][1],                     platforms[i][2], platforms[i][3]);             platformlist.add(platform);         }     }      @override     public void start() {         thread thread = new thread(this);         thread.start();     }      @override     public void stop() {         // todo auto-generated method stub     }      @override     public void destroy() {         // todo auto-generated method stub     }      public void paint(graphics g) {         //double buffering         graphics2d g2 = (graphics2d) g;         dbimage = createimage(getwidth(), getheight());         dbg = dbimage.getgraphics();         paintcomponent(dbg);         g2.drawimage(dbimage, 0, 0, this);     }      // paint objects     public void paintcomponent(graphics g) {         graphics2d g2 = (graphics2d) g;          //draw platforms         if (level == 1) {             g2.setcolor(color.blue);             g2.draw(ground);             g2.fill(ground);              (rectangle2d plat : platformlist){                 g2.setcolor(color.red);                 g2.draw(plat);                 g2.fill(plat);             }          g2.setcolor(color.red);         //debug printouts            g.drawstring(inter, 400, 30);         g.drawstring(coords, 20, 150);          //draw player         g2.setcolor(color.white);         g2.draw(player);         g2.fill(player);          //print debug info screen         font bold = new font("liberation sans", font.bold, 36);         setfont(bold);         g.drawstring("dx, dy: (" + dx + ", " + dy + ")", 30, 30);         g.drawstring("x, y: (" + player.getx() + ", " + player.gety() + ")",                 30, 60);         g.drawstring("" + debugx + ", " + debugy + "", rectx, recty);         }     }      @override     public void run() {         while (running) {              update();             repaint();              try {                 thread.sleep(17);             } catch (interruptedexception e) {                 e.printstacktrace();             }         }     }      public void update() {               rectx += dx;         recty += dy + 1;          // stops player running off screen         if (rectx < 1)  rectx = 0;         if (rectx > 790) rectx = 790;          // set sprite coords         player.setrect(rectx, recty, 10, 10);         ground.setrect(0, 420, 800, 480);          // collision detection         if (player.intersects(ground)) {             recty = (int) (ground.gety() - player.getheight());             jumping = false;             dy = 0;         }          (int = 0; < platformlist.size(); i++){             rectangle2d plat = platformlist.get(i);             //sets platform's coordinates             plat.setrect(plat.getx() + worldshift, plat.gety(), plat.getwidth(), plat.getheight());             //sets debug strings             coords = "not on platform";             inter = " " + platformlist.get(0).getx() + worldshift + ", " + worldshift;              debugx = "" + rectx;             debugy = "" + recty;              //for scrolling background             if (rectx > 700 && dx == 5){                 worldshift = -5;}             else if (rectx < 100 && dx == -5){                 worldshift = 5;}             else worldshift = 0;              //collision detection             if (player.intersects(plat)) {                 jumping = false;                 dy = 0;                 coords = " " + plat.getbounds();                 //if falling                 if (recty <= (int) (plat.gety() + (plat.getheight()/2))){                     recty = (int) (plat.gety() - player.getheight());                 //if jumping                 else if (recty >= plat.gety() + (plat.getheight()/2)){                     recty = (int) (plat.gety() + plat.getheight());}                 break;             }             else if (!player.intersects(plat) && !player.intersects(ground)) {                 jumping = true;             }         }          //implements falling         if (jumping)             dy += 1;         }      //button presses     @override     public void keypressed(keyevent e) {         system.out.println("key pressed code=" + e.getkeycode() + ", char=" + e.getkeychar());         if (e.getkeycode() == 37)             dx -= 5; // 37 left         if (e.getkeycode() == 39)             dx += 5; // 39 right         // if (e.getkeycode() == 40) dy -= 5; //40 down         if (e.getkeycode() == 38 && jumping == false){             // if on ground,             // i.e. jump if on ground             // 38             dy -= 20;             jumping = true;         }     }      //key release     @override     public void keyreleased(keyevent e) {         if (e.getkeycode() == 37)             dx = 0; // 37 left         if (e.getkeycode() == 39)             dx = 0; // 39 right         if (e.getkeycode() == 40)             dy = 0; // 40 down         // if (e.getkeycode() == 38)     }      @override     public void keytyped(keyevent e) {         // todo auto-generated method stub      } } 

i'm confident there's nothing wrong '//collision detection' part of update(), don't know issue is. amongst other things, tried placing jump mechanism in update loop didn't work either.

thanks help.

look @ jump size, 20:

public void keypressed(keyevent e) {     system.out.println("key pressed code=" + e.getkeycode() + ", char=" + e.getkeychar());     if (e.getkeycode() == 37)         dx -= 5; // 37 left     if (e.getkeycode() == 39)         dx += 5; // 39 right     // if (e.getkeycode() == 40) dy -= 5; //40 down     if (e.getkeycode() == 38 && jumping == false){         // if on ground,         // i.e. jump if on ground         // 38         dy -= 20; // <- jump size 20         jumping = true;     } } 

but platform height 20 , deciding center of platform, means 10 pixels above center, jump size should less half height of platform

edit configuration:

try configuration:

set increment falling +0.25 , jump increment -9

removed comments make shorter

if (jumping)     dy += 0.25; 

and

public void keypressed(keyevent e) {     if (e.getkeycode() == 37)         dx -= 5; // 37 left     if (e.getkeycode() == 39)         dx += 5; // 39 right     if (e.getkeycode() == 38 && jumping == false){         dy -= 9; // <- jump size set 9 (half 10)         jumping = true;     } } 

note: blinking terrible, have solved renaming paint(graphics) method update(graphics)


Comments