0

我正在创建一个国际象棋游戏,现在我已经用所有棋子填充了我的图形棋盘,现在我需要使用 Mouselistner 来移动棋子。在实现图形版本之前,我创建了一个包含“玩家移动”的 2D 控制台版本,所以我确实拥有所有这些方法,但我现在需要使用 Mouselistener,我阅读了这些方法,但是,我需要实现吗每个班级的mouselistener?

我有 1 个抽象 Piece 类和 7 个子类(包括 Dummy 棋子)和一个 ChessBoard 类,它填充所有棋子并提供移动方法(来自控制台版本..),那么我应该将鼠标监听器放在哪里?在 Jcomponent 扩展、JFrame 或 ChessBoard 类中包含填充棋盘和移动的方法?

4

2 回答 2

0

这在某种程度上取决于您如何实现您的作品。如果它们本身就是 GUI 对象,例如按钮或面板,那么将 mouseListener 放在它们上面将允许 Swing 框架确定单击了哪个对象。如果这些片段都扩展了一个 Piece 类,那么您可以在其中放置一个处理程序,只要它需要执行的逻辑(例如移动一个片段)可以对所有片段都相同。

另一方面,如果您在代码中的板上绘制图形图像,那么 Swing 没有 GUI 组件来检测被点击,那么在板上实现 mouseListener 会更有意义。在这种情况下,您的代码将不得不确定点击了哪个方块,以及它上面是否有一块;之后的处理将与前一个案例非常相似。

于 2013-11-06T03:56:09.810 回答
0

抱歉这么简单的答案,但您需要做的就是将鼠标侦听器添加到您的 ChessBoard 类中。从那里我假设您可以访问您已实例化的 Piece 子类对象并在它们上调用方法(即 mouseClicked、piece.pickUp())。如果您的代码以需要在许多类中实现鼠标侦听器的方式排列,请考虑以下事项:

addMouseListener( new MouseAdapter() {
    @Override
    public void mouseClicked( MouseEvent e ) {
          // Do something
    }
} );

http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseAdapter.html

另外,如果是我,我会将用于移动 Pieces 的方法转移到 Piece 类中,最好是在更高级别上,这样您就不必两次重写相同的代码。然后在你的游戏中,每当mouseReleased被调用时,调用像 tryToMove(BoardPoint p) 这样的方法来检查你的棋子的当前位置和新位置 p 是否在你棋子的移动方式内。BoardPoint 可以是您为自己的棋盘设置的 8 X 8 样式的 x、y 坐标,例如二维整数数组。

于 2013-11-06T02:37:05.073 回答