Я пытаюсь сделать клон куриных захватчиков в 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, поэтому некоторые я ценю любую помощь или подсказку, ответы на этом сайте и в сети (насколько я искал) были не очень полезны для меня.