我一直在研究过去一小时左右,我似乎无法渲染等距地图。我希望实现this之类的东西。 但我得到了this...。我将我的地图存储为一维数组,如下所示:
private final int width, height;
private final int tileWidth, length;
private int[] tiles;
public Level(int width, int height) {
this.width = width;
this.height = height;
tiles = new int[width * height];
tileWidth = 68;
length = 48;
}
我通过10,10作为宽度和高度的参数。我像这样渲染地图:
public void render(Graphics g) {
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
g.setColor(Color.red);
if (x % 2 == 0)
g.drawRect(x * tileWidth, y * length / 2, tileWidth, length);
else
g.fillRect((x * tileWidth) + (tileWidth / 2), (y * length / 2), width, length);
}
}
}
任何帮助都会非常感激,我一直想学习制作等距游戏但是已经坚持使用平面2D了一段时间。
答案 0 :(得分:1)
对于只有瓷砖,您可以使用shear transform:
Graphics2D g2d = (Graphics2D) g;
AffineTransform at = AffineTransform.getShearInstance(1, 0);
g2d.transform(at);
// rest of your drawing code here
您可能还想设置剪切锚点:
double sa_x = 100, sa_y = 100; // or whatever
AffineTransform at = new AffineTransform();
// S3: Move back to original origin
at.translate(sa_x, sa_y);
// S2: Shear
at.shear(1, 0);
// S1: Set origin
at.translate(-sa_x, -sa_y);
您可以改变剪切因子1
以获得不同的剪切量。
答案 1 :(得分:0)
您需要以等角度绘制线条,而不是绘制rects。
等长几何中的角度为30度,90度,150度,210度和270度(弧度:pi / 6,pi / 2,5pi / 6,7pi / 6,3pi / 2,11pi / 6 )。
cos(pi / 6)是sqrt(3)/ 2或0.866 ......并且sin(pi / 6)是1/2或0.5。 (这是有意义的,因为http://en.wikipedia.org/wiki/File:Sin-cos-defn-I.png)
这意味着如果你想以角度pi / 6绘制一条线,从x1开始是D像素长,y1:
x2 = x1+cos(pi/6)*D e.g. x1+D*sqrt(3)/2
y2 = y1+sin(pi/6)*D e.g. y1+D/2
并从x1,y1到x2,y2。
所有其他角度要么是这个的反射(一个维度或两个都是负的),要么是直接向上和向下(平凡的绘制)。
要在屏幕上计算 where 以绘制等距对象,请考虑等距几何具有三个维度:X,Y,Z。Z的移动只会使您绘制D更高或D更低。通过X或Y的移动将使您在一个等角度方向或另一个方向上移动,与在该方向上绘制一条瓷砖线的距离相同的x和y(与上述类似的公式)。