Skip to content

Instantly share code, notes, and snippets.

@jake7864
Created July 31, 2012 18:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jake7864/3219046 to your computer and use it in GitHub Desktop.
Save jake7864/3219046 to your computer and use it in GitHub Desktop.
Upgrade to my collion detection game, you can not go outside the window + diagonal collisions works better
public class Game extends Canvas implements Runnable
{
static Thread t;
public int width = 500, height = 300, playerSize = 10;
public InputHandler input;
public Player player = new Player();
public Box box = new Box();
public static void main(String args[])
{
JFrame frame = new JFrame();
Game game = new Game();
frame.setResizable(false);
frame.setTitle("Game");
frame.add(game);
frame.pack();
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
t.start();
}
public Game()
{
Dimension size = new Dimension(width, height);
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
t = new Thread(this, "Game");
input = new InputHandler();
addKeyListener(input);
}
public void run()
{
long lastLoopTime = System.nanoTime();
final long second = 1000000000;
final int fps = 150;
while(true)
{
long now = System.nanoTime();
long updateLength = now - lastLoopTime;
lastLoopTime = now;
double delta = updateLength / ((double)second/fps);
update(delta);
render();
try{Thread.sleep((lastLoopTime-System.nanoTime())/1000000+10);}
catch(Exception ex){}
}
}
public void update(double delta)
{
double speed = delta;
int dir = 0;
if(input.keys[KeyEvent.VK_W])
{
player.setY(player.getY() - speed);
if(player.getY() < 0)player.setY(player.getY() + speed);//this will cancel out movement if you go too far up
dir = 0;
}
if(input.keys[KeyEvent.VK_S])
{
player.setY(player.getY() + speed);
if(player.getY() > height-playerSize)player.setY(player.getY() - speed);//this will cancel out movement if you go too far down
dir = 1;
}
if(input.keys[KeyEvent.VK_A])
{
player.setX(player.getX() - speed);
if(player.getX() < 0)player.setX(player.getX() + speed);//this will cancel out movement if you go too far left
dir = 2;
}
if(input.keys[KeyEvent.VK_D])
{
player.setX(player.getX() + speed);
if(player.getX() > width-playerSize)player.setX(player.getX() - speed);//this will cancel out movement if you go too far right
dir = 3;
}
if(input.keys[KeyEvent.VK_W] && input.keys[KeyEvent.VK_A]) dir = 4;
if(input.keys[KeyEvent.VK_W] && input.keys[KeyEvent.VK_D]) dir = 5;
if(input.keys[KeyEvent.VK_S] && input.keys[KeyEvent.VK_A]) dir = 6;
if(input.keys[KeyEvent.VK_S] && input.keys[KeyEvent.VK_D]) dir = 7;
player.setBounds((int)player.getX(), (int)player.getY(), playerSize, playerSize);
box.setBounds((int)box.getX(), (int)box.getY(), playerSize, playerSize);
if(player.intersects(box))
{
switch(dir)
{
case 0: box.setY(box.getY() - 2);//push up
break;
case 1: box.setY(box.getY() + 2);//push down
break;
case 2: box.setX(box.getX() - 2);//push left
break;
case 3: box.setX(box.getX() + 2);//push right
break;
//Diagonal directions
case 4: box.setY(box.getY() - 2);//push up & left
box.setX(box.getX() - 2);
break;
case 5: box.setY(box.getY() - 2);//push up & right
box.setX(box.getX() + 2);
break;
case 6: box.setY(box.getY() + 2);//push down & left
box.setX(box.getX() - 2);
break;
case 7: box.setY(box.getY() + 2);//push down & right
box.setX(box.getX() + 2);
break;
}
}
}
public void render()
{
BufferStrategy bs = this.getBufferStrategy();
if(bs == null)
{
createBufferStrategy(2);
return;
}
Graphics g = bs.getDrawGraphics();
g.clearRect(0, 0, width, height);
g.setColor(Color.black);
g.fillRect((int)player.getX(), (int)player.getY(), playerSize, playerSize);
g.fillRect((int)box.getX(), (int)box.getY(), playerSize, playerSize);
g.dispose();
bs.show();
}
class Player extends Rectangle
{
private double x = 50;
private double y = 50;
public double getX(){return x;}
public double getY(){return y;}
public void setX(double x){this.x = x;}
public void setY(double y){this.y = y;}
}
class Box extends Rectangle
{
private double x = 100;
private double y = 100;
public double getX(){return x;}
public double getY(){return y;}
public void setX(double x){this.x = x;}
public void setY(double y){this.y = y;}
}
class InputHandler implements KeyListener
{
public boolean[] keys = new boolean[65536];
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
keys[keyCode] = true;
}
public void keyReleased(KeyEvent e)
{
int keyCode = e.getKeyCode();
keys[keyCode] = false;
}
public void keyTyped(KeyEvent e)
{
int keyCode = e.getKeyCode();
keys[keyCode] = true;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment