Created
July 31, 2012 18:09
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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