2016-07-14 86 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