Player.java package fixedgame;
import java.awt.Rectangle;
import java.util.ArrayList;
public class Player {
private Rectangle bounding;
private float posx;
private float posy;
private ArrayList <Obstacle> list_obs;
private int world_x;
private int world_y;
private float speed=200;
private float speedVert=350;
private float grav=300;
private boolean canJump=true;
private int size;
public Player(int x, int y, int size, int world_x,int world_y,ArrayList <Obstacle> list_obs){
bounding = new Rectangle(x,y,size,size);
posx = x;
posy = y;
this.world_x=world_x;
this.world_y=world_y;
this.list_obs=list_obs;
this.size=size;
}
public void update(float timeDiff, boolean up, boolean down, boolean left, boolean right, boolean reset){
float oldPosY=posy;
float oldPosX=posx;
updateBounding(posx,posy);
for (Obstacle list_ob : list_obs) {
if(up)posy-=speedVert*timeDiff;
if(down)posy+=speedVert*timeDiff;
if(right)posx+=speed*timeDiff;
if(left)posx-=speed*timeDiff;
if(!up)posy+=grav*timeDiff;
//if(reset)posy=0;posx=0;canJump=true;grav=300;
if(posy<=200)speedVert=-grav;
canJump=false;
if (bounding.y==550 || posy == list_ob.getBounding().y - list_ob.getBounding().height) {
canJump=true;
}
if(posy>300&&canJump) speedVert=350;
if(posx<0)posx=0;
if(posy<0)posy=0;
if(posx>world_x-bounding.width)posx=world_x-bounding.width;
if(posy>world_y-bounding.height)posy=world_y-bounding.height;
if(list_ob.getBounding().intersects(bounding)){
updateBounding(posx,posy);
posy=oldPosY;
posx=oldPosX;
up=false;
down=false;
right=false;
left=false;
grav=0;
updateBounding(posx,posy);
}else{grav=300;}
//}
updateBounding(posx,posy);
//bounding.x =(int) posx;
//bounding.y =(int) posy;
}
}
public Rectangle getBounding(){
return bounding;
}
public void updateBounding(float new_x,float new_y){
bounding.x=(int) new_x;
bounding.y=(int) new_y;
}
}
Obstacle.java
package fixedgame;
import java.awt.Rectangle;
public class Obstacle {
private Rectangle bounding;
public Obstacle(int x, int size, int y){
bounding = new Rectangle(x,y-size,size,size);
}
public Rectangle getBounding(){
return bounding;
}
}
Frame.java
package fixedgame;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Frame extends JFrame{
private Screen screen;
final Player player;
private ArrayList <Obstacle> list_obs = new ArrayList<Obstacle>();
private boolean up=false;
private boolean down=false;
private boolean left=false;
private boolean right=false;
private boolean reset=false;
public Frame(Player player, ArrayList <Obstacle> list_obs){
super("MoveTest");
screen = new Screen();
screen.setBounds(0,0,800,600);
add(screen);
addKeyListener(new KeyHandler());
this.player = player;
this.list_obs=list_obs;
}
public boolean getUp(){
return up;
}
public boolean getDown(){
return down;
}
public boolean getLeft(){
return left;
}
public boolean getRight(){
return right;
}
public boolean getReset(){
return reset;
}
public void repaintScreen(){
screen.repaint();
}
private class Screen extends JLabel{
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(player.getBounding().x, player.getBounding().y, player.getBounding().width, player.getBounding().height);
for (Obstacle list_ob : list_obs) {
g.setColor(Color.yellow);
g.fillRect(list_ob.getBounding().x, list_ob.getBounding().y, list_ob.getBounding().width, list_ob.getBounding().height);
}
}
}
private class KeyHandler implements KeyListener{
//not used//
@Override
public void keyTyped(KeyEvent ke) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
//not used//
@Override
public void keyPressed(KeyEvent ke) {
//if(ke.getKeyCode()== KeyEvent.VK_S||ke.getKeyCode()==KeyEvent.VK_DOWN) down=true;
if(ke.getKeyCode()== KeyEvent.VK_W||ke.getKeyCode()==KeyEvent.VK_UP) up=true;
if(ke.getKeyCode()== KeyEvent.VK_A||ke.getKeyCode()==KeyEvent.VK_LEFT) left=true;
if(ke.getKeyCode()== KeyEvent.VK_D||ke.getKeyCode()==KeyEvent.VK_RIGHT) right=true;
if(ke.getKeyCode()== KeyEvent.VK_R) reset=true;
if(ke.getKeyCode()==KeyEvent.VK_ESCAPE) System.exit(0);
}
@Override
public void keyReleased(KeyEvent ke) {
//if(ke.getKeyCode()== KeyEvent.VK_S||ke.getKeyCode()==KeyEvent.VK_DOWN) down=false;
if(ke.getKeyCode()== KeyEvent.VK_W||ke.getKeyCode()==KeyEvent.VK_UP) up=false;
if(ke.getKeyCode()== KeyEvent.VK_A||ke.getKeyCode()==KeyEvent.VK_LEFT) left=false;
if(ke.getKeyCode()== KeyEvent.VK_D||ke.getKeyCode()==KeyEvent.VK_RIGHT) right=false;
if(ke.getKeyCode()== KeyEvent.VK_R) reset=false;
}
}
}
The problem is: I can get my block (player) a few pixels into the obstacle(obstacle). And then I get stuck. How do I properly do collision detection?