moved camera to separate class
This commit is contained in:
parent
b261be38e0
commit
65ad4ab1f6
@ -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);
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
|
||||
127
src/main/java/ruscz/game/gameOfProd/Windows/Camera.java
Normal file
127
src/main/java/ruscz/game/gameOfProd/Windows/Camera.java
Normal 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; }
|
||||
}
|
||||
@ -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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user