问题描述
我目前正在制作一棵看起来像这样的简单树:
MainNode(父级)->字符(子级)
MainNode可以从任何文件(例如地图(即terrain.tscn)或事件(即event.tscn))中添加子节点或空闲节点。所有事件和地图都将存储在词典中,以方便使用。代码看起来像这样:
func loadNewScene(key):
# load the corresponding tscn file from dictionary
add_child(instanced_scene)
func freeScene(key):
# find the corresponding target node using key
target.queue_free()
func _ready():
# load Mainmenu.tscn
loadNewScene("Mainmenu")
当我在Mainmenu.tscn中按开始时,我的问题就开始了。如果我还是Mainmenu.tscn的孩子(默认情况下),我总是可以发出一个信号来确认玩家按下按钮来发出信号以进入下一个场景,例如:
func _on_Button_pressed():
var target_scene = "opening Scene"
freeScene(current_scene)
loadNewScene(target_scene)
但是由于该节点实际上不在MainNode中(它将在_ready()之后添加为子节点),所以我找不到从“ Mainmenu.tscn”向MainNode发出信号的方法,因为最初它不在MainNode的树中。
有没有办法向另一棵树发出信号?还是有替代解决方案?
解决方法
我相信您对08-25 22:44:17.309 11464 11464 W System.err: java.lang.ClassNotFoundException: com.samsung.android.scloud.app.ui.settings.controller.notification.SyncAndBackupSettingNotificationManager
08-25 22:44:17.316 11464 11521 I [SC][AUTH]: [RequestAuthStrategy]execute. OUT
08-25 22:44:17.316 11464 11464 W System.err: at java.lang.Class.classForName(Native Method)
08-25 22:44:17.316 11464 11464 W System.err: at java.lang.Class.forName(Class.java:454)
08-25 22:44:17.316 11464 11464 W System.err: at java.lang.Class.forName(Class.java:379)
08-25 22:44:17.316 11464 11464 W System.err: at com.samsung.android.scloud.app.core.operators.notification.NotificationRBManager.addNotificationManager(NotificationRBManager.java:80)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.core.operators.notification.NotificationManagerFactory.addNotificationManager(NotificationManagerFactory.java:48)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.core.operators.notification.NotificationOperator.onStarted(NotificationOperator.java:78)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.framework.Operators.notifyOperatorsStarted(Operators.java:374)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.framework.Operators.initialize(Operators.java:333)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.framework.Operators.<init>(Operators.java:132)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.framework.Operators.<clinit>(Operators.java:55)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.core.manager.OperatorManagerInvocationHandler$OperatorManagerImpl.<init>(OperatorManagerInvocationHandler.java:63)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.core.manager.OperatorManagerInvocationHandler.invoke(OperatorManagerInvocationHandler.java:51)
08-25 22:44:17.317 11464 11464 W System.err: at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
08-25 22:44:17.317 11464 11464 W System.err: at $Proxy0.offerOperation(Unknown Source)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.OperatorInitializer.initialize(OperatorInitializer.java:15)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.SamsungCloudApp.lambda$onCreate$0$SamsungCloudApp(SamsungCloudApp.java:59)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.-$$Lambda$SamsungCloudApp$16k4Kd-qNmt5F5o0hoM4zP1iKO8.accept(Unknown Source:4)
08-25 22:44:17.317 11464 11464 W System.err: at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
08-25 22:44:17.317 11464 11464 W System.err: at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:604)
08-25 22:44:17.317 11464 11464 W System.err: at com.samsung.android.scloud.app.SamsungCloudApp.onCreate(SamsungCloudApp.java:59)
08-25 22:44:17.317 11464 11464 W System.err: at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
08-25 22:44:17.317 11464 11464 W System.err: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6859)
08-25 22:44:17.317 11464 11464 W System.err: at android.app.ActivityThread.access$1300(ActivityThread.java:268)
08-25 22:44:17.317 11464 11464 W System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1982)
08-25 22:44:17.318 11464 11464 W System.err: at android.os.Handler.dispatchMessage(Handler.java:107)
08-25 22:44:17.318 11464 11464 W System.err: at android.os.Looper.loop(Looper.java:237)
08-25 22:44:17.318 11464 11464 W System.err: at android.app.ActivityThread.main(ActivityThread.java:7814)
08-25 22:44:17.318 11464 11464 W System.err: at java.lang.reflect.Method.invoke(Native Method)
08-25 22:44:17.318 11464 11464 W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
08-25 22:44:17.318 11464 11464 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)
08-25 22:44:17.318 11464 11464 W System.err: Caused by: java.lang.ClassNotFoundException: com.samsung.android.scloud.app.ui.settings.controller.notification.SyncAndBackupSettingNotificationManager
08-25 22:44:17.318 11464 11464 W System.err: ... 30 more
08-25 22:44:17.320 1276 10975 I ApplicationPolicy: isApplicationExternalStorageWhitelisted:com.osp.app.signin user:0
08-25 22:44:17.320 1276 10975 D ApplicationPolicy: isApplicationExternalStorageWhitelisted: DO is not enabled on user 0. Allowed.
08-25 22:44:17.320 1276 10975 D ActivityManager: package com.osp.app.signin,user - 0 is SDcard whitelisted
08-25 22:44:17.320 1276 10975 I ApplicationPolicy: isApplicationExternalStorageBlacklisted:com.osp.app.signin user:0
08-25 22:44:17.320 1276 10975 D ApplicationPolicy: isApplicationExternalStorageBlacklisted: DO is not enabled on user 0. Allowed.
08-25 22:44:17.320 1276 10975 I ApplicationPolicy: isApplicationExternalStorageBlacklisted:com.osp.app.signin user:0
08-25 22:44:17.320 1276 10975 D ApplicationPolicy: isApplicationExternalStorageBlacklisted: DO is not enabled on user 0. Allowed.
08-25 22:44:17.321 1276 10975 W ActivityManager: wait for provider publish: waiters=1 callerApp=ProcessRecord{77beea7 11464:com.samsung.android.scloud/5009} cpr=ContentProviderRecord{ea5af54 u0 com.osp.app.signin/com.samsung.android.samsungaccount.authentication.data.OpenContentProvider}
08-25 22:44:17.338 1276 11523 D WifiConnectivityMonitor.DnsPingerHandler: set
在Godot中的内容感到有些困惑。
默认情况下,您有一个SceneTree,用于保存游戏循环。场景可以进入或离开该树(通过分别调用树内某个节点上的tree
和add_child
)。
现在,我认为解决您的问题的最佳方法是赋予所有模块(如果我正确理解您的设计,则不是remove_child
的任何节点)有责任从{{1 }}。换句话说,您的模块可能依赖于MainNode
,而不是相反。
这意味着MainNode
可能具有如下代码:
MainNode
,
如果我正确理解了您的问题,则尝试在运行时动态连接到子信号。您可以在代码中做到这一点:
第二,我相信您会尝试使用它来更改级别。我相信可以在这里找到更多的Godotic方法: