Движущийся фон с постоянной скоростью в Java-игре - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь сделать клон куриных захватчиков в java. Одной из особенностей игры является движение фона. Когда я искал в Интернете, большинство уроков касались ситуации, когда игрок перемещает фонследует двигаться вместе с ним. Также все они использовали метод paint(), который я не использовал в своем коде и действительно не знаю, где его использовать is.here - класс, который содержит мой игровой цикл и выполняет рендеринг:

package ir.farzinnasiri.display;

import ir.farzinnasiri.state.StateMachine;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

public class Display extends Canvas implements Runnable {
    //setting the size
    private static final int WIDTH = 1200,HEIGHT = 800;

    //the game loop stuff
    private boolean running;
    private Thread thread;
    private int fps;

    public static StateMachine state;

    private static BufferedImage backGround;

    public static int getWIDTH() {
        return WIDTH;
    }

    public static int getHEIGHT() {
        return HEIGHT;
    }

    public Display(){
        this.setSize(WIDTH,HEIGHT);
        this.setFocusable(true);

        state = new StateMachine(this);
        state.setState((byte)0);

        //setting the background
        URL url = this.getClass().getResource("/ir/farzinnasiri/images/gameBG.PNG");
        try{
            backGround = ImageIO.read(url);
        }catch (IOException e) {
            e.printStackTrace();
        }


    }
    public synchronized void start(){
        if(running){
            return;
        }
        running = true;
        thread = new Thread(this);
        thread.start();
    }

    public synchronized void stop(){
        if(!running){
            return;
        }
        running = false;

        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }


    @Override
    public void run() {
        long timer = System.currentTimeMillis();
        long lastLoopTime = System.nanoTime();
        final int Target_fps = 100;
        /*we need 1/fps to determine the time for each loop,for 60fps this is approximately 16ms
        * if all the updates take place under 16ms than we have a steady fps!
        *
        * */
        final long Optimal_Time = 1_000_000_000 /Target_fps;
        int frames = 0;

        //setting buffer strategy
        createBufferStrategy(3);
        BufferStrategy bs = getBufferStrategy();

        while (running){
            long now = System.nanoTime();
            long updateLength = now-lastLoopTime;
            lastLoopTime = now;

            //to not jump and run smooth
            double elapsed = updateLength/((double) Optimal_Time);
            //each loop adds one frame
            frames++;
            //check if one second has passed or not
            if(System.currentTimeMillis() - timer > 1000){
                timer += 1000;
                fps = frames;
                frames = 0;
                System.out.println(fps);
            }

            render(bs);
            update(elapsed);


            //this part controls the program if it gets very fast
            try {
                Thread.sleep(Math.abs((lastLoopTime-System.nanoTime())+Optimal_Time)/1_000_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }


        }

    }
    public void render(BufferStrategy bs){
        do {
            do {
                Graphics2D g2d = (Graphics2D) bs.getDrawGraphics();
                g2d.drawImage(backGround,0,0,getWIDTH(),getHEIGHT(),null);

                state.draw(g2d);

                g2d.dispose();

            } while (bs.contentsRestored());
            bs.show();
        }while (bs.contentsLost());
    }

    public void update(double elapsed){
        //game updates here
        state.update(elapsed);
    }
}  

В настоящее время у меня есть космический корабль, который я могу перемещать вокруг кадра. Как вы можете видеть, я просто скачал фон из Google и использовал его.На самом деле мне этого не достаточно даже для перемещения фона, чтобы казалось, что космический корабль движется.Я новичок в программировании игр и Java, поэтому некоторые я ценю любую помощь или подсказку, ответы на этом сайте и в сети (насколько я искал) были не очень полезны для меня.

...