【问题标题】:Java snap to gridJava对齐网格
【发布时间】:2016-07-14 17:32:23
【问题描述】:

好的,所以我正在尝试让事物与我拥有的网格对齐。

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

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

我认为变量名不言自明。 鼠标坐标除以我的 32x32 像素的图块,再次乘以获取对齐网格功能。

现在这适用于屏幕,但是当我想将它添加到“地图”本身时,我不能只添加我的地图 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);

对不起,我的解释能力很差,但这是我能做的最好的了。 我做错了什么?

【问题讨论】:

  • 发布你的渲染方法

标签: java grid position offset


【解决方案1】:

我想我重新创建了您所获得的内容,问题在于使用错误的登录计算相机位置和平移。执行下面的代码,您应该会得到与您描述的类似的行为,而取消注释的行(同时注释掉它们后面的行)应该会给您正确的行为。

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);
    }

}

我真的不喜欢你的代码的一件事是你没有使用转换。使用转换可以让您将世界与视口分开,在此处提交对此类问题的更轻松调试,最重要的是,如果您想稍后添加缩放或旋转等内容,您只需添加几行,而不是重写渲染方法的一半。

【讨论】:

  • 我对 Java 还是很陌生,而且我每天都在学习新东西。我回家后试试你的方法,然后回来报告。
  • 美丽。你是我的救星!
猜你喜欢
  • 2011-10-30
  • 2020-05-12
  • 2018-12-29
  • 1970-01-01
  • 2015-06-14
  • 2018-04-14
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多