Прыгающий прямоугольник (графика г) - PullRequest
0 голосов
/ 25 января 2019

Я играюсь с графикой на Java. На данный момент у меня есть прямоугольник, который перемещается слева направо. Я хочу, чтобы он начал двигаться влево, как только он попадет на правую сторону холста, и налево, когда он попадет на правую сторону, я включил игровой цикл, поскольку в конечном итоге это превратится в мою первую очень простую игру. Спасибо.

P.S. - Я следовал некоторым учебникам для разных частей этого кода, поэтому, почему он может быть немного грязным, я работаю над этим:)

Основной класс:

public class Game extends JFrame implements Runnable {

    private Canvas canvas = new Canvas();
    private RenderHandler renderer;
    private boolean running = true;
    public static int WIDTH = 1200, HEIGHT = WIDTH / 12*9;
    public static int moveX =WIDTH/2;

    public Game() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(WIDTH, HEIGHT);
        setLocationRelativeTo(null);
        setLocationRelativeTo(null);
        add(canvas);
        setVisible(true);
        canvas.createBufferStrategy(3);
        renderer = new RenderHandler(getWidth(), getHeight());

    }


    public void update() {

    }


    public void render() {
            BufferStrategy bufferStrategy = canvas.getBufferStrategy();
            Graphics graphics = bufferStrategy.getDrawGraphics();
            super.paint(graphics);

            renderer.render(graphics);

            graphics.dispose();
            bufferStrategy.show();
    }

    public void run() {
        BufferStrategy bufferStrategy = canvas.getBufferStrategy();
        int FRAMES = 0;
        int TICKS = 0;
        long lastTime = System.nanoTime();
        double unprocessed = 0;
        double nsPerSecs = 1000000000 /60.0;
        long Timer = System.currentTimeMillis();
        while(running) {
            long now = System.nanoTime();
            unprocessed += (now - lastTime) / nsPerSecs;
            lastTime  = now;

            if(unprocessed >= 1) {
                TICKS ++;
                update();
                unprocessed -= 1;
            } 
            try 
            {
                Thread.sleep(3); 
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
            FRAMES++;
            render();

            if(System.currentTimeMillis() - Timer > 1000) {
                System.out.println("Ticks: " + TICKS + " FPS: " + FRAMES);
                TICKS = 0;
                FRAMES = 0;
                Timer += 1000;
            }
        }
    }
    public static void main(String[] args) {
        Game game = new Game();
        Thread gameThread = new Thread(game);
        gameThread.start();
    }

}

Класс рисования графики:

public class RenderHandler {
public RenderHandler(int width, int height) {

}

public void render(Graphics g) {
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);
    g.setColor(Color.RED);
    g.fillRect(Game.moveX, Game.HEIGHT/2, 50, 50);
    if (Game.moveX >= Game.WIDTH) {
        Game.moveX ++;
    } else if (Game.moveX <= 0) {
        Game.moveX --;
    }else { Game.moveX++;
    }
    }
}

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вам нужно где-то сохранить текущее направление движения, поэтому добавьте это в класс Game:

public static int deltaX = 1;

И заменить условие в render () на

if (Game.moveX >= Game.WIDTH-50) {
    Game.deltaX =-1;
} else if (Game.moveX <= 0) {
    Game.deltaX =1;
}
Game.moveX += Game.deltaX;
0 голосов
/ 25 января 2019

Если вы знаете, как рисовать на экране и как работают вещи, я бы подумал, что это больше касается ослабления логики.

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

if (Game.moveX >= Game.WIDTH) {
        Game.moveX ++;
    } else if (Game.moveX <= 0) {
        Game.moveX --;
    }else { Game.moveX++;
    }

Если вы хотите, чтобы он отскочил, вам придется использовать логическое значение для отслеживания его состояния перемещения или, если вы хотите больше гибкости, использовать пару поплавков или двойников (поплавки обычно используются в игровом дизайне Java) следить за его положением, а другое за его скоростью. Я сейчас в затруднении, я вернусь.

0 голосов
/ 25 января 2019

Добавьте это в обработчик рендеринга вместо текущего оператора if в render

bool rol = true; // initialize this outside the method


If(Game.movex + 50 >= Game.width)
rol = false;
Else if(Game.movex <= 0)
rol = true;
If(rol)
Game.movex++;
Else
Game.movex--;
...