Java对齐网格

时间:2016-07-14 17:32:23

标签: java grid position offset

好的,所以我试图让事情与我的网格对齐。

这就是我对屏幕本身的捕捉方式:

int finalCalcX = (mouseX / Handler.gridSpace32) * Handler.gridSpace32;
int finalCalcY = (mouseY / Handler.gridSpace32) * Handler.gridSpace32;

我认为变量名称不言自明。  鼠标坐标除以我的图块为32x32像素,是再次获得按键到网格功能的次数。

现在这适用于屏幕,但是当我想将它添加到" map"本身,我无法将地图x和y偏移添加到其中,它会搞砸。

我已经用它玩了大约两天了,而且我也让它拍到了地图本身,但是当我说,在两个轴上的地图中途,mouseX和mouseY弄乱网格的东西。 这对我来说很难解释,但是当你离开原点时,从0,0(每个原点位置,甚至是屏幕)的偏移加上地图偏移,被添加到光标之间的距离本身和我用来测试的透明对齐网格图块。 基本上,地图原点和相机之间的偏移由于某种原因在光标和透明图块之间具有相同的偏移。因此,我移动的地图越远,瓷砖离光标越远,最终移出屏幕宽度和高度...... 当我进一步移动到地图中时,无论我在地图上的哪个位置,我都希望对齐网格功能保持正确。

渲染方法:

for (int y = startY; y < endY; y++) {
    for (int x = startX; x < endX; x++) {
        gridSpace(graphics, (int) (x * Handler.gridSpace32 - handler.getCamera().getOffsetX()),
                    (int) (y * Handler.gridSpace32 - handler.getCamera().getOffsetY()));

        checkHighlight(graphics);
    }
}

gridSpace是网格本身。 以下是目前亮点中的内容:

int finalCalcX = (mouseX / Handler.gridSpace32) * Handler.gridSpace32;
int finalCalcY = (mouseY / Handler.gridSpace32) * Handler.gridSpace32;

graphics.setColor(new Color(100, 200, 100, 3));
graphics.fillRect(finalCalcX, finalCalcY, Handler.gridSpace32, Handler.gridSpace32);

对不起我的可怕解释技巧,但这是我能做的最好的。 我做错了什么?

1 个答案:

答案 0 :(得分:2)

我认为我重新创造了你得到的东西,而问题在于在摄像机位置和平移的计算中使用了错误的符号。执行下面的代码应该得到与你描述的相似的行为,而取消注释注释行(同时注释掉跟随它们的那些)应该给你正确的行为。

package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

public class SnapToGrid extends JPanel implements MouseMotionListener{

    private int[] camera;
    private int[] mouse;
    private final int gridSize = 16;

    SnapToGrid() {
        camera = new int[2];
        mouse = new int[2];
        setFocusable(true);
        addMouseMotionListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        //g2.translate(-camera[0], -camera[1]);
        g2.translate(camera[0], camera[1]);

        //draw background
        for (int i = 0; i < 9; i++)
            for (int j = 0; j < 9; j++)
            {
                Color c = ((j*9) + i) % 2 == 0 ? Color.black : Color.white;
                g2.setColor(c);
                g2.fillRect(i*gridSize, j*gridSize, gridSize, gridSize);
            }
        g2.setColor(Color.blue);
        int[] snappedPos = getSnappedMousePosition();
        g2.fillRect(snappedPos[0], snappedPos[1], gridSize, gridSize);
    }

    private int[] getSnappedMousePosition() {
        return new int[] {
            camera[0] + mouse[0] - ((camera[0] + mouse[0]) % gridSize),
            camera[1] + mouse[1] - ((camera[1] + mouse[1]) % gridSize)  
        };
    }

    public static void main (String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SnapToGrid());
        frame.pack();
        frame.setVisible(true);
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        //camera[0] -= e.getX() - mouse[0]; 
        //camera[1] -= e.getY() - mouse[1];
        camera[0] += e.getX() - mouse[0]; 
        camera[1] += e.getY() - mouse[1];

        mouse[0] = e.getX();
        mouse[1] = e.getY();
        repaint();

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        mouse[0] = e.getX();
        mouse[1] = e.getY();
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(gridSize * 18, gridSize * 18);
    }

}

我真的不喜欢你的代码,那就是你没有使用转换。使用转换允许您将世界与视口分开,提交到这里更容易调试此类问题,最重要的是,如果您想稍后添加缩放或旋转等内容,则只需添加几行,而不是重写渲染方法的一半。