我有问题。我希望能够使用鼠标滚轮放大我的Graphics2D
屏幕,但我希望能够翻译Graphics2D
,以便它在我缩放的位置上正确。这是迄今为止发生的事情:“http://cdn.makeagif.com/media/6-11-2015/E0kYGY.gif”它正确地转换到了玩家的位置但是我希望它可以通过滚动鼠标滚轮进行缩放。这是我到目前为止所做的代码:
private AffineTransform getCamTransform()
{
AffineTransform t = new AffineTransform();
float a = 400 - player.getX();
float b = 250 - player.getY();
t.translate(a, b);
/*
* Here's where I want to scale using the zoom
* variable and also translate the g2d according
* to the zoom variable.
*/
return t;
}
private double zoom = 2.0D;
@Override
public void mouseWheelMoved(MouseWheelEvent e)
{
zoom += e.getPreciseWheelRotation();
}
这只是我所拥有的代码的一小部分。我有一个方法可以将所有内容绘制到屏幕上,但这只是为了返回必须应用于相机的变换。然后将变换设置为Graphics2D
的前一个变换。
让我知道是否有更简单的方法可以做到这一点,或者我做错了。我也想在CPU上保持高效。感谢无论谁回答!
答案 0 :(得分:7)
基本思想是,您希望看起来好像图形在可视区域内保持居中。我首先考虑过尝试扩大翻译点,也许这可能有用,但我无法让它起作用(3岁时想读书并没有给我很多时间进行实验)。 / p>
基本上,您需要添加另一个平移,其中x / y点根据可视区域和缩放移动适当的量,使图像看起来在可视区域内保持静止,然后应用缩放和正常平移在它上面......
ab2 9 456
ab1 12 345
nh7 0 0
gh67 6 987
因此, double width = getWidth();
double height = getHeight();
double zoomWidth = width * zoom;
double zoomHeight = height * zoom;
double anchorx = (width - zoomWidth) / 2;
double anchory = (height - zoomHeight) / 2;
AffineTransform at = new AffineTransform();
at.translate(anchorx, anchory);
at.scale(zoom, zoom);
at.translate(-100, -100);
表示根据可视区域的宽度和高度,所得到的图形需要偏移的量,以便图像保持"居中"在其中...
anchorx/y
这可能是一个非常棒的数学公式,你可以使用它,但我是愚蠢的;)