簡體   English   中英

Java對齊網格

[英]Java snap to grid

好的,所以我試圖使內容與我擁有的網格對齊。

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

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

我認為變量名說明了一切。 鼠標坐標除以我的圖塊除以32x32像素,再乘以該倍數即可獲得對齊網格功能。

現在,這在屏幕上可以正常使用,但是當我想將其添加到“地圖”本身時,我不能僅將地圖的x和y偏移量添加到該位置,就搞砸了。

我已經玩了大約兩天,而且我還可以將它捕捉到地圖本身,但是當我說在地圖的兩個軸上的一半位置時,mouseX和mouseY將網格內容弄亂了。 我很難解釋,但是從0、0(每個原點位置,甚至是屏幕)的偏移加上從原點移開時的地圖偏移,都會加到光標本身和透明對象之間的距離我正在測試的對齊網格圖塊。 基本上,由於某些原因,地圖原點和相機之間的偏移量與光標和透明圖塊之間的偏移量相同。 因此,我向地圖移動的越遠,圖塊與光標的距離就越遠,最終移動到屏幕的寬度和高度之外...當我向地圖進一步移動時,我希望保持網格對齊功能corret,無論我在地圖上的什么位置。

渲染方法:

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

}

我真的不喜歡您的代碼的一件事是您沒有使用轉換。 使用轉換使您可以將世界與視口分開,在此處輕松調試此類問題,最重要的是,如果您想添加諸如縮放或稍后旋轉之類的內容,則只需添加幾行,而無需重寫渲染方法的一半。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM