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
Post a Comment