Search code examples
javaslick2d

Java slick : translation


I'm new in Java slick and I have a little issue about the translation for the "camera". I have this code :

package chapterOne;

import org.newdawn.slick.Animation;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.SpriteSheet;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;
import org.newdawn.slick.tiled.TiledMap;

public class GameState extends BasicGameState {

    public static final int ID = 1;

    private TiledMap map;
    private float posHumanX = 400;
    private float posHumanY = 600;
    private int direction = 0;
    private Animation[] animationHumain = new Animation[8];

    private boolean isMovingUp = false;
    private boolean isMovingDown = false;
    private boolean isMovingLeft = false;
    private boolean isMovingRight = false;

    private float vitesse = .1f;

    @Override
    public void init(GameContainer container, StateBasedGame game)
            throws SlickException {
        map = new TiledMap("src/main/resources/map/exemple.tmx");
        SpriteSheet sprite = new SpriteSheet("src/main/resources/sprites/soldier.png", 64, 64);

        animationHumain[0] = loadAnimation(sprite, 0, 1, 0);
        animationHumain[1] = loadAnimation(sprite, 0, 1, 1);
        animationHumain[2] = loadAnimation(sprite, 0, 1, 2);
        animationHumain[3] = loadAnimation(sprite, 0, 1, 3);
        animationHumain[4] = loadAnimation(sprite, 1, 9, 0);
        animationHumain[5] = loadAnimation(sprite, 1, 9, 1);
        animationHumain[6] = loadAnimation(sprite, 1, 9, 2);
        animationHumain[7] = loadAnimation(sprite, 1, 9, 3);
    }

    private Animation loadAnimation(SpriteSheet spriteSheet, int startX, int endX, int y) {
        Animation animation = new Animation();
        for (int x = startX; x < endX; x++) {
            animation.addFrame(spriteSheet.getSprite(x, y), 100);
        }
        return animation;
    }

    @Override
    public void render(GameContainer container, StateBasedGame game, Graphics g)
            throws SlickException {
        map.render(0, 0);

        g.setColor(new Color(0, 0, 0, .5f));
        g.fillOval(posHumanX - 16, posHumanY - 8, 32, 16);
        boolean isMoving = getIsMoving();
        g.drawAnimation(animationHumain[direction + (isMoving ? 4 : 0)], posHumanX-32, posHumanY-60);

        g.translate(container.getWidth() / 2 - this.posHumanX, container.getHeight() / 2 - this.posHumanY);
    }

    private boolean getIsMoving(){

        if(isMovingUp || isMovingDown || isMovingLeft || isMovingRight){
            return true;
        }

        return false;
    }

    @Override
    public void update(GameContainer container, StateBasedGame game, int delta)
            throws SlickException {
        if (this.isMovingUp) {
            this.posHumanY -= vitesse * delta;
        }

        if (this.isMovingDown) {
            this.posHumanY += vitesse * delta;
        }

        if (this.isMovingLeft) {
            this.posHumanX -= vitesse * delta;
        }

        if (this.isMovingRight) {
            this.posHumanX += vitesse * delta;
        }
    }

    @Override
    public void keyPressed(int key, char c) {
        switch (key) {
            case Input.KEY_UP:    this.direction = 0; this.isMovingUp = true; break;
            case Input.KEY_LEFT:  this.direction = 1; this.isMovingLeft = true; break;
            case Input.KEY_DOWN:  this.direction = 2; this.isMovingDown = true; break;
            case Input.KEY_RIGHT: this.direction = 3; this.isMovingRight = true; break;
            case Input.KEY_A: vitesse = vitesse + 0.2f; break;
        }
    }

    @Override
    public void keyReleased(int key, char c) {
        switch (key) {
            case Input.KEY_UP:    
                this.isMovingUp = false; 
                if(isMovingDown){ direction = 2; break;}
                if(isMovingLeft){ direction = 1; break;}
                if(isMovingRight){ direction = 3; break;}
                break;
            case Input.KEY_LEFT:  
                this.isMovingLeft = false; 
                if(isMovingUp){ direction = 0; break;}
                if(isMovingDown){ direction = 2; break;}
                if(isMovingRight){ direction = 3; break;}
                break;
            case Input.KEY_DOWN:  
                this.isMovingDown = false; 
                if(isMovingUp){ direction = 0; break;}
                if(isMovingLeft){ direction = 1; break;}
                if(isMovingRight){ direction = 3; break;}
                break;
            case Input.KEY_RIGHT: 
                this.isMovingRight = false; 
                if(isMovingUp){ direction = 0; break;}
                if(isMovingDown){ direction = 2; break;}
                if(isMovingLeft){ direction = 1; break;}
                break;
            case Input.KEY_A: vitesse = vitesse - 0.2f; break;
        }
    }

    @Override
    public int getID() {
        return ID;
    }

}

But, it doesn't work. I think that I miss something in the render() but I don't know what :/

Thanks


Solution

  • You need to translate the graphics object for drawing what you want translated. So bring up your g.translate(...) line to the top of the render function. The only problem with that is (if you do not want anything else translated) that you have to re-translated it where it was before you translated it to begin with.