2016-07-14 67 views
0

好了,所以我试图让事情捕捉到网格我有。Java的网格对齐

这是我捕捉到画面本身:

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

变量名称说明了一切,我认为。 鼠标坐标除以我的图块为32x32像素,再次获得抓取到网格功能的次数。

现在这工作正常画面,但是当我想将它添加到“地图”本身,我不能只是添加我的地图x和y偏移到,它就会搞砸。

我已经玩了大约两天了,我也用它来捕捉到地图本身,但是当我说,在两个轴上的地图中途,mouseX和mouseY都会使网格东西了。 这是一种我很难解释,但是从0,0偏移量(每起源位置,甚至是屏幕)PLUS,当你从原点搬开地图偏移,被添加到光标本身和之间的距离透明的单元格对齐网格,我正在使用它来测试。 基本上,地图原点和相机之间的偏移是由于某种原因光标和透明图块之间的偏移量相同。因此,进一步进入地图我移动,渐行渐远的瓷砖从游标获取,并最终移动屏幕宽度和高度的外部... 当我进一步移动到地图,我要捕捉到网格功能保持一致,无论我在地图上的哪个位置。

Render方法:

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

完成,运算更新。 – Vauxe

回答

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

} 

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

+0

我对Java很陌生,每天都在学习新东西。当我回家时,我会尝试你的方法,然后再报告。 – Vauxe

+0

美丽。你是我的救世主! – Vauxe