我创建了一个Bukkit可运行计时器,计算所有玩家在游戏开始时会在其记分牌上看到的计数器,但我注意到每个加入计时器的玩家都会上升2.我不知道如何解决这个,建议?我一直在四处寻找,却没有找到解决方法。
InGame课程:
memset(*mappedMemory, 3, 1024);
主类代码:
public class InGame extends BukkitRunnable implements Listener{
private Main main;
public InGame(Main main) {
this.main = main;
}
public static int time;
public void run() {
if (time == 300) {
if (GameState.getCurrentGamestate() == GameState.INGAME) {
Bukkit.broadcastMessage(Main.prefix + "§b5 " + "§6minutes has passed!");
for(Player all : main.players) {
all.playSound(all.getLocation(), Sound.NOTE_PLING, 1, 1);
}
return;
}
}
if(time == 6000) {
Bukkit.broadcastMessage(Main.prefix + "§b10 " + "§6minutes has passed!");
for(Player all : main.players) {
all.playSound(all.getLocation(), Sound.NOTE_PLING, 1, 1);
}
}
if(time == 12000) {
Bukkit.broadcastMessage(Main.prefix + "§b20 " + "§6minutes has passed!");
for(Player all : main.players) {
all.playSound(all.getLocation(), Sound.NOTE_PLING, 1, 1);
}
}
if(time == 18000) {
Bukkit.broadcastMessage(Main.prefix + "§b30 " + "§6minutes has passed!");
for(Player all : main.players) {
all.playSound(all.getLocation(), Sound.NOTE_PLING, 1, 1);
}
}
time += 1;
}
}
答案 0 :(得分:1)
所以你为每个加入的玩家制作一个Runnable,然后在每个Runnable中为你的计时器添加+1。因此,如果有12个玩家加入,则每秒有12个Runnable,所以它每秒增加12次+1秒。
要解决此问题,请不要让游戏线程控制一个事件。在不使用任何事件的情况下以可靠的方式控制它。仅使用事件来控制带有播放器的ArrayLists并检查线程中的ArrayLists。
如果您使用多个线程访问其中一个线程中的某些内容,则应使用synchronized关键字。我建议你深入研究它。
我为此做了一个小例子,我希望这会更清楚。
主要课程:
public class Game extends BukkitRunnable {
private Main main;
private int time;
public Game(Main main) {
this.main = main;
}
public void run() {
for(Player player : main.players) {
final org.bukkit.scoreboard.Scoreboard s = Bukkit.getScoreboardManager().getNewScoreboard();
player.setScoreboard(s);
final Objective o = s.registerNewObjective("sidebar", "dummy");
o.setDisplayName("Sidebar");
o.setDisplaySlot(DisplaySlot.SIDEBAR);
o.getScore("Time: " + this.time).setScore(12);
}
// Don't count if there are no players
if (!main.players.isEmpty()) {
this.time++;
}
}
}
我的Game()扩展了BukkitRunnable类:
synchronized
你可以创建更多的BukkitRunnables,比如Game()类,但一定要在需要时使用movie_info_idx
,这样就可以保证线程安全。
向hnefatl致敬,为我提供正确的方法。如果有更好的选择,我希望在评论中听到它们。