我是Java的新手,现在我正在尝试理解Thread。
我目前正在做一个“让球弹起来,否则你就输了”的游戏。
在这个游戏中,有一个球从“墙”或“梁”上弹跳。
墙将随光标的x位置移动。没有y运动。
现在我不能使用计时器,因为如果我使用计时器,我将有相同的MouseMotion和球移动的延迟。
我正在尝试实现的是在延迟10ms的情况下获取鼠标移动信息,以及在延迟200ms的情况下获取球的移动。
有了计时器,我必须同时选择墙和球的延迟。10ms对于墙的移动来说是很棒的,因为当我移动鼠标时它会立即移动,但是对于球的移动来说太快了。甚至连查克·诺里斯都不能把鼠标移动得这么快,让球从墙上弹回来。
我尝试创建两个不同的计时器,但它不接受鼠标监听器。ActionListener是Timer唯一接受的监听器,但是由于某些原因,如果我使用单个计时器作为参数,它仍然会触发actionPerformed方法旁边的鼠标运动方法。但这给了我相同的延迟,对于球和墙。
这就是为什么我需要线程来做这件事。但是我不知道如何将鼠标运动信息从MouseListener获取到Thread中的paintComponent。
我希望你们能理解我的问题。
编辑:
这就是我现在尝试获得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中,只要用户单击start,我就会启动墙和触发器(球)计时器。
但我不能让球计时器和壁球计时器分开工作。墙计时器更快,可以完全重画,但我只想让它重画墙,而不是球。
发布于 2014-04-27 14:43:33
像往常一样添加您的侦听器( Maus扩展MouseMotionAdapter),不需要任何额外的线程。Event Dispather线程用于处理鼠标事件。
将javax.swing.Timer与任何所需的延迟一起使用,只是为了改变球的位置。
https://stackoverflow.com/questions/23320073
复制相似问题