Как я могу масштабировать свою игру для разных разрешений при использовании MVC - PullRequest
0 голосов
/ 20 апреля 2019

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

...