I would appreciate some help with camera movement and zoom. Is there any easier way with cleaner code, or simply how can I improve it?
- Window size: 800x600
- Image size: 1200x900
This is my code so far (you can move with the camera only around the image and use zoom):
package game.engine.gui;
import game.engine.Engine;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.math.BigDecimal;
public class Camera {
public Point mouseLocation;
public boolean drag = false;
public boolean isEnabled = true;
public Rectangle view;
public int offsetX = 0;
public int maxOffsetX = 200;
public int maxOffsetXZoom = 200;
public int offsetY = 0;
public int maxOffsetY = 150;
public int maxOffsetYZoom = 150;
public float zoom = 1;
public float maxZoom = 1.2F;
public float minZoom = 0.7F;
public Camera() {
view = new Rectangle(0,0,Engine.window.getWidth(),Engine.window.getHeight());
}
public void draw(Graphics2D g)
{
}
public void update()
{
}
public void mousePressed(MouseEvent e)
{
if(e.getButton()==MouseEvent.BUTTON1)
{
mouseLocation = e.getPoint();
drag = true;
}
}
public void mouseReleased(MouseEvent e)
{
drag = false;
}
public void mouseMoved(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
{
if(drag)
{
int newoffsetX = offsetX - (mouseLocation.x - e.getX());
int newoffsetY = offsetY - (mouseLocation.y - e.getY());
if(newoffsetX > maxOffsetXZoom) offsetX = maxOffsetXZoom;
else if(newoffsetX < -maxOffsetXZoom + (maxOffsetX-maxOffsetXZoom) * 4) offsetX = -maxOffsetXZoom + (maxOffsetX-maxOffsetXZoom) * 4;
else offsetX = newoffsetX;
if(newoffsetY > maxOffsetYZoom) offsetY = maxOffsetYZoom;
else if(newoffsetY < -maxOffsetYZoom - 25 + (maxOffsetY-maxOffsetYZoom) * 4) offsetY = -maxOffsetYZoom - 25 + (maxOffsetY-maxOffsetYZoom) * 4;
else offsetY = newoffsetY;
mouseLocation = e.getPoint();
}
}
public void mouseScrolled(MouseWheelEvent e)
{
if (e.getWheelRotation() < 0) {
if(zoom<maxZoom) zoom += 0.05F;
} else {
if(zoom>minZoom) zoom -= 0.05F;
}
zoom = round(zoom, 2);
maxOffsetXZoom = (int) (maxOffsetX * zoom);
maxOffsetYZoom = (int) (maxOffsetY * zoom);
if(offsetX > maxOffsetXZoom) offsetX = maxOffsetXZoom;
else if(offsetX < -maxOffsetXZoom + (maxOffsetX-maxOffsetXZoom) * 4) offsetX = -maxOffsetXZoom + (maxOffsetX-maxOffsetXZoom) * 4;
if(offsetY > maxOffsetYZoom) offsetY = maxOffsetYZoom;
else if(offsetY < -maxOffsetYZoom - 25 + (maxOffsetY-maxOffsetYZoom) * 4) offsetY = -maxOffsetYZoom - 25 + (maxOffsetY-maxOffsetYZoom) * 4;
}
public float round(float d, int decimalPlace) {
BigDecimal bd = new BigDecimal(Float.toString(d));
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
return bd.floatValue();
}
}
It works, but I think it's a huge mess and also if the image size was different it would require a lot of changes. I am using my own engine.