【问题标题】:mouseDragged help needed with Java gameJava 游戏需要 mouseDragged 帮助
【发布时间】:2018-05-16 23:20:59
【问题描述】:

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

这是我的球拍课:

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) {


            }

【问题讨论】:

  • 从概念上讲,这个想法并不难。您有一个标记开始位置的“按下”点和一个标记当前位置的“拖动”位置,困难在于,您需要定义一个“偏移量”,它定义了鼠标“按下”点之间的差异“以及你所拖动的东西的起源。因此,当“拖动”甚至发生时,您可以将“偏移”应用于“当前”位置,这将成为您拖动的原点 - 像泥巴一样清晰:P
  • 幸运的是,这种事情以前也有人问过,for example、example、example……哦,你明白了
  • 感谢您的帮助,但我仍然很困惑,我是 java 新手,所以所有这些词对我来说都是新的,你能描述一些步骤吗?

标签: java


【解决方案1】:

基本思想是……

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

也许是……

MouseAdapter mouseHandler = new MouseAdapter() {

    private Point offset;
    private Racquet racquet;

    @Override
    public void mousePressed(MouseEvent e) {
        // Did we click on a racquet?
        if (racquet.getBounds().contains(e.getPoint())) {
            // The difference between the mouse point and the original of the racquet
            offset = new Point(e.getPoint().x - racquet.getBounds().x, e.getPoint().y - racquet.getBounds().y);
        }
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // Are we dragging a racquet
        if (offset != null) {
            int newX = e.getPoint().x - offset.x;
            int newY = e.getPoint().y - offset.y;

            // This should be applied as a setting, but here we are
            racquet.x = newX;
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // Release racquet
        offset = null;
    }

};

// The mouseHandler needs to be added to the primary rendering surface
// component.    
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHander);

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

不过,我建议阅读以下内容:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2018-04-10
    • 2014-11-30
    • 2020-02-25
    • 2016-01-08
    • 2016-06-25
    • 2014-12-04
    相关资源
    最近更新 更多