如何仅对某些事物使用 Graphics2D g.scale() 而对其他事物不使用?
How to use Graphics2D g.scale() on only some things but not others?
我希望能够放大我的项目,它与 g.scale(x, x) 和 g.translate(x, y) 的组合完美配合。但是,我想要一些不与其他所有东西一起缩放的东西(小地图)。
具体来说,我正在制作一个小地图,它将整个屏幕和单位显示为 1x1 像素。
for(Unit u : units) { //cycle through arraylist of units
u.drawUnit(g, selectedUnits.contains(u)); //draws the unit, scales perfectly
g.setColor(Color.blue);
g.fillOval(rnd((u.getX()/4)/scale), rnd((u.getY()/4)/scale), rnd(1 + 1/scale), rnd(1 + 1/scale));
//rnd() is just a shorter (int)Math.round()
//The minimap's dimensions are width/4 x height/4
}
所以我想知道我是否可以用更简单的方法来做,因为这使得它在某些缩放比例下看起来真的很奇怪。
您可以get/set 与 Graphics2D 对象关联的 AffineTransform 对象。这使您可以轻松地在两个或多个变换之间来回切换,而无需通过 Graphics2D 对象的 scale/translate/rotate 方法进行数学运算。例如:
//render something default transform
AffineTransform defaultTransform = g.getTransform();
AffineTransform newTransform = new AffineTransform(defaultTransform);
newTransform.setScale(xScale, yScale);
g.setTransform(newTransform);
//render something with the new transform
g.setTransform(oldTransform);
//render something with the original transform
我希望能够放大我的项目,它与 g.scale(x, x) 和 g.translate(x, y) 的组合完美配合。但是,我想要一些不与其他所有东西一起缩放的东西(小地图)。 具体来说,我正在制作一个小地图,它将整个屏幕和单位显示为 1x1 像素。
for(Unit u : units) { //cycle through arraylist of units
u.drawUnit(g, selectedUnits.contains(u)); //draws the unit, scales perfectly
g.setColor(Color.blue);
g.fillOval(rnd((u.getX()/4)/scale), rnd((u.getY()/4)/scale), rnd(1 + 1/scale), rnd(1 + 1/scale));
//rnd() is just a shorter (int)Math.round()
//The minimap's dimensions are width/4 x height/4
}
所以我想知道我是否可以用更简单的方法来做,因为这使得它在某些缩放比例下看起来真的很奇怪。
您可以get/set 与 Graphics2D 对象关联的 AffineTransform 对象。这使您可以轻松地在两个或多个变换之间来回切换,而无需通过 Graphics2D 对象的 scale/translate/rotate 方法进行数学运算。例如:
//render something default transform
AffineTransform defaultTransform = g.getTransform();
AffineTransform newTransform = new AffineTransform(defaultTransform);
newTransform.setScale(xScale, yScale);
g.setTransform(newTransform);
//render something with the new transform
g.setTransform(oldTransform);
//render something with the original transform