2016-07-14 10 views
0

私はグリッドに物事をスナップしようとしています。グリッドにJavaスナップ

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

変数名が自分自身のために話すと思う:

これは私がスクリーン自体にスナップする方法です。 マウス座標を32x32ピクセルのタイルで割ったもので、再びグリッドにスナップする機能を得るための時間です。

これは画面上でうまく動作しますが、「マップ」自体に追加したいときは、マップxとyのオフセットを追加するだけではうんざりしてしまいます。

私は約2日間それを使って遊んだし、マップ自体にもスナップするようにしましたが、私は両方の軸上のマップの途中で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); 

申し訳ありませんが、それは私ができる最善だ: はここで、現時点ではハイライトには何があります。 私は何が間違っていますか?

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

} 

あなたのコードで本当に好きではないことの1つは、変換を使用していないことです。変換を使用すると、ワールドをビューポートから分離して、ここでのような問題のデバッグをもっと簡単に行うことができます。最も重要なことは、スケーリングや後で回転するようなものを追加する場合は、あなたのレンダリング方法の半分。

+0

私はJavaにはかなり新しいので、毎日新しいことを学んでいます。私は家に帰るときにあなたの方法を試し、後で報告します。 – Vauxe

+0

美しい。あなたは私の救い主です! – Vauxe

関連する問題