2013-03-14 31 views
0

我們的團隊項目是使用Java Eclipse創建滑動拼圖遊戲。我們的代碼是用相同的圖片創建一個3x3的網格(它應該是一張圖片,但是分成9個部分,但後面會很好地學習)。我的部分是創建一個鼠標偵聽器,單擊所選的「磁貼」,然後顯示消息測試以查看所選磁貼是否被正確點擊。 (例如:如果用戶點擊圖塊1,消息顯示「圖塊1被點擊」)我想我將不得不爲每個圖塊創建單獨的鼠標偵聽器。有什麼建議麼?滑動拼圖代碼

繼承人的代碼:

import javax.swing.*; 
    import javax.swing.event.*; 
    import java.awt.*; 
    import java.awt.event.*; 

    public class Puzzle 
    { 
// Initialize the Frame for the Puzzle 
private JFrame frame = new JFrame("Puzzle"); 
private JPanel puzzlePanel = new JPanel(null); 
private JLabel status; 


// Itemize Menu 
private JMenuBar menu = new JMenuBar(); 
private JMenu menuFile = new JMenu("File"); 
private JMenuItem menuFileNew = new JMenuItem("New Game"); 
private JMenuItem menuFileQuit = new JMenuItem("Quit"); 
private JMenu menuHelp = new JMenu("Help"); 
private JMenuItem menuHelpAbout = new JMenuItem("About"); 

// Variables 
// Easy(3) Medium(4) Hard(5) 
private int dimm = 3; 
private int spacing = 5; 
private int tileDimm = 96; 

// Constructor 
public Puzzle() 
{ 
    status = new JLabel("Default"); 
    frame.add(status,BorderLayout.SOUTH); 


    // Build Menu 
    frame.setJMenuBar(menu); 
    menuFile.add(menuFileNew); 
    menuFile.add(menuFileQuit); 
    menuHelp.add(menuHelpAbout); 
    menu.add(menuFile); 
    menu.add(menuHelp); 

    // Panel 
    puzzlePanel.setPreferredSize(new Dimension((dimm*tileDimm)+(spacing*(dimm+1)),(dimm*tileDimm)+(spacing*(dimm+1)))); 
    frame.add(puzzlePanel); 

    // Puzzle Logic 
    PuzzleLogic puzzleLogic = new PuzzleLogic(dimm); 



    Tile[][] tiles = puzzleLogic.createTileArray(); 
    puzzleLogic.shuffleTiles(tiles); 
    for(int i = 0; i < dimm; i++) 
    { 
     for(int ii = 0; ii < dimm; ii++) 
     { 
      puzzlePanel.add(tiles[i][ii].getLabel()); 
      int x = i*tileDimm+(spacing*(i+1)); 
      int y = ii*tileDimm+(spacing*(ii+1)); 
      tiles[i][ii].getLabel().setBounds(x,y,tileDimm,tileDimm); 

      System.out.print(tiles[i][ii].getContent() + " "); 
     } 
    } 

    HandlerClass handler = new HandlerClass(); 
    puzzlePanel.addMouseListener(handler); 
} 

// create listener - inner class 
class HandlerClass implements MouseListener 
{ 

    public void mouseClicked(MouseEvent e) 
    { 

     status.setText(String.format("Tile 1 is clicked")); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) 
    { 
     status.setText(String.format(" ")); 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

} 

public void launch() 
{ 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); //Adjusts panel to components for display 
    frame.setVisible(true); 
    frame.setResizable(false); 
} 

// Calls Everything to Action 
public static void main(String[] args) 
{ 
    Puzzle puzzle = new Puzzle(); 
    puzzle.launch(); 
} 

}

+0

閱讀我的文章[2048 Game in Java Swing](http://java-articles.info/articles/?p=516),瞭解創建滑動遊戲的一種方法。 – 2014-12-06 22:50:47

回答

1

你的代碼已經使得整個拼圖一個聽衆。因此,在mouseClicked處理程序中,您可以計算鼠標相對於謎題位置的位置,計算它是否位於頂部/底部/中間三分之一以及左側/右側/中間三分之一處,然後您可以計算玩家點擊哪個部分?

您可以使用e.getX()e.getY()來獲得鼠標位置的座標。

+0

即時通訊困惑如何計算,如果它在頂部底部中間大聲笑 – TomL 2013-03-14 20:08:07

+0

所有我想要做的是在我運行它,並說我點擊左上方的瓷磚,它顯示「瓷磚1」。如果我點擊頂部行中的中間框,它會顯示「平鋪2」。如果右上方的瓷磚被點擊是顯示「瓷磚3」等等lol – TomL 2013-03-14 20:13:27

0

你可以得到鼠標點擊的X和Y座標,然後分別用寬度和高度進行劃分,你可以得到塊號..但它會返回X:0,1,2 Y:0,1,2 [for在最後。你的代碼一個3x3塊] ..所以一定要加一個(+1)會有點像:

Xblock = event.getX()/blockwidth + 1;和similialy用於Y

您可能必須採取邊框寬度和休息要正確的東西點擊位置使你的拼圖的左上角0,0;

+0

我會設置什麼等於那麼blockwidth? – TomL 2013-03-14 20:10:03

+0

假設你有一個90x90像素的謎題,那麼每個塊將是30x30所以'blockwidth/*(將)*/= 30個像素。' – RE60K 2013-03-15 05:20:40

+0

嗯,我得到一個值,但當它點擊不同點時,它會發生變化。這是否與邊界寬度有關? – TomL 2013-03-18 15:12:45