在Java游戏中实现拖放

时间:2012-03-17 15:05:06

标签: java swing user-interface drag-and-drop jlayeredpane

我正在制作一款8x8网格的棋盘游戏,其中有5张不同颜色的图像。只要对象在行或列中彼此相邻,它们就可以交换。如果开关导致3个或更多对象在行或列中相同,则将删除它们。如果交换机没有匹配,则不会发生切换。当移除物体时,板会坍塌,使位于移除物体上方的物体掉落以取代它们的位置,新的物体从顶部落入以填充空间。

我想知道一种实现拖动操作和掉落对象的好方法。我应该使用分层窗格吗?

任何想法都会帮助我。

1 个答案:

答案 0 :(得分:0)

  1. 拖动操作: 创建一个hashmap,它报告一个颜色索引(比如8x8网格中的5种不同颜色)和一个矩形对象。矩形和颜色分别代表键和值。您在2个相邻的块(rects)上分别单击两次,获得这两种适当的颜色并进行交换。然后再次检查您的颜色分布,如果现在至少有一个块设置为在一条线上相邻的3个或多于3个相同颜色。如果没有,请重新交换颜色。

  2. 跌倒: 在找到至少一个块集(在同一条线上甚至超过3个块)之后,通过每个矩形的高度 * 删除已删除的矩形上方的所有颜色块。在当前专栏中。然后反复检查当前的颜色分布,直到在一行上没有更多的块设置超过3个相同的颜色。

  3. 感谢。如何创建对用户感觉到的物体掉落。我是否需要使用一些图形或计时器来创建这种影响?

    计时器将是一个不错的选择。在找到至少一个块集(在同一行上超过3个甚至相邻)之后调用Timer的调度(TimerTask任务,长延迟,长周期),其中您需要定义 TimerTask run(),它不会只调用main中定义的JComponent / JFrame的重绘(int x,int y,int width,int height)线程绘制下降部分。在JComponent / JFrame的 paint(Graphics g)中,您需要绘制下降部分的不同阶段。你还需要在 TimerTask的run()中使用一个循环,这样每次在 period ms之后,另一个JComponent / JFrame的重绘(x,y,width,高度)将被调用。如果你想循环它5次,那么只需在第5个循环中使用 TimerTask的cancel(),定时器就会结束。如果您不太关注闪烁效果,只需使用 repaint(),然后每次在 paint(Graphics g)中绘制整个8x8网格图像。我使用JComponent / JFrame的原因是你可以直接在JFrame上绘制,也可以在JFrame上绘制JFonent。

    感谢。我有一些想法来实现下降和拖动效果。现在我被困在我的程序中,无法找到出路。如果我得到一些帮助,我将不胜感激。到目前为止,我的程序是在框架中创建了一个8x8 gridlayout的面板。我创建了一个具有ImageID的类(带有行和列号的字符串),Image(JLabel),行和列。我创建了一个存储在GridLayout中的二维数组存储的64个对象。每个对象都附有一个mouselistener和mousemotionlistener。当用户点击一个网格时,我得到了图像对象并且点击了获取图像的行和列 - newjav昨天
    我被困的问题是鼠标被按下,拖动和释放。当mouserelease或mousedrag是被按下的对象时,我得到的对象。所以我没有获得释放鼠标的网格的行和列。如何计算释放鼠标的网格位置。我被困在这里,无法继续下去

    如果您只使用mousePressedListener和mouseReleasedListener而没有使用mouseMotionListener,那么您可以单独获取源和目标网格对象。但我认为你的目标是使用MouseMotionListener。所以我有两个变种: 1。按下网格对象后不久,就会得到网格对象(即你得到这个网格对象的边界)。例如您单击了第二行和第二列中的网格obj,然后您可以获得网格obj的成员 = 1和 coloum = 1.假设每个成员的宽度和高度网格都是10(像素)。然后你得到这个网格的边界obj:(10,10)和(20,20)。现在您要拖入另一个网格。所以你需要在这个网格obj的mouseReleased()函数中添加一个条件:如果当前释放的鼠标位置超出了这个网格obj的边界,他的一个邻居现在是目标网格obj。例如if(例如,getX()> 20&& e.getY()> 10&& e.getY()< 20){//然后目标网格obj位于源网格obj的右侧side,and bounds是(20,10),(30,10),即row = 1,column = 2}使用行和列,您可以从2D数组中找到目标网格obj。 2。但是如果我是你,我不会为每个网格分配一个mouseListener和mouseMotionListener,但只分配包含这64个网格对象的面板一个mouseListener和一个mouseMotionListener。每次单击,拖动然后释放,您将获得一个合适的位置,您可以使用该位置轻松转换为行和列。使用行和列,您可以从2D阵列中找到适当的网格obj。而已。希望这就是你想要的。