我已经研究了过去一个小时左右,我似乎无法渲染等距地图。我想实现这样的目标。但是我得到了这个....我将我的地图存储为瓷砖在一维数组中,如下所示:
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一段时间。
对于仅仅是tile,你可以使用剪切变换:
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
来获得不同的剪切量。
不要画矩形,而要画等角直线
等距几何中的角有30度、90度、150度、210度和270度(弧度:pi/6、pi/2、5pi/6、7pi/6、3pi/2、11pi/6)。
cos(pi/6)等于√(3)/2或0.866…sin(/6)等于1/2或0.5。(这很有意义,因为http://en.wikipedia.org/wiki/File:Sin-cos-defn-I.png)
这意味着如果你想在角度pi/6处画一条D像素长的线,从x1,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
所有其他角度要么是这个的反射(一维或两个都是负的),要么是垂直的上下(画起来很简单)。
要计算,其中在屏幕上绘制等距对象,考虑等距几何有三个维度:X, Y, Z。移动Z只会使您将D画得更高或更低。X或Y方向的移动将使你在一个等角方向或另一个方向上移动,与在该方向上画一条瓦片线的距离相同的X和Y(与上面的公式相似)。