此处将为大家介绍关于JavaFX多场景开启,场景复制的详细内容,并且为您解答有关javafx场景切换的相关问题,此外,我们还将为您介绍关于Cocos2d-x多场景切换生命周期、Godot4.0将支持多
此处将为大家介绍关于JavaFX多场景开启,场景复制的详细内容,并且为您解答有关javafx场景切换的相关问题,此外,我们还将为您介绍关于Cocos2d-x多场景切换生命周期、Godot 4.0 将支持多人游戏场景复制、Java CPU 100% 场景复现与分析、Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?的有用信息。
本文目录一览:- JavaFX多场景开启,场景复制(javafx场景切换)
- Cocos2d-x多场景切换生命周期
- Godot 4.0 将支持多人游戏场景复制
- Java CPU 100% 场景复现与分析
- Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?
JavaFX多场景开启,场景复制(javafx场景切换)
如何解决JavaFX多场景开启,场景复制?
我想要一个登录页面(我有工作),然后进入一个新场景(我还没有工作)。
然后我希望这个场景有你可以点击的项目。每个项目打开另一个场景/窗口。但是您可以根据需要打开任意数量。它们包含不同的数据,但相同的 fxml/scene。
这可能吗?
解决方法
是的,这是可能的。它需要您为场景创建一个控制器,然后为该场景的每个新实例创建该控制器对象的新实例。我认为它也需要每次都通过一个新阶段。
编辑: 未能为场景的每个新实例创建新的控制器实例意味着有可能从另一个窗口中的打开场景覆盖一个窗口中打开场景中的数据窗口。
如果您不熟悉 JavaFX,我将提供一些创建新视图的示例。这个问题主要是关于这样做的方法。
假设您遵循 MVC 模式,您的项目的结构可能类似于:
编辑:更正了 FXMLLoader 的不当使用
MainApp.java
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Modality;
import javafx.stage.Stage;
import Controller.LoginController;
public class Main
extends Application
{
public static void main(String[] args)
{
launch(args);
}
@Override
public void start(Stage stage) throws Exception
{
try {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/View/Login.fxml"));
Parent root = loader.load();
stage.setScene(new Scene(root));
LoginController loginController = loader.getController();
// Pass this stage by calling the controller''s stage setter.
// Conversely we could call a singleton class here to
// give us a stage object that we can re-use many times
loginController.setStage(stage);
stage.initStyle(StageStyle.UNIFIED);
stage.setResizable(false);
stage.getIcons().add(new Image("Resources/icon.png"));
stage.setTitle("");
stage.centerOnScreen();
stage.show();
} catch (IOException ex) {
// exception handling
}
}
}
登录控制器.java
import java.net.URL;
import java.io.IOException;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.stage.Modality;
import javafx.stage.Stage;
import Controller.MainController;
public class LoginController implements Initializable
{
@FXML
private Button loginButton;
private Stage stage;
public LoginController() {}
@Override
public void initialize(URL url,ResourceBundle rb) {
loginButton.addEventHandler(MouseEvent.MOUSE_CLICKED,(e) -> {
doLogin();
});
}
@FXML
private void doLogin() {
// handle login
showMainApplicationView();
}
@FXML
private void showMainApplicationView() {
try {
loader = new FXMLLoader(LoginController.class.getResource("View/mainView.fxml"));
Parent root = (Parent) loader.load();
MainController mainController = new MainController();
loader.setController(mainController);
mainController.setStage(new Stage());
stage.initModality(m);
stage.setResizable(isResizable);
stage.getIcons().add(new Image("Resources/icon.png"));
stage.setTitle(title);
stage.setScene(new Scene(root));
return stage;
} catch (IOException e) {
// exception handling
}
}
@FXML
public void setStage(Stage stage) {
this.stage = stage;
}
}
MainController.java
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.stage.Stage;
public class LoginController implements Initializable
{
public LoginController() {}
@Override
public void initialize(URL url,ResourceBundle rb) {}
@FXML
private void showSubview() {
/* Same code as the prior examples for launching a new view
* It will work for creating as many new "windows" of the same
* view as you desire. If you need to pass different types of
* data to each view you can use a DAO model,or some kind of
* "Instance" object that works for sending/receiving data to/from
* the subview from this class.
*/
}
@FXML
public void setStage(Stage stage) {
this.stage = stage;
}
}
如果您想多次重复使用一个舞台并以不同的深度进入子视图,我建议使用 Singleton 类。
StageHolder.java
import javafx.stage.Stage;
public final StageHolder
{
private Stage stage;
private final static StageHolder INSTANCE = new StageHolder();
private StageHolder() {}
public static StageHolder getInstance() {
return INSTANCE;
}
public Stage getStage() {
return this.stage;
}
// you can omit this setter if you only want to re-use a single stage over and over.
public void setStage(Stage stage) {
this.stage = stage;
}
}
Cocos2d-x多场景切换生命周期
在多个场景切换时候,场景的生命周期会更加复杂。这一节我们介绍一下场景切换生命周期。
多个场景切换时候分为几种情况:
情况1,使用pushScene函数从实现HelloWorld场景进入Setting场景。
情况2,使用replaceScene函数实现从HelloWorld场景进入Setting场景。
情况3,使用popScene函数从实现Setting场景回到HelloWorld场景。
我们参考HelloWorld重写Setting层的中几个生命周期函数,代码如下:
情况1时候,它的调用顺序如下图所示。
情况2时候,它的调用顺序如下图所示,从图中可见与上面不同是多出HelloWorld中cleanup函数,这也说明replaceScene函数会释放场景对象。
情况3时候,它的调用顺序如下图所示,从图中可见popScene函数时候调用Setting中cleanup函数,这说明popScene函数会释放Setting场景对象,当回到HelloWorld场景时候并不会调用init()函数,而是调用onEnter函数。
总结
以上是小编为你收集整理的Cocos2d-x多场景切换生命周期全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Cocos2d-x相关文章
- • 如何使用CCRenderTexture创建动态纹理
- • Cocos-code-ide使用入门学习
- • Cocos2D-x-3.0 编译(Win7)
- • Cocos2d-x 2 0 在Windows平台下的使用
- • quick-cocos2d-x实例之挑战记忆极限设计
- • Cocos2d-x 3 X CMake MinGW版本编译运行
- • vs 2013 编译cocos2d-x-3.9
- • cocos2d-x游戏开发系列教程-超级玛丽01
- • Cocos2d-x CCControlPotentiometer之圆
- • Cocos2d-x入门教程(二)简单的静态显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
bool
Setting::init()
{
if
( !Layer::init() )
{
returnfalse;
}
log
(
"Settinginit"
);
......
returntrue;
}
void
Setting::onEnter()
{
Layer::onEnter();
"SettingonEnter"
);
}
Setting::onEnterTransitionDidFinish()
{
Layer::onEnterTransitionDidFinish();
"SettingonEnterTransitionDidFinish"
);
}
Setting::onExit()
{
Layer::onExit();
"SettingonExit"
);
}
Setting::onExitTransitionDidStart()
{
Layer::onExitTransitionDidStart();
"SettingonExitTransitionDidStart"
);
}
Setting::cleanup()
{
Layer::cleanup();
"Settingcleanup"
);
}
|
Godot 4.0 将支持多人游戏场景复制
除了 Vulkan 支持和大量图形渲染器工作之外,Godot 4.0 还改进了其多人游戏开发功能。
多人游戏一直是一中复杂的功能,需要临时优化和特定于游戏的解决方案,并主要包含两个概念:某种形式的消息传递和某种形式的状态复制(同步和协调)。虽然 Godot 此前提供了一个消息传递系统(即 RPC),但它没有提供一个通用的复制系统。而 Godot 4.0 将提供一个开箱即用地解决方案,并可以扩展到不同地游戏中。
此外,Godot 4.0 也注意到跨机器传输数据中的的安全问题,比如默认不允许解码对象,因为它们可以随身携带脚本或强制接收端在初始化期间执行特定代码。这是一个安全漏洞,此类任意代码执行将允许服务器访问或操作游戏进程有权访问的客户端文件系统上的任何文件。并且,复制 API 将支持开发者指定远程对端可以生成哪些场景。最终实现还将允许对可以在每个特定路径上生成的节点进行细粒度控制。
如欲了解更多关于 Godot 多人游戏功能方面的工作,可以看 GodotEngine.org 的这篇博文。
Java CPU 100% 场景复现与分析

列举 4 种 cpu 100% 的场景,之后会进行复现,以及对应的解决方案。
死循环
Java 代码
public class HelloWorld {
public static void main(String[] args) {
// 直接死循环
new Thread(() -> { while (true){ } }).start();
}
}
分析
-
top 分析进程使用资源情况
-
执行 top -Hp 2581 可查看进程 2581 中的占用 CPU 的线程 ID 是 2592 。
-
执行 16 进制的转换 printf "% x \n" 2592 得到 a20 的,再通过 jstack 命令定位出现问题的地方
大量 Full GC
Java 代码
public static void main(String[] args) {
//-XX:+UseSerialGC -Xms200M -Xmx200M -Xmn32m -XX:SurvivorRatio=8 -XX:+PrintGCDetails
byte[] newErdo = new byte[1024 * 1024 * 30];
while (true) {
// 触发 full gc
System.gc();
byte[] bytes = new byte[1024 * 1024 * 120];
}
}
分析
-
top 分析资源使用情况
-
查看 gc 状态
线程计算耗时长
Java 代码
public static void main(String[] args) {
// 有复杂,耗时长的计算,导致 CPU 100%
work();
}
private static void work() {
// 利用 CPU 计算 π 的近似值
int i = Integer.MAX_VALUE;
double pi, temp = 0;
for (int j = 1; j <= i; j++) {
temp += Math.pow(-1, j + 1) / (2 * j - 1);
}
pi = 4 * temp;
System.out.println(pi);
}
分析
大量线程上下文切换
Java 代码
public static void main(String[] args) {
// 大量线程 2000 同时并发,且进行等待
for (int i = 0; i < 2000; i++) {
new Thread(() -> {
try {
work();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
System.out.println(1111111111);
}
private static void work() throws InterruptedException {
Thread.sleep(10000L);
System.out.println("----> do work now");
}
分析
类似上述案例一样,运行程序后,会发现 CPU 突然飙升~~~
总结
命令 汇总
top -Hp [pid]
printf "%x \n" [tid]
jstack [pid]|grep [16 进制 tid] -A 10
Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?
>简单的Java文件,与我们在Swing中使用的方法相同
>我不知道的JavaFX脚本
> FXML是基于xml的UI设计文件
哪个更好?为什么?
解决方法
>如果您更熟悉java中的编码UI,则可以使用此方法.但是,我个人不喜欢这种方法,因为当你的应用程序过于复杂时,它会使代码变得复杂.
> JavaFX Script在JavaFX 2.0之前使用,不再使用
>在Javafx 2.0中引入了基于FXML的UI设计.这些帮助程序员使用MVC方法对javafx应用程序进行编码.可以找到一个非常好的FXML介绍here.
来自Oracle docs的一节,Why Use FXML
From a Model View Controller (MVC) perspective,the FXML file that contains the description of the user interface is the view. The controller is a Java class,optionally implementing the Initializable class,which is declared as the controller for the FXML file. The model consists of domain objects,defined on the Java side,that you connect to the view through the controller.
FXML可以使用Scene Builder轻松设计,Scene Builder是javafx应用程序的Drag n Drop UI设计器.使用FXML具有以下优点:
>您的应用程序遵循MVC结构,就像企业JavaEE应用程序一样.
>表示层(UI)与应用层(逻辑)隔离,这样可以在需要时轻松更改应用程序的外观,就像网站一样!
> FXML为您的应用程序带来了可扩展性和可维护性.
我对你的建议是使用FXML.如果您不了解它们,请了解它们.这将是值得的!
今天的关于JavaFX多场景开启,场景复制和javafx场景切换的分享已经结束,谢谢您的关注,如果想了解更多关于Cocos2d-x多场景切换生命周期、Godot 4.0 将支持多人游戏场景复制、Java CPU 100% 场景复现与分析、Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?的相关知识,请在本站进行查询。
本文标签: