stackoverflow 社区您好!我正在学习编程,并正在为移动设备开发“鸭子狩猎”风格的 javafx 游戏,其中 3 种鸭子在屏幕上水平移动。每次单击某种类型的鸭子时,该类型的鸭子就会在其名称旁边获得一个点。
我想做的是在游戏结束后显示一个全局排行榜,这样你就可以看到玩过游戏的每个人中哪种类型的鸭子被点击最多。每个人最喜欢的实现这样的方法是什么?如果您有任何疑问,请随时问我。谢谢,-H.J.
编辑(太平洋标准时间 2016 年 4 月 20 日下午 1:40(太平洋标准时间)):因为我原来的帖子因被认为含糊而被搁置,所以我编写了一个非常基本的示例程序来帮助解释我想要做的事情。在我的菜单场景中,我想检索全世界玩过该游戏的每个人对红色和绿色矩形的点击总数,当前为 globalScoreRed
和 globalScoreGreen
和设置为 0,因为这是我需要帮助的部分之一。
在 playGame 场景中,当您点击 GG 按钮时,我希望将 scoreRed
和 scoreGreen
提交到排行榜,这将调整从菜单屏幕。
这是一个非常糟糕的游戏,我可以证明这不是我喜欢玩的游戏,但我正在尝试学习如何发送值和检索它们的概念。再次感谢您查看我的帖子并提供帮助,非常感谢。
package LeaderboardHelp;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class LeaderboardHelpMain extends Application {
Stage window;
Scene menu, playGame;
private Rectangle targetRed = new Rectangle(40, 40);
private Rectangle targetGreen = new Rectangle(40, 40);
private int scoreRed = 0;
private int scoreGreen = 0;
private Text redScoreText = new Text("Red: " + scoreRed);
private Text greenScoreText = new Text("Green: " + scoreGreen);
private int globalScoreRed = 0;
private int globalScoreGreen = 0;
private Text globalRedScoreText = new Text("Worldwide Red Clicks: " + globalScoreRed);
private Text globalGreenScoreText = new Text("Worldwide Green Clicks: " + globalScoreGreen);
private boolean playable = false;
public static void main(String[] args) { launch(args); }
@Override
public void start(Stage primaryStage) throws Exception {
window = primaryStage;
Button startButton = new Button("Start!");
startButton.setOnAction(e -> window.setScene(playGame));
//menu scene layout
VBox menuLayout = new VBox(20);
menuLayout.getChildren().addAll(globalGreenScoreText, globalRedScoreText, startButton);
menu = new Scene(menuLayout, 600, 600);
Button ggButton = new Button("GG");
ggButton.setOnAction(e -> window.setScene(menu));
targetRed.setFill(Color.RED);
targetRed.setOnMouseClicked(event -> {
scoreRed += 1;
redScoreText.setText("Red: " + scoreRed);
});
targetGreen.setFill(Color.GREEN);
targetGreen.setOnMouseClicked(event -> {
scoreGreen += 1;
greenScoreText.setText("Green: " + scoreGreen);
});
targetRed.setTranslateX(50);
targetRed.setTranslateY(50);
targetGreen.setTranslateX(100);
targetGreen.setTranslateY(50);
greenScoreText.setTranslateX(500);
greenScoreText.setTranslateY(50);
redScoreText.setTranslateX(500);
redScoreText.setTranslateY(70);
ggButton.setTranslateX(250);
ggButton.setTranslateY(250);
//game layout
Pane gameLayout = new Pane();
gameLayout.getChildren().addAll(targetRed, targetGreen, redScoreText, greenScoreText, ggButton);
playGame = new Scene(gameLayout, 600, 600);
window.setScene(menu);
window.setTitle("Leaderboard Helper");
window.show();
}
}
编辑(太平洋标准时间 2016 年 4 月 20 日 8:45PM PST)因此,经过更多阅读后,我遇到了 Oracle EchoServer 示例,它让我走上了正轨(不确定它是正确还是错误的轨道)。我正在考虑让服务器将提交的分数保存在文本文件中。当客户端调用menu
场景时,它将连接到服务器并请求分数。服务器将读取文本文件并将分数发送到应用程序客户端。当按下GG
按钮时,分数被发送到服务器,服务器读取文本文件,将新闻分数添加到旧分数,然后覆盖分数文本文件。有更好的方法吗?我确实希望它是可扩展的,允许大量用户同时添加他们的分数。
最佳答案
需要网络服务。一个简单的方法,可能需要鸭子的类型和它被点击的次数。
POST/duck/{type}/{clicks}
网络服务需要使用 HTTPS 或 HMAC 进行保护,或者两者都使用更好。
- 对于 HMAC, key 需要在代码中隐藏和混淆。安全性总是容易被破坏,对于任何潜在的黑客来说,为了这么小的付出而付出的努力都是不值得的。
- 要正确执行 HMAC,应在创建摘要(也称为签名)时使用 NONCE。 NONCE 的过期时间应该很短。许多实现使用时间戳作为 NONCE,其他实现则由 Web 服务提供 NONCE。为了简单起见,我会选择前者。如果 NONCE 早于 2 或 3 秒,则拒绝该请求。
关于java - javafx 游戏排行榜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36732727/