gpt4 book ai didi

Java 对齐网格

转载 作者:行者123 更新时间:2023-12-02 03:28:56 26 4
gpt4 key购买 nike

好吧,我正在尝试让事情与我拥有的网格对齐。

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

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

我认为变量名称不言而喻。 鼠标坐标除以我的图 block (32x32 像素),再乘以该值即可获得对齐网格功能。

现在这对于屏幕来说效果很好,但是当我想将它添加到“ map ”本身时,我不能只添加我的 map x 和 y 偏移量,它会变得困惑。

我已经玩了大约两天了,我也让它捕捉到 map 本身,但是当我说,在两个轴上的 map 中间时,mouseX 和 mouseY 弄乱了网格向上。我很难解释,但是从 0, 0(每个原点位置,甚至屏幕)的偏移加上远离原点时的贴图偏移,会添加到光标本身和透明物体之间的距离我用来测试的对齐网格图 block 。基本上,由于某种原因, map 原点和相机之间的偏移量与光标和透明图 block 之间的偏移量相同。因此,我移动到 map 中越远,图 block 距离光标就越远,并最终移动到屏幕宽度和高度之外......当我进一步进入 map 时,我希望对齐网格功能保持正确,无论我在 map 上的哪个位置。

渲染方法:

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

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

最佳答案

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

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

}

我真的不喜欢你的代码的一件事是你没有使用转换。使用转换可以让你将世界与视口(viewport)分开,提交更容易调试这样的问题,最重要的是,如果你想稍后添加缩放或旋转之类的东西,你只需要添加几行,而不是重写渲染方法的一半。

关于Java 对齐网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38380645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com