Реализация камеры Java - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь реализовать функцию камеры для игры, чтобы на данный момент расширить игровое поле для игрока по горизонтали. Я делал класс камеры только один раз, но проблема, с которой я всегда сталкиваюсь, это либо работа с позициями камеры, но translate () в Graphics ничего не делает, либо игрок не может двигаться. Я пробовал несколько разных решений и предложений, но не могу понять, в чем проблема. Вот самый основной код:

public class GamePanel extends JPanel implements ActionListener 
{       
    public GamePanel()
    {
        setBackground(Color.WHITE);
        setLayout(null);
        setOpaque(false);
        cell = new WBCell();
        addKeyListener(cell);
        camera = new Camera(cell);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        grabFocus();
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

        g.setColor(Color.black);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.translate(camera.getX(), camera.getY()); 
        g2.drawImage(cell.getImage(), cell.getX(), cell.getY(), null);
        g.translate(-camera.getX(), -camera.getY());
    }

    public void actionPerformed(ActionEvent e) {
        Game.getCards().show(Game.getCardP(), "Start");
    }

Базовый код для камеры, чтобы держать плеер в центре экрана:

public class Camera 
{
    private WBCell player;
    private int x = 0, y = 0;

    public Camera(WBCell wCell)
    {
        player = wCell;
    }

    public void cameraMove()
    {
        System.out.println("Cam: " + x + ", " + y + "\t\t" + (-player.getX() + Game.WIDTH/2) + ", " + (-player.getY() + Game.HEIGHT/2));
        x = -player.getX() + Game.WIDTH/2;
        y = -player.getY() + Game.HEIGHT/2;
    }

    public int getX()
    {
        return x;
    }

    public int getY()
    {
        return y;
    }
}

Для справки: объект ячейки или класс WBCell просто загружает BufferedImage и удаляет его на панели после вызова drawImage (). Любые предложения будут с благодарностью!

1 Ответ

0 голосов
/ 17 мая 2018

Вот как выглядит моя камера:

x = (player.getX()+(player.getWidth()/2)) -           game.getWidth()/2;
y = (player.getY()+(player.getHeight()/2)) - game.getHeight()/2;

g2d.translate(-camX, -camY);
 //render everything(including player)
g2d.translate(camX, camY);
...