在java中渲染等距地图与单个矩形

时间:2013-06-01 02:45:08

标签: java arrays map isometric

我一直在研究过去一小时左右,我似乎无法渲染等距地图。我希望实现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了一段时间。

2 个答案:

答案 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(与上述类似的公式)。