gpt4 book ai didi

Java/JavaFX 事件处理程序和 setFill() 问题

转载 作者:行者123 更新时间:2023-11-30 06:36:34 25 4
gpt4 key购买 nike

我正在编写一款受康威的“生命游戏”启发的游戏。

虽然我已经弄清楚了整体游戏逻辑(但没有编码),但我仍然无法在玩家的第一个回合结束后更改矩形对象的填充颜色。当我运行我的程序时,它会跳过对玩家一号颜色(Color.BLUE)的要求,并直接进入玩家二号颜色(Color.RED)。

这是代码:

//William Fisher
//July.11.2017
package cellularautomatagame;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.*;
import javafx.scene.paint.*;
import javafx.scene.canvas.*;
import javafx.scene.input.MouseEvent;
import static javafx.scene.paint.Color.*;


public class CellularAutomataGame extends Application {

@Override
public void start(Stage stage) {

Group root = new Group();
Scene s = new Scene(root, 300, 300, Color.BLACK);

Canvas canvas = new Canvas(1280,720);
GraphicsContext gc = canvas.getGraphicsContext2D();

root.getChildren().add(canvas);

stage.setScene(s);
stage.show();

gc.setFill(WHITE);
gc.fillRect(0, 0, 5, 720);
gc.fillRect(0, 0, 1280, 5);
gc.fillRect(0, 715, 1280, 5);
gc.fillRect(1275, 0, 5, 720);


Player player1 = new Player();
Player player2 = new Player();


player1.playerFirstMove(root,canvas,Color.BLUE);
player2.playerFirstMove(root,canvas,Color.RED);
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}

}

//William Fisher
// July.11.2017
package cellularautomatagame;

import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import static javafx.scene.paint.Color.*;
import javafx.scene.shape.Rectangle;

public class Player {
int firstMove = 0;

public void playerFirstMove(Group root,Canvas canvas,Color color){

canvas.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){
@Override
public void handle (MouseEvent e){
while(firstMove < 1){
if(e.getClickCount() == 1){
Rectangle r = new Rectangle(e.getX(),e.getY(),5,5);
r.setFill(color);
root.getChildren().add(r);
firstMove++;
}
}
}
});
firstMove--;
}
}

/** (07/11/2017)Current Problem: The first player is unable to make their first move. Only the
* second player is able to make a first move.
*
* (07/16/2017)Current Problem: Same as previous problem, changed the code so that a rectangle
* object would spawn upon mouse click event. Problem possibly has to do with "setFill()" function.
*/

在主 JavaFX 方法的第 52 行(显示玩家 1 的第一个回合)上,它应该调用playerFirstMove 方法,并允许在单击鼠标后生成一个蓝色矩形,如 Player 第 18 行开始的playerFirstMove 方法所示类(class)。然而,当单击鼠标时,会生成一个红色矩形,而不是蓝色矩形。就好像程序跳过了第 52 行的player1.playerfirstMove(...) 并直接转到第 53 行的player2.playerfirstMove(...)。我已经尝试了几个小时来解决这个小问题,阅读了JavaFX API 和搜索互联网。该程序正在执行我希望它执行的操作(每次鼠标单击仅生成一个矩形),但它似乎跳过了第 52 行的说明(player1.playerfirstMove(...))。

对我来说,似乎可能存在涉及 setFill() 函数的错误?

我将非常感谢任何帮助。

谢谢大家!

最佳答案

如果我理解正确的话,每次鼠标点击都应该绘制当前玩家的矩形并将回合传递给下一个玩家。如果是这样,我修改了您的代码,让播放器仅具有颜色和绘制矩形逻辑:

class Player {
private final Color color;

Player(final Color color) {
this.color = color;
}

void doSomething(final Group root, final double x, final double y) {
Rectangle r = new Rectangle(x, y, 5, 5);
r.setFill(color);
root.getChildren().add(r);
}
}

在主类中,我组织了循环迭代(通过使用 Google guava collection utils ),并且迭代器仅允许与当前玩家一起使用:

Player player1 = new Player(Color.BLUE);
Player player2 = new Player(Color.RED);
Player player3 = new Player(Color.YELLOW);

final Iterator<Player> playerIterator = Iterators.cycle(player1, player2, player3);

canvas.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
if (e.getClickCount() == 1) {
playerIterator.next().doSomething(root, e.getX(), e.getY());
}
});

因此,我可能有 3 个玩家,每次点击只会触发下一个玩家:

enter image description here

顺便说一句,这个解决方案允许根据需要拥有任意数量的玩家。

关于Java/JavaFX 事件处理程序和 setFill() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45132583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com