java鼠标拖动小球运动,用java写一个象棋小游戏,如何实现鼠标拖动棋子的效果...

用java写一个象棋小游戏,怎么实现鼠标拖动棋子的效果?

用java写一个象棋小游戏,怎么实现鼠标拖动棋子的效果?用java写一个象棋小游戏,怎么实现鼠标拖动棋子的效果?就比如当鼠标在一个 “马” 上点击后不松开,鼠标移动到那里这个棋子就移动到那里,鼠标在哪里松开棋子就落到那里。如果能落就落下,不能落在鼠标松开后棋子又回到原来的地方。

------解决思路----------------------

写一个监听器类,继承MouseAdapter,设置一个标识变量,初始值为false,重写mousePressed()方法,记录鼠标点击位置和被点击对象的位置差,并设置标识变量为true,重写mouseReleased()方法,将标识变量设置为false,重写mouseMoved()方法,如果标识变量为true,就根据差值和当前鼠标位置,修改被点击对象的位置

将棋子设置为单独的显示对象,生成一个监听器类的实例listener,为棋子addMouseListener和addMouseMotionListener,都是定义好的listener

------解决思路----------------------

一个简单的实现,稍有变化,1、不用设置标识变量,2、不重写mouseMoved()方法,而是重写mouseDraged()方法。代码如下

package move_panel;

import java.awt.EventQueue;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.border.EmptyBorder;

/**

* 测试窗体

* @author zys59三仙半(QQ:597882752)

* 创建时间:2015年11月4日 上午8:07:50

*/

public class MainFrame extends JFrame {

private static final long serialVersionUID = -6414188894860816472L;

private JPanel contentPane;

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

MainFrame frame = new MainFrame();

frame.setVisible(true);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

public MainFrame() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 450, 300);

contentPane = new JPanel();

contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

contentPane.setLayout(null);

setContentPane(contentPane);

Chessman man1 = new Chessman("马");

man1.setLocation(10, 10);

MouseAction action = new MouseAction();

man1.addMouseListener(action);

man1.addMouseMotionListener(action);

add(man1);

}

}

package move_panel;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Graphics;

import javax.swing.JPanel;

/**

* 棋子

* @author zys59三仙半(QQ:597882752)

*         创建时间:2015年11月4日 上午8:08:57

*/

public class Chessman extends JPanel {

private static final long serialVersionUID = -5193489382746074068L;

private int size = 30;

private String txt;

public Chessman(String txt) {

this.txt = txt;

setLayout(new BorderLayout());

setSize(size+1, size+1);

}

@Override

public void paint(Graphics g) {

// TODO Auto-generated method stub

super.paint(g);

Color c = g.getColor();

g.setColor(new Color(255, 0, 0));

g.drawOval(0, 0, 30, 30);

g.setColor(c);

g.drawString(txt, 10, 20);

}

}

package move_panel;

import java.awt.Point;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

/**

* 鼠标相关事件监听器类,用于移动棋子

* @author zys59三仙半(QQ:597882752)

*         创建时间:2015年11月4日 上午8:17:31

*/

public class MouseAction extends MouseAdapter {

private int dx;

private int dy;

@Override

public void mousePressed(MouseEvent e) {

// TODO Auto-generated method stub

dx = e.getX();

dy = e.getY();

}

@Override

public void mouseDragged(MouseEvent e) {

// TODO Auto-generated method stub

Chessman man = (Chessman) e.getSource();

Point p = man.getLocation();

man.setLocation(p.x + (e.getX() - dx), p.y + (e.getY() - dy));

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值