我正在 android studio 中制作 2D 游戏,几天来我一直在解决一个问题。我想停止我的线程 Gravity,以便我的玩家可以跳跃。当玩家完成跳跃后,重力线程可以继续。
我在互联网上搜索了如何将 wait() 和 notification() 与同步块(synchronized block)一起使用。但当我尝试应用它时,我的重力就不会停止。如果有人能告诉我如何正确使用它,我会非常高兴......
这是我在场景类中开始跳跃的代码。
public void recieveTouch(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
if(player.getPoint().y > 0) {
playerJump();
}
}
}
public void playerJump(){
playerJump = new Jump(player, this);
thread = new Thread(playerJump);
thread.setDaemon(true);
thread.start();
}
这是我的重力线程。
public class Gravity implements Runnable {
private Player player;
private GameScene gameScene;
public Gravity (Player player, GameScene gameScene){
this.player = player;
this.gameScene = gameScene;
}
@Override
public void run(){
while(true){
player.playerMoveDown(3);
gameScene.update();
try {
Thread.sleep(25);
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}
这是我的跳转线程。
public class Jump implements Runnable {
private Player player;
private GameScene gameScene;
public Jump (Player player, GameScene gameScene){
this.player = player;
this.gameScene = gameScene;
}
@Override
public void run(){
int eindHoogte = player.getPoint().y - 60;
while (player.getPoint().y > eindHoogte) {
player.playerMoveUp(3);
gameScene.update();
try {
Thread.sleep(25);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
最佳答案
假设您将相同的玩家对象传递给 Jump 和 Gravity 类,您可以在玩家上同步并维护跳跃完成操作的标志。
这将确保当玩家执行跳跃操作时重力会等待跳跃操作,并且只有在玩家跳跃时才会再次继续
flag只是为了防止一个线程调用notify()方法发送的通知在另一个线程没有调用wait()之前被错过的情况
请参阅下面的示例代码
public class Jump implements Runnable {
private Player player;
private GameScene gameScene;
public Jump (Player player, GameScene gameScene){
this.player = player;
this.gameScene = gameScene;
}
@Override
public void run(){
int eindHoogte = player.getPoint().y - 60;
while (player.getPoint().y > eindHoogte) {
player.playerMoveUp(3);
gameScene.update();
try {
Thread.sleep(25);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(player){
// acts as a signal to gravity thread to start processing the gravity operation
player.setJumpComplete(true);
}
}
}
public class Gravity implements Runnable {
private Player player;
private GameScene gameScene;
public Gravity (Player player, GameScene gameScene){
this.player = player;
this.gameScene = gameScene;
}
@Override
public void run(){
while(true){
synchronized (player) {
// if player has completed the jump then process the gravity operation else just wait for jump to complete
if(player.isJumpComplete()){
player.playerMoveDown(3);
gameScene.update();
// reset the jump flag and wait for the next jump operation to complete
player.setJumpComplete(false);
}
}
try {
Thread.sleep(25);
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}
关于java - 如何在java中正确使用wait()和notify线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42090075/