难以捉摸的球类游戏项目

时间:2014-07-23 17:44:07

标签: java swing animation paint mouselistener

因此,对于我们的班级,我们正在制作一个难以捉摸的球项目。基本上它是一个游戏,鼠标必须追逐圆圈直到用户得到它。但是在我的代码中,鼠标监听器正在识别鼠标移动,但它根本没有与圆形交互。球不是移动的时期。我不知道这是不是我的逻辑,或者我是否使用了错误的方法或什么。

package lab10;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Random;

import javax.swing.JFrame;



public class Lab10 extends JFrame implements MouseMotionListener{
int x = 325;
int y = 325;
int rX;
int rY;

public Lab10() {
    super("The Elusive Circle");
    addMouseMotionListener(this);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(750,750);
    setVisible(true);

}


public void paint(Graphics g) {
    super.paint(g);
    g.drawOval(getX(),getY(),80,80);
    g.setColor(Color.MAGENTA);
    g.fillOval(getX(),getY(),80,80);



}

public static void main (String args[]) {
    Lab10 circle = new Lab10();
    System.out.println("MY HEAD!");
}
public void mouseDragged (MouseEvent e) {

    System.out.println("bacon pancakes");

}
public void mouseMoved (MouseEvent e) {
    setCircle(e);
    System.out.println("my head!!");
}



public void setCircle(MouseEvent m) {
    int getx = m.getX();
    int gety = m.getY();
    Random r = new Random();
    int rX = r.nextInt(700 - 51) + 51;
    int rY = r.nextInt(700 - 51) + 51;
    boolean getxInBounds = (getx == (rX+80));
    boolean getyInBounds = (gety == (rY+80));
    boolean getxInBounds2 = (getx == (rX-80));
    boolean getyInBounds2 = (gety == (rY-89));
    setX(rX);
    setY(rY);
    if(getxInBounds||getxInBounds2||getyInBounds||getyInBounds2){
                repaint();
                }

}
public void mouseClicked (MouseEvent e) {
    System.out.println("Idk");
}
private void setX(int a) {
    int x = a;
}
private void setY(int b) {
    int y = b; 
}
public int getX(){
    return x;
}
public int getY() {
    return y;
}

2 个答案:

答案 0 :(得分:2)

您在paint方法中的 JFrame 上调用getX()getY(),并且由于这些从未改变,因此球永远不会移动。为您的类提供MouseMotionListener设置的xPosition和yPosition字段,并在paint方法中使用这些字段。

编辑:你已经有了这些字段。设置rX和rY字段。请注意,请勿调用setX(...)setY(...),因为这些设置了组件的位置,而不是您的圈子,并且不提供GUI类getX()getY()方法因为这些会覆盖组件的方法,导致令人讨厌的副作用。

顺便说一句,你最好不要在JFrame中显示的JPanel的paintComponent方法中绘制。

答案 1 :(得分:2)

除了@Hovercraft所说的,Swing is not thread safe和所有Swing代码都应该在Event Dispatch Thread上执行。在您的主要方法中,您应该execute the initialization on the EDT

public static void main (String args[]) {
   SwingUtilities.invokeLater(new Runnable() {
      public void run() {
         Lab10 circle = new Lab10();
         System.out.println("MY HEAD!");
      }
   });
}

否则,您的代码可能会出现#34;奇怪的错误"那些没有意义且无法调试的东西。