I am trying to make collisions on my map, i have a collisions layer and a layer for viewing but i dont really know how to do it, any help would be much appreciated.
(sorry for my messy code im still fairly new to java)
package JavaGame;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;
import org.newdawn.slick.tiled.TiledMap;
public class Play extends BasicGameState{
Animation player, movingUp, movingDown, movingLeft, movingRight, water;
boolean quit = false;
float playerX = 0;
float playerY = 0;
float shiftX = playerX + 428;
float shiftY = playerY + 200;
private TiledMap map/*, map2, map3*/;
private boolean[][] blocked;
private static final int SIZE = 16;
public Play(int state){
}
public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{
map = new TiledMap(/*"res/Grass16x.tmx"*/"res/East10.tmx");
//map2 = new TiledMap("res/Map.tmx");
//map3 = new TiledMap("res/Area1.tmx");
//worldGrass = new Image("res/GB.png");
SpriteSheet sheet = new SpriteSheet("res/char.png",10,13);
SpriteSheet waves = new SpriteSheet("res/wateranimation.png",16,16);
water = new Animation(waves, 0, 0, 3, 0, true, 500, true);
movingUp = new Animation(sheet, 8, 0, 11, 0, true, 100, false);
movingDown = new Animation(sheet, 0, 0, 3, 0, true, 100, false);
movingLeft = new Animation(sheet, 4, 0, 7, 0, true, 100, false);
movingRight = new Animation(sheet, 12, 0, 15, 0, true, 100, false);
player = movingDown;
/*blocked = new boolean[map.getWidth()][map.getHeight()];
for (int x=0;x<map.getWidth();x++) {
for (int y=0;y<map.getHeight();y++) {
int tileID = map.getTileId(x, y, 0);
String value = map.getTileProperty(tileID, "blocked", "false");
if ("true".equals(value)) {
blocked[x][y] = true;
}
}
}*/
blocked = new boolean[map.getWidth()][map.getHeight()];
for (int xAxis=0;xAxis<map.getWidth(); xAxis++)
{
for (int yAxis=0;yAxis<map.getHeight(); yAxis++)
{
int tileID = map.getTileId(xAxis, yAxis, 0);
String value = map.getTileProperty(tileID, "blocked", "false");
if ("true".equals(value))
{
blocked[xAxis][yAxis] = true;
}
}
}
}
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{
g.translate(shiftX,shiftY);
g.scale(2f, 2f);
g.translate(-shiftX, -shiftY);
map.render((int)playerX, (int)playerY);
//map2.render((int)playerX + 864, (int)playerY);
//map3.render((int)playerX + 864, (int)playerY - 480);
/*water.draw(playerX, playerY);
water.draw(playerX+16, playerY);
water.draw(playerX, playerY+16);
water.draw(playerX+16, playerY+16);*/
player.draw(428, 200);
g.drawString("Players X: "+ playerX+"\nPlayers Y: " + playerY, 0, 20);
if(quit == true){
g.drawString("Resume (R)", 250, 100);
g.drawString("Main Menu (M)", 250, 150);
g.drawString("Quit Game (Q)", 250, 200);
if(quit==false){
g.clear();
}
}
}
public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException{
Input input = gc.getInput();
/*if(input.isKeyDown(Input.KEY_W)){
player = movingUp;
movingUp.update(delta);
playerY += delta *1f;
if(playerX <-421){
if(playerY>705){
playerY -= delta *1f;
}
} else if(playerY>220){
playerY -= delta *1f;
}
}
if(input.isKeyDown(Input.KEY_S)){
player = movingDown;
movingDown.update(delta);
playerY -= delta *1f;
if(playerY<-245){
playerY += delta *1f;
}
}
if(input.isKeyDown(Input.KEY_A)){
player = movingLeft;
movingLeft.update(delta);
playerX += delta *1f;
if(playerX>430){
playerX -= delta *1f;
}
}
if(input.isKeyDown(Input.KEY_D)){
player = movingRight;
movingRight.update(delta);
playerX -= delta *1f;
if(playerX<-1070){
playerX += delta *1f;
//sbg.enterState(2);
}
}
if(input.isKeyDown(Input.KEY_ESCAPE)){
quit = true;
}
if(quit == true){
if(input.isKeyDown(Input.KEY_R)){
quit = false;
}
if(input.isKeyDown(Input.KEY_M)){
sbg.enterState(0);
}
if(input.isKeyDown(Input.KEY_Q)){
System.exit(0);
}
}*/
if (input.isKeyDown(Input.KEY_W))
{
player = movingUp;
if (!isBlocked(playerX, playerY - delta * 0.1f))
{
movingUp.update(delta);
// The lower the delta the slowest the sprite will animate.
playerY += delta * 0.1f;
}
}
else if (input.isKeyDown(Input.KEY_S))
{
player = movingDown;
if (!isBlocked(playerX, playerY + SIZE + delta * 0.1f))
{
movingDown.update(delta);
playerY -= delta * 0.1f;
}
}
else if (input.isKeyDown(Input.KEY_A))
{
player = movingLeft;
if (!isBlocked(playerX - delta * 0.1f, playerY))
{
movingLeft.update(delta);
playerX += delta * 0.1f;
}
}
else if (input.isKeyDown(Input.KEY_D))
{
player = movingRight;
if (!isBlocked(playerX + SIZE + delta * 0.1f, playerY))
{
movingRight.update(delta);
playerX -= delta * 0.1f;
}
}
}
private boolean isBlocked(float x, float y)
{
int xBlock = (int)x / SIZE;
int yBlock = (int)y / SIZE;
return blocked[xBlock][yBlock];
}
/*private boolean tryMove(float x, float y) {
float newx = playerX + x;
float newy = playerY + y;
// first we try the real move, if that doesn't work
// we try moving on just one of the axis (X and then Y)
// this allows us to slide against edges
if (blocked(newx,newy)) {
if (blocked(newx, playerY)) {
if (blocked(playerX, newy)) {
// can't move at all!
return false;
} else {
playerY = newy;
return true;
}
} else {
playerX = newx;
return true;
}
} else {
playerX = newx;
playerY = newy;
return true;
}
}*/
public int getID(){
return 1;
}
}
This is the error code i get:
Sun Jul 29 17:17:59 BST 2012 INFO:Slick Build #274
Sun Jul 29 17:18:00 BST 2012 INFO:LWJGL Version: 2.8.4
Sun Jul 29 17:18:00 BST 2012 INFO:OriginalDisplayMode: 1366 x 768 x 32 @60Hz
Sun Jul 29 17:18:00 BST 2012 INFO:TargetDisplayMode: 855 x 480 x 0 @0Hz
Sun Jul 29 17:18:00 BST 2012 INFO:Starting display 855x480
Sun Jul 29 17:18:00 BST 2012 INFO:Use Java PNG Loader = true
Sun Jul 29 17:18:00 BST 2012 INFO:Controllers not available
Sun Jul 29 17:18:07 BST 2012 ERROR:-1
java.lang.ArrayIndexOutOfBoundsException: -1
at JavaGame.Play.isBlocked(Play.java:208)
at JavaGame.Play.update(Play.java:178)
at org.newdawn.slick.state.StateBasedGame.update(StateBasedGame.java:268)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:657)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:408)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:318)
at JavaGame.Game.main(Game.java:29)
Sun Jul 29 17:18:07 BST 2012 ERROR:Game.update() failure - check the game code.
org.newdawn.slick.SlickException: Game.update() failure - check the game code.
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:663)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:408)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:318)
at JavaGame.Game.main(Game.java:29)