Search code examples
controls2dslick2d

Problems with moving in a 2d game using the Slick library


For some reason you just keep moving left and I can't figure out why. The keyboard input reading isn't the problem because moving in any other direction works perfectly. Ignore the isClipped() method as I'm not done with it yet. Thanks for the help.

main class

package Genisis;

import java.io.FileNotFoundException;
import java.util.ArrayList;

import org.lwjgl.input.Mouse;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;
import org.newdawn.slick.tiled.TiledMap;

public class Play extends BasicGameState
{
int mouseX;
int mouseY;
Level testLevel;
boolean[][] blocked;

MainCharacter mc;

public Play(int state)
{

}

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException
{

    gc.setMouseCursor("res/sprites/Cursor.png", 0, 0);

    try {
        testLevel = new Level(0, 0, "res/maps/testmap.tmx");
    } catch (FileNotFoundException e) {
        System.out.println("Failed to load map.");
        e.printStackTrace();
    }

    mouseX = Mouse.getX();
    mouseY = gc.getHeight() - Mouse.getY();

    mc = new MainCharacter(50, 50, new Image("res/sprites/mcg.png"));   
}

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws 
                                                                         SlickException
{
    testLevel.render(mc.x, mc.y);
    mc.render(mouseX, mouseY);
}

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws 
                                                                        SlickException
{
    mc.move(gc, testLevel);
    mc.render(gc.getWidth()/2, gc.getHeight()/2);
    testLevel.render(mc.x, mc.y);
}

public int getID()
{
    return 1;
}

public void spawnMC(float spwnMCX, float spwnMCY)
{
    testLevel.render(spwnMCX, spwnMCY);
    testLevel.render(spwnMCX, spwnMCY);
}

public void spawnOC()
{
    //todo
}
}

Player class

        package Genisis;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;


public class MainCharacter extends Player
{

public MainCharacter(float newX, float newY, Image newSprite) throws SlickException
{
    sprite = newSprite;
    x = newX;
    y = newY;
}

public void move(GameContainer gc, Level map)
{   
    Input in = gc.getInput();

    if(in.isKeyDown(Input.KEY_W))
        if(map.isClipped(x, y + 1))
            y += 1;
    if(in.isKeyDown(Input.KEY_D))
        if(map.isClipped(x + 1, y))
            x -= 1;
    if(in.isKeyDown(Input.KEY_S))
        if(map.isClipped(x, y - 1))
            y -= 1;
    if(in.isKeyDown(Input.KEY_A));
        if(map.isClipped(x - 1, y))
            x += 1;
}

public void render(float mX, float mY)
{
    float xDist = mX - (500 + (sprite.getWidth() / 2));
    float yDist = mY - (250 + (sprite.getHeight() / 2));

    double angleToTurn = Math.toDegrees(Math.atan2(yDist, xDist));
    sprite.setRotation((float)angleToTurn);

    sprite.draw(500, 250);
}
}

level class

package Genisis;

import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.SpriteSheet;
import org.newdawn.slick.tiled.TiledMap;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;

public class Level 
{

//height of background (in tiles)
public int height;

//width of background (in tiles)
public int width;

public boolean[][] clipped;

public TiledMap map;


public Level(int newHeight, int newWidth, String path) throws 
                                                  FileNotFoundException, SlickException
{
    map = new TiledMap(path);
    clipped = new boolean[map.getHeight()][map.getWidth()];

    for(int i = 0; i < map.getHeight(); i++)
        for(int j = 0; i < map.getWidth(); i++)
        {
            if("true".equals(map.getTileProperty(map.getTileId(i, j, 
                            0), "blocked", "false")))
                clipped[i][j] = false;
        }
}

//render map
public void render(float mcX, float mcY)
{
    map.render((int)(mcX), (int)(mcY));
}

//return height of level (in pixels)
public int getHeight()
{
    return map.getHeight();
}

//return width of level (in pixels)
public int getWidth()
{
    return map.getWidth();
}

public boolean isClipped(float charX, float charY)
{
    //return clipped[(int)(charX / 50)][(int)(charY / 50)];
        return true;
}
}

Solution

  • Found the problem. There is an extra semicolon (it's always a semicolon -_-) after the if statement for moving left.

     if(in.isKeyDown(Input.KEY_A));
        if(map.isClipped(x - 1, y))
            x += 1;