Я хочу иметь возможность масштабировать мою игру для разных разрешений, но мне разрешено работать только в контроллере (я использую MVC). Я не уверен, как сделать масштаб моей игры.
Я пока ничего не пробовал, так как не знаком с масштабированием игр для разных разрешений. Для этого есть специальная функция?
import java.awt.Color;
import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
import java.awt.image.BufferStrategy;
import java.util.Collection;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import se.egy.game.resourses.Drawable;
import se.egy.game.resourses.GameCloseException;
public class GameScreen{
private int height, width;
private String title;
private boolean fullScreenMode = false;
private JFrame jf;
private GraphicsDevice device;
private BufferStrategy backBuffer;
private Graphics2D g;
private Color bgColor = Color.BLACK; // Svart, default som bakgrund
private Image bgImg = null;
private DisplayMode oldDM = null;
public GameScreen(String title, int width, int height, boolean fulScreenMode) {
this.width = width;
this.height = height;
this.title = title;
this.fullScreenMode = fulScreenMode;
try {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
createWindow();
}
});
}catch(Exception e) {}
clearScreen();
if(fullScreenMode) { // Ful lösning ;-)
jf.setBounds(0, 0, width, height);
try{ Thread.sleep(50);}catch(Exception e){}
}
}
public GameScreen(String title, int width, int height) {
this(title, width, height, false);
}
private void createWindow() {
jf = new JFrame(title);
if(fullScreenMode) {
DisplayMode dm = new DisplayMode(width, height, 32, 0);
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
device = env.getDefaultScreenDevice();
jf.setUndecorated(true);
jf.setBounds(0, 0, width, height);
oldDM = device.getDisplayMode();
device.setFullScreenWindow(jf);
device.setDisplayMode(dm);
}else {
jf.setSize(new Dimension(width, height));
jf.setResizable(false);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
jf.setIgnoreRepaint(true);
jf.setVisible(true);
jf.requestFocus();
jf.createBufferStrategy(2);
backBuffer = jf.getBufferStrategy();
}
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.ImageIcon;
import se.egy.game.model.Entity;
import se.egy.game.model.Sprite;
import se.egy.game.view.GameScreen;
import se.egy.game.view.TxtEntity;
public class GameController implements KeyListener{
private GameScreen gs;
private boolean gameRunning = true;
private int fps;
private Entity player;
private ArrayList<Entity> entityList = new ArrayList<>();
private HashMap<String, Boolean> keyDown = new HashMap<>();
public GameController(GameScreen gs, int fps) {
this.gs = gs;
this.gs.setKeyListener(this);
this.fps = fps;
resetkeyDown();
loadObjects();
}
public void runGame() {
long renderDelay = 1000000000/fps;
long lastUpdateTime = System.nanoTime();
while(gameRunning) {
long deltaTime = System.nanoTime() - lastUpdateTime;
if(deltaTime >= renderDelay) {
lastUpdateTime = System.nanoTime();
gs.render(entityList);
update(deltaTime);
}
}
}
Я хочу, чтобы игра работала для разных разрешений. Так что мои «враги», как и игрок, находятся в том же положении для разрешения 1920 x 1080, что и разрешение 800 x 600. Существует немного больше кода как для GameScreen (просмотр), так и для GameController (контроллер), но я не думаю, что нужно показывать больше. Моя модель состоит только из сущностей, которые я использую для игры, таких как игрок и враги.