moved camera to separate class

This commit is contained in:
musilto9 2020-03-24 18:46:37 +01:00
parent b261be38e0
commit 65ad4ab1f6
4 changed files with 139 additions and 122 deletions

View File

@ -60,10 +60,10 @@ public class InteractionCell extends Cell {
}
else if (data.contains("<cameraFree>")) {
String[] cameraInfo = data.split(" ");
window.getMapPainter().setCameraStart();
window.getMapPainter().setCameraBound(false);
window.getMapPainter().setCameraEnd(Integer.parseInt(cameraInfo[1]), Integer.parseInt(cameraInfo[2]));
window.getMapPainter().setCameraSpeed(Integer.parseInt(cameraInfo[3]));
window.getCamera().setCameraStart();
window.getCamera().setCameraBound(false);
window.getCamera().setCameraEnd(Integer.parseInt(cameraInfo[1]), Integer.parseInt(cameraInfo[2]));
window.getCamera().setCameraSpeed(Integer.parseInt(cameraInfo[3]));
readNextLine();
}
else if (data.contains("<dialog>")) {
@ -96,8 +96,8 @@ public class InteractionCell extends Cell {
dialog.hideText();
dialog.setImageDialog(null);
}
if (!window.getMapPainter().getCameraBound()) {
window.getMapPainter().returnFreeCamera();
if (!window.getCamera().getCameraBound()) {
window.getCamera().returnFreeCamera();
}
WindowOfFreeMove.setCanPersonMove(true);
Person.setInEvent(false);

View File

@ -14,18 +14,10 @@ public class MapPainter {
private WindowOfFreeMove.Canvas canvas;
private LinkedList<Map> maps;
private Map actualMap;
private boolean isCameraBound;
private int cameraEndX;
private int cameraEndY;
private int cameraSpeed;
private int cameraStartX;
private int cameraStartY;
private boolean isCameraReturning;
public MapPainter(LinkedList<Map> maps, WindowOfFreeMove.Canvas canvas) {
this.canvas = canvas;
this.maps = maps;
this.isCameraBound = true;
}
public void setMap(Map map) {
@ -97,113 +89,7 @@ public class MapPainter {
}
}
public void moveCamera() {
if (isCameraBound) {
moveBoundCamera();
}
else {
moveFreeCamera();
}
}
public void moveBoundCamera() {
int cameraOffsetX = (-1) * CELL_SIZE * (getActualMap().getPerson().getX() - WINDOW_WIDTH / 2);
int cameraOffsetY = (-1) * CELL_SIZE * (getActualMap().getPerson().getY() - WINDOW_HEIGHT / 2);
int direction = getActualMap().getPerson().getDirectionMoveLast();
int size = -getActualMap().getPerson().getSize();
int Ysize = 0;
int Xsize = 0;
switch (direction) {
case WindowOfFreeMove.KEY_LEFT:
Xsize = size;
break;
case WindowOfFreeMove.KEY_RIGHT:
Xsize -= size;
break;
case WindowOfFreeMove.KEY_UP:
Ysize = size;
break;
case WindowOfFreeMove.KEY_DOWN:
Ysize -= size;
break;
}
if (!getActualMap().getPerson().getIsMoving()) {
Xsize = 0;
Ysize = 0;
}
if (cameraOffsetX + Xsize >= 0 || cameraOffsetX > 0) {
cameraOffsetX = 0;
Xsize = 0;
}
else if (CELL_SIZE * WINDOW_WIDTH - (cameraOffsetX + Xsize) >= CELL_SIZE * CANVAS_WIDTH || CELL_SIZE * WINDOW_WIDTH - cameraOffsetX > CELL_SIZE * CANVAS_WIDTH) {
cameraOffsetX = (-1) * (CELL_SIZE * CANVAS_WIDTH - CELL_SIZE * WINDOW_WIDTH);
Xsize = 0;
}
if (cameraOffsetY + Ysize >= 0 || cameraOffsetY > 0) {
cameraOffsetY = 0;
Ysize = 0;
}
else if (CELL_SIZE * WINDOW_HEIGHT - (cameraOffsetY + Ysize) >= CELL_SIZE * CANVAS_HEIGHT || CELL_SIZE * WINDOW_HEIGHT - cameraOffsetY > CELL_SIZE * CANVAS_HEIGHT) {
cameraOffsetY = (-1) * (CELL_SIZE * CANVAS_HEIGHT - CELL_SIZE * WINDOW_HEIGHT);
Ysize = 0;
}
canvas.setLocation(cameraOffsetX + Xsize, cameraOffsetY + Ysize);
}
public void moveFreeCamera() {
int coordX = (int) (canvas.getLocation().getX());
int coordY = (int) (canvas.getLocation().getY());
if (coordX != cameraEndX || coordY != cameraEndY) {
int distanceX = cameraEndX - cameraStartX;
int distanceY = cameraEndY - cameraStartY;
int stepX = distanceX * cameraSpeed / CELL_SIZE;
int stepY = distanceY * cameraSpeed / CELL_SIZE;
canvas.setLocation(coordX + stepX, coordY + stepY);
}
if (coordX == cameraEndX && coordY == cameraEndY && isCameraReturning) {
isCameraBound = true;
}
}
public void returnFreeCamera() {
setCameraStart();
cameraEndX = (-1) * CELL_SIZE * (getActualMap().getPerson().getX() - WINDOW_WIDTH / 2);
cameraEndY = (-1) * CELL_SIZE * (getActualMap().getPerson().getY() - WINDOW_HEIGHT / 2);
if (cameraEndX > 0) {
cameraEndX = 0;
}
else if (CELL_SIZE * WINDOW_WIDTH - cameraEndX > CELL_SIZE * CANVAS_WIDTH) {
cameraEndX = (-1) * (CELL_SIZE * CANVAS_WIDTH - CELL_SIZE * WINDOW_WIDTH);
}
if (cameraEndY > 0) {
cameraEndY = 0;
}
else if (CELL_SIZE * WINDOW_WIDTH - cameraEndY > CELL_SIZE * CANVAS_WIDTH) {
cameraEndY = (-1) * (CELL_SIZE * CANVAS_HEIGHT - CELL_SIZE * WINDOW_HEIGHT);
}
cameraSpeed = 1;
isCameraReturning = true;
}
public void repaintCanvas() {
canvas.repaint();
}
public void setCameraStart() {
this.cameraStartX = (int) (canvas.getLocation().getX());
this.cameraStartY = (int) (canvas.getLocation().getY());
}
public void setCameraEnd(int x, int y) {
this.cameraEndX = x;
this.cameraEndY = y;
}
public void setCameraSpeed(int speed) {
this.cameraSpeed = speed;
}
public void setCameraBound(boolean bound) { this.isCameraBound = bound; }
public boolean getCameraBound() {return isCameraBound; }
}

View File

@ -0,0 +1,127 @@
package ruscz.game.gameOfProd.Windows;
import static ruscz.game.gameOfProd.Windows.WindowOfFreeMove.*;
public class Camera {
private WindowOfFreeMove window;
private WindowOfFreeMove.Canvas canvas;
private boolean isBound;
private int endX;
private int endY;
private int speed;
private int startX;
private int startY;
private boolean isReturning;
public Camera(WindowOfFreeMove window, WindowOfFreeMove.Canvas canvas) {
this.window = window;
this.canvas = canvas;
this.isBound = true;
}
public void moveCamera() {
if (isBound) {
moveBoundCamera();
}
else {
moveFreeCamera();
}
}
public void moveBoundCamera() {
int cameraOffsetX = (-1) * CELL_SIZE * (window.getMapPainter().getActualMap().getPerson().getX() - WINDOW_WIDTH / 2);
int cameraOffsetY = (-1) * CELL_SIZE * (window.getMapPainter().getActualMap().getPerson().getY() - WINDOW_HEIGHT / 2);
int direction = window.getMapPainter().getActualMap().getPerson().getDirectionMoveLast();
int size = (-1) * window.getMapPainter().getActualMap().getPerson().getSize();
int Ysize = 0;
int Xsize = 0;
switch (direction) {
case WindowOfFreeMove.KEY_LEFT:
Xsize = size;
break;
case WindowOfFreeMove.KEY_RIGHT:
Xsize -= size;
break;
case WindowOfFreeMove.KEY_UP:
Ysize = size;
break;
case WindowOfFreeMove.KEY_DOWN:
Ysize -= size;
break;
}
if (!window.getMapPainter().getActualMap().getPerson().getIsMoving()) {
Xsize = 0;
Ysize = 0;
}
if (cameraOffsetX + Xsize >= 0 || cameraOffsetX > 0) {
cameraOffsetX = 0;
Xsize = 0;
}
else if (CELL_SIZE * WINDOW_WIDTH - (cameraOffsetX + Xsize) >= CELL_SIZE * CANVAS_WIDTH || CELL_SIZE * WINDOW_WIDTH - cameraOffsetX > CELL_SIZE * CANVAS_WIDTH) {
cameraOffsetX = (-1) * (CELL_SIZE * CANVAS_WIDTH - CELL_SIZE * WINDOW_WIDTH);
Xsize = 0;
}
if (cameraOffsetY + Ysize >= 0 || cameraOffsetY > 0) {
cameraOffsetY = 0;
Ysize = 0;
}
else if (CELL_SIZE * WINDOW_HEIGHT - (cameraOffsetY + Ysize) >= CELL_SIZE * CANVAS_HEIGHT || CELL_SIZE * WINDOW_HEIGHT - cameraOffsetY > CELL_SIZE * CANVAS_HEIGHT) {
cameraOffsetY = (-1) * (CELL_SIZE * CANVAS_HEIGHT - CELL_SIZE * WINDOW_HEIGHT);
Ysize = 0;
}
canvas.setLocation(cameraOffsetX + Xsize, cameraOffsetY + Ysize);
}
public void moveFreeCamera() {
int coordX = (int) (canvas.getLocation().getX());
int coordY = (int) (canvas.getLocation().getY());
if (coordX != endX || coordY != endY) {
int distanceX = endX - startX;
int distanceY = endY - startY;
int stepX = distanceX * speed / CELL_SIZE;
int stepY = distanceY * speed / CELL_SIZE;
canvas.setLocation(coordX + stepX, coordY + stepY);
}
if (coordX == endX && coordY == endY && isReturning) {
isBound = true;
}
}
public void returnFreeCamera() {
setCameraStart();
endX = (-1) * CELL_SIZE * (window.getMapPainter().getActualMap().getPerson().getX() - WINDOW_WIDTH / 2);
endY = (-1) * CELL_SIZE * (window.getMapPainter().getActualMap().getPerson().getY() - WINDOW_HEIGHT / 2);
if (endX > 0) {
endX = 0;
}
else if (CELL_SIZE * WINDOW_WIDTH - endX > CELL_SIZE * CANVAS_WIDTH) {
endX = (-1) * (CELL_SIZE * CANVAS_WIDTH - CELL_SIZE * WINDOW_WIDTH);
}
if (endY > 0) {
endY = 0;
}
else if (CELL_SIZE * WINDOW_WIDTH - endY > CELL_SIZE * CANVAS_WIDTH) {
endY = (-1) * (CELL_SIZE * CANVAS_HEIGHT - CELL_SIZE * WINDOW_HEIGHT);
}
speed = 1;
isReturning = true;
}
public void setCameraStart() {
this.startX = (int) (canvas.getLocation().getX());
this.startY = (int) (canvas.getLocation().getY());
}
public void setCameraEnd(int x, int y) {
this.endX = x;
this.endY = y;
}
public void setCameraSpeed(int speed) {
this.speed = speed;
}
public void setCameraBound(boolean bound) { this.isBound = bound; }
public boolean getCameraBound() {return isBound; }
}

View File

@ -33,6 +33,7 @@ public class WindowOfFreeMove extends JFrame {
private Canvas canvas;
private DialogBar dialogBar;
private MapPainter mapPainter;
private Camera camera;
private Timer inputTimer;
private LinkedList<Map> mapLinkedList;
@ -69,12 +70,15 @@ public class WindowOfFreeMove extends JFrame {
return mapLinkedList;
}
public Camera getCamera() { return camera; }
public WindowOfFreeMove() {
isReadyToPaint = false;
canPersonMove = true;
JLayeredPane lp = getLayeredPane();
canvas = new Canvas();
camera = new Camera(this, canvas);
canvas.setBackground(Color.black);
canvas.setPreferredSize(new Dimension(
CELL_SIZE * CANVAS_WIDTH,
@ -194,7 +198,7 @@ public class WindowOfFreeMove extends JFrame {
setMapPainter(m5);
mapPainter.moveCamera();
camera.moveCamera();
mapPainter.createMap();
isReadyToPaint = true;
canvas.repaint();
@ -204,7 +208,7 @@ public class WindowOfFreeMove extends JFrame {
Timer timer = new Timer(10, actionEvent -> {
mapPainter.getActualMap().getPerson().move();
mapPainter.moveCamera();
camera.moveCamera();
canvas.repaint();
});
timer.start();