2014-01-14 100 views
0

我一直在學習如何在java中使用rpg風格的遊戲,並找到一個很好的教程。但是,本教程演示瞭如何使用按鍵偵聽器移動精靈,我想要做的是通過在屏幕上獲取鼠標位置並在沒有任何按鍵偵聽器的情況下自行移動精靈來使精靈移動。繼承人迄今爲止的代碼,感謝您的幫助! (哦,問題是精靈是不動的,忘了說......是不是因爲在移動方法while循環?)MouseListener no movement

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

import javax.swing.ImageIcon; 

public class SpaceCraft { 

    private String craft = "craft.png"; 

    private int dx; 
    private int dy; 
    private int x; 
    private int y; 
    private Image image; 

    public SpaceCraft() { 
     ImageIcon spaceCraft = new ImageIcon(this.getClass().getResource(craft)); 
     image = spaceCraft.getImage(); 
     x = 40; 
     y = 60; 
    } 

    public void move() { 
     while ((x==Board.mouseX)==false) { 
      if (x < Board.mouseX){ 
       x += 1; 
      } else if (x > Board.mouseX){ 
       x -= 1; 
      } 
     } 
     while ((y==Board.mouseY)==false) { 
      if (y < Board.mouseY){ 
       y += 1; 
      } else if (y > Board.mouseY){ 
       y -= 1; 
      } 
     } 

    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    public Image getImage() { 
     return image; 
    } 



    /* public void keyPressed(KeyEvent e) { 

     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_LEFT){ 
      dx = -1; 
     } 
     if (key == KeyEvent.VK_RIGHT) { 
      dx = 1; 
     } 

     if (key == KeyEvent.VK_UP) { 
      dy = -1; 
     } 

     if (key == KeyEvent.VK_DOWN) { 
      dy = 1; 
     } 

    }*/ 

    /* public void keyReleased(KeyEvent e) { 
     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_LEFT) { 
      dx = 0; 
     } 

     if (key == KeyEvent.VK_RIGHT) { 
      dx = 0; 
     } 

     if (key == KeyEvent.VK_UP) { 
      dy = 0; 
     } 

     if (key == KeyEvent.VK_DOWN) { 
      dy = 0; 
     } 
    }*/ 


} 


import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Toolkit; 
import java.awt.event.*; 

import javax.swing.*; 

import javax.swing.JPanel; 
import javax.swing.Timer; 
public class Board extends JPanel implements ActionListener { 

    public static int mouseX; 
    public static int mouseY; 
    private Timer timer; 
    private SpaceCraft craft; 

    public Board() { 
     //addKeyListener(new TAdapter()); 
     setFocusable(true); 
     setBackground(Color.GREEN); 
     setDoubleBuffered(true); 

     craft = new SpaceCraft(); 

     timer = new Timer(5, this); 
     timer.start(); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 

     Graphics2D g2d = (Graphics2D)g; 
     g2d.drawImage(craft.getImage(), craft.getX(), craft.getY(), this); 

     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     craft.move(); 
     repaint(); 
    } 
    public void mouseReleased(MouseEvent e) { 
     mouseX = e.getXOnScreen(); 
     mouseY = e.getYOnScreen(); 
     craft.move(); 
     repaint(); 
    } 

    /*private class TAdapter extends KeyAdapter { 

     public void keyReleased(KeyEvent e) { 
      craft.keyReleased(e); 
     } 

     public void keyPressed(KeyEvent e) { 
      craft.keyPressed(e); 
     } 
    }*/ 



} 

import javax.swing.*; 
import java.applet.*; 
import java.awt.Dimension; 
import java.net.*; 

public class RType extends Applet { 
    Board b = new Board(); 

    public void init() { 
     b.setPreferredSize(new Dimension(400, 400)); 
     add(b); 

    } 

} 

回答

2

您必須在的MouseListener添加到您的面板Board

變化

public class Board extends JPanel implements ActionListener { 

public class Board extends JPanel implements ActionListener,MouseListener { 

在構造函數中添加

addMouseListener(this); 
+0

啊我明白了,讓我試試看! –

0

有幾個方法,你可以採取。

首先,你可以記錄當前位置時的actionPerformed(ActionEvent的五)被稱爲上的鼠標事件,並保持當前的X軌道和Y

然後你只需要這樣在以使你遊戲循環,現在必須在paint()中,您將X和Y應用到遊艇上。

因此,添加一個調用craft.move(); ()

然後,如果您想使它更好,而不是記錄actionPerformed事件,則可以在調用craft.move()時直接檢查鼠標的位置。

PointerInfo a = MouseInfo.getPointerInfo(); 
Point b = a.getLocation(); 
int x = (int) b.getX(); 
int y = (int) b.getY(); 

是一個方法,但我想,讓你絕對座標,和您希望他們相對於你的窗口,對不對?

Display.getCurrent().getCursorLocation(); 

MouseInfo.getPointerInfo(); 

雖然這只是移動工藝正好到鼠標位置。如果您希望它具有最高速度並朝鼠標位置移動,則需要使您的craft.move()方法更加智能化。

+0

當在鼠標事件上調用actionPerformed()時?咦?這個答案沒有任何意義。 –

+0

@KevinWorkman他目前使用ActionListener來獲取鼠標點擊時的X和Y座標,這會通過事件e調用actionPerformed(),該事件給你X和Y座標。他已經這樣做了,所以我談到了這個方法,但是有更好的選擇,所以我提供了這些方法。你有什麼不明白? – SpacePrez

+0

他詢問了一個沒有actionPerformed()方法的MouseListener。您描述的方法似乎比僅使用MouseListener更不直觀。 –

1

你需要一次移動你的精靈,畫出每一步的方式。你現在做的方式是,當你的精靈動作時,你沒有任何繪畫,所以它看起來像傳送到鼠標位置。

您還必須實際添加MouseListener,而不只是編寫MouseListener方法。

+0

謝謝你的建議!我會盡量玩弄它 –