Java游戏需要mouseDragged帮助

时间:2018-05-16 23:20:59

标签: java

我正在制作一个简单的乒乓球Java游戏,其中有一个球拍和一个球。但是,我成功地在球拍上实现了一个mouseWheel来移动。我想改为使用mouseDragged事件。我是Java新手,这些鼠标事件真的令人困惑。

这是我的网球课:

import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

public class Racquet {
private static final int Y = 330;

private static final int HEIGHT = 10;

int x = 0;
int xa = 0;
static int WIDTH = 60;
private Game game;

public Racquet(Game game) {
    this.game = game;
}

public Racquet(Game game, int WIDTH) {
    this.WIDTH = WIDTH;
}



public void move() {
    if (x + xa > 0 && x + xa < game.getWidth() - WIDTH)
        x = x + xa;
}

public void paint(Graphics2D g) {
    g.fillRect(x, Y, WIDTH, HEIGHT);
}

public void keyReleased(KeyEvent e) {
    xa = 0;
}

public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_LEFT)
        xa = -1;
    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        xa = 1;
}

public Rectangle getBounds() {
    return new Rectangle(x, Y, WIDTH, HEIGHT);
}

public int getTopY() {
    return Y;
}



public void mouseDragged(MouseEvent m) {
    xa = 0;

}
  }

这是我的“游戏”课,我也试图实现球拍:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;



import javax.swing.ButtonGroup;
import javax.swing.JButton;
addMouseMotionListener(new MouseMotionListener() {

            @Override
            public void mouseDragged(MouseEvent m) {
                    racquet.mouseDragged(m);
            }

            @Override
            public void mouseMoved(MouseEvent arg0) {


            }

1 个答案:

答案 0 :(得分:2)

基本理念是......

  • 发生mousePressed事件时,您需要确定事件是否发生在Racquet中。 Rectangle有一个简洁的contains方法,可以做到这一点(这被称为“命中检测”)
  • 如果“{1}}被”按下“,则需要计算鼠标事件与Racquet的原点之间的差异(即,它当前的x / y点)
  • 当发生Racquet事件时,您需要确定是否实际拖动mouseDragged,如果是,则需要计算鼠标点与原始点击“偏移”之间的差异,这为您提供了Racquet
  • 的新原点
  • 当发生Racquet事件时,您需要将mouseReleased标记为未被拖动,以便将来拖动事件“意外”导致Racquet被移动

也许像......

Racquet

附注:我正在使用不完整的图片,并将解决方案基于类似问题的其他示例。如果您需要更多信息,则需要提供Minimal, Complete, and Verifiable example以便为问题提供更多背景信息。

但是,我建议阅读:

以更好地了解鼠标侦听器API的工作原理