Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java游戏中实现拖放_Java_Swing_User Interface_Drag And Drop_Jlayeredpane - Fatal编程技术网

在Java游戏中实现拖放

在Java游戏中实现拖放,java,swing,user-interface,drag-and-drop,jlayeredpane,Java,Swing,User Interface,Drag And Drop,Jlayeredpane,我正在做一个棋盘游戏,它是一个8x8网格,有5个不同颜色的图像。只要对象在行或列中彼此相邻,它们就可以交换。如果该开关导致一行或一列中有3个或更多对象相同,则将删除这些对象。如果切换结果不匹配,则切换不会发生。当对象被移除时,电路板会折叠,这样放置在移除对象上方的对象会下落以取代它们的位置,而新对象会从顶部下落以填充空间 我想知道一个实现拖动操作和物体下落的好方法。我应该使用分层窗格吗 任何想法都会对我有帮助 拖动操作: 创建一个hashmap,它报告一个颜色索引(比如8x8网格中总共5种不同的

我正在做一个棋盘游戏,它是一个8x8网格,有5个不同颜色的图像。只要对象在行或列中彼此相邻,它们就可以交换。如果该开关导致一行或一列中有3个或更多对象相同,则将删除这些对象。如果切换结果不匹配,则切换不会发生。当对象被移除时,电路板会折叠,这样放置在移除对象上方的对象会下落以取代它们的位置,而新对象会从顶部下落以填充空间

我想知道一个实现拖动操作和物体下落的好方法。我应该使用分层窗格吗

任何想法都会对我有帮助

  • 拖动操作: 创建一个hashmap,它报告一个颜色索引(比如8x8网格中总共5种不同的颜色)和一个矩形对象。Rect和color分别代表键和值。每次分别在两个相邻的块(矩形)上单击两次,获得这两种适当的颜色并交换它们。然后再次检查颜色分布,如果现在至少有一个块集在一条线上相邻有3种或3种以上相同的颜色。如果没有,请将颜色调回

  • 坠落: 在找到至少一个块集(甚至在同一行上有3个以上相邻块)后,通过每个矩形的高度*减去当前列中删除的矩形数,减去删除矩形上方的所有颜色块。之后,反复检查当前的颜色分布,直到一行上没有超过3种相同颜色的块集

  • 谢谢。你如何为用户创造物体坠落的感觉。我需要使用一些图形或计时器来创建这样的效果吗

    定时器将是一个不错的选择。在找到至少一个块集(甚至在同一行上有3个以上相邻块集)后,调用Timer的计划(TimerTask,long delay,long period),其中需要定义TimerTaskrun(),该计划只调用JComponent/JFrame的重新绘制(int x,int y,int width,int height)在主线程中定义以绘制下降部分。在JComponent/JFrame的绘制(图形g)中,您需要绘制下降部分的不同阶段。您还需要在TimerTask的运行()中使用循环,这样每次periodms之后,都会调用另一个JComponent/JFrame的重新绘制(x,y,width,height)。如果要循环5次,只需使用TimerTask的cancel()在第五个循环中,计时器将结束。如果您不太关心闪烁效果,只需使用重新绘制()即可,每次在绘制中绘制一个完整的8x8网格图像(图g)。我使用JComponent/JFrame的原因是,您可以直接在JFrame上绘制,也可以基于JFrame在JComponent上绘制

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

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

    请参见此和。非常感谢。我能够使用点p=SwingUtilities.convertPoint(e.getComponent(),e.getPoint(),container)从父坐标中获取行和列;