我是Java新手,现在我正在尝试理解Threads。
我目前正在制作一个"让球反弹或者你输了#34;游戏。
在这个游戏中,有一个球可以反弹墙壁"或者是一个" Girder"。
墙移动光标的x位置。没有运动。
现在我无法使用Timer,因为如果我这样做,我会对MouseMotion和Ball Movement有相同的延迟。
我想要达到的目标是获得延迟10毫秒的鼠标运动信息以及延迟200毫秒的球运动。
使用Timer我必须选择墙壁和球的延迟。 10ms非常适合墙壁移动,因为当我移动鼠标时它会立即移动,但它对于移动球来说太快了。甚至连查克诺里斯都不能快速移动鼠标让球从墙上反弹。
我尝试创建2个不同的计时器,但它不会接受鼠标监听器。 ActionListener
是Timer
接受的唯一监听器,但由于某种原因,如果我使用带有actionPerformed
的单个计时器,它仍会触发this
方法旁边的鼠标移动方法参数。但这给了我同样的球和墙延迟。
这就是为什么我需要线程来做它。但我不知道如何在MouseListener
内从paintComponent
到Thread
获取鼠标移动信息。
我希望你们能理解我的问题。
编辑:
这就是我现在试图获得10毫秒的墙延迟和200毫秒的球延迟:
private Timer trigger = new Timer(200, this);
private Timer wall = new Timer(10, this);
paintComponent中的
if ((start.getText() == "Spiel aktiv..." || trigger.isRunning() == true) || wall.isRunning() == true) {
g.setColor(new Color(255, 254, 102));
g.fillRect(x, screen.getHeight() - 15, length, 10);
}
if ((start.getText() == "Spiel aktiv..." || trigger.isRunning() == true) && wall.isRunning() == false) {
ball_x = ball_x + dx;
ball_y = ball_y + dy;
if (ball_x > (screen.getWidth() - 100) || ball_x < 10) {
dx = -dx;
bounce = true;
}
if (ball_y > (screen.getHeight() - 115) || ball_y < 10) {
dy = -dy;
bounce = true;
}
}
g.setColor(new Color(103, 104, 255));
g.drawRect(ball_x, ball_y, 100, 100);
g.setColor(new Color(255, 254, 102));
g.fillOval(ball_x, ball_y, 60, 60);
}
}
在actionPerformed我启动墙并在用户点击开始时触发(球)计时器。
但我不能让球和墙上的计时器分开工作。墙上的计时器更快,并完成重绘,但我只是想让它重新粉刷墙而不是球。
答案 0 :(得分:1)
像往常一样添加你的监听器(Maus扩展MouseMotionAdapter
)而不需要任何额外的线程。 Event Dispather Thread用于处理鼠标事件。
使用javax.swing.Timer
任意所需的延迟只是为了改变球的位置。