1
- use crate :: hud:: Hud ;
2
- use crate :: mob;
3
- use crate :: player;
1
+ use crate :: { hud, mob, player} ;
4
2
5
3
use godot:: classes:: { Marker2D , PathFollow2D , RigidBody2D , Timer } ;
6
4
use godot:: prelude:: * ;
@@ -14,6 +12,7 @@ use std::f32::consts::PI;
14
12
pub struct Main {
15
13
mob_scene : OnReady < Gd < PackedScene > > ,
16
14
player : OnReady < Gd < player:: Player > > ,
15
+ hud : OnReady < Gd < hud:: Hud > > ,
17
16
music : OnReady < Gd < AudioStreamPlayer > > ,
18
17
death_sound : OnReady < Gd < AudioStreamPlayer > > ,
19
18
score : i64 ,
@@ -27,34 +26,51 @@ impl INode for Main {
27
26
Self {
28
27
mob_scene : OnReady :: new ( || load ( "res://Mob.tscn" ) ) ,
29
28
player : OnReady :: node ( "Player" ) ,
29
+ hud : OnReady :: node ( "Hud" ) ,
30
30
music : OnReady :: node ( "Music" ) ,
31
31
death_sound : OnReady :: node ( "DeathSound" ) ,
32
32
score : 0 ,
33
33
base,
34
34
}
35
35
}
36
36
37
- fn ready ( & mut self ) { }
37
+ fn ready ( & mut self ) {
38
+ // The OnReady instances are now initialized, we can access them like normal fields.
39
+
40
+ // Get a Gd<Main> pointer to this instance.
41
+ let main = self . to_gd ( ) ;
42
+
43
+ // Connect Player::hit -> Main::game_over.
44
+ self . player
45
+ . signals ( )
46
+ . hit ( )
47
+ . connect_obj ( & main, Self :: game_over) ;
48
+
49
+ // Connect Hud::start_game -> Main::new_game.
50
+ self . hud
51
+ . signals ( )
52
+ . start_game ( )
53
+ . connect_obj ( & main, Self :: new_game) ;
54
+ }
38
55
}
39
56
40
57
#[ godot_api]
41
58
impl Main {
42
- #[ func]
59
+ // No #[func] here, this method is directly called from Rust (via type-safe signals).
43
60
fn game_over ( & mut self ) {
44
61
let mut score_timer = self . base ( ) . get_node_as :: < Timer > ( "ScoreTimer" ) ;
45
62
let mut mob_timer = self . base ( ) . get_node_as :: < Timer > ( "MobTimer" ) ;
46
63
47
64
score_timer. stop ( ) ;
48
65
mob_timer. stop ( ) ;
49
66
50
- let mut hud = self . base ( ) . get_node_as :: < Hud > ( "Hud" ) ;
51
- hud. bind_mut ( ) . show_game_over ( ) ;
67
+ self . hud . bind_mut ( ) . show_game_over ( ) ;
52
68
53
69
self . music . stop ( ) ;
54
70
self . death_sound . play ( ) ;
55
71
}
56
72
57
- #[ func]
73
+ // No #[func].
58
74
pub fn new_game ( & mut self ) {
59
75
let start_position = self . base ( ) . get_node_as :: < Marker2D > ( "StartPosition" ) ;
60
76
let mut start_timer = self . base ( ) . get_node_as :: < Timer > ( "StartTimer" ) ;
@@ -64,8 +80,7 @@ impl Main {
64
80
self . player . bind_mut ( ) . start ( start_position. get_position ( ) ) ;
65
81
start_timer. start ( ) ;
66
82
67
- let mut hud = self . base ( ) . get_node_as :: < Hud > ( "Hud" ) ;
68
- let hud = hud. bind_mut ( ) ;
83
+ let hud = self . hud . bind_mut ( ) ;
69
84
hud. update_score ( self . score ) ;
70
85
hud. show_message ( "Get Ready" . into ( ) ) ;
71
86
@@ -84,8 +99,7 @@ impl Main {
84
99
fn on_score_timer_timeout ( & mut self ) {
85
100
self . score += 1 ;
86
101
87
- let mut hud = self . base ( ) . get_node_as :: < Hud > ( "Hud" ) ;
88
- hud. bind_mut ( ) . update_score ( self . score ) ;
102
+ self . hud . bind_mut ( ) . update_score ( self . score ) ;
89
103
}
90
104
91
105
#[ func]
@@ -117,8 +131,5 @@ impl Main {
117
131
} ;
118
132
119
133
mob. set_linear_velocity ( Vector2 :: new ( range, 0.0 ) . rotated ( real:: from_f32 ( direction) ) ) ;
120
-
121
- let mut hud = self . base ( ) . get_node_as :: < Hud > ( "Hud" ) ;
122
- hud. connect ( "start_game" , & mob. callable ( "on_start_game" ) ) ;
123
134
}
124
135
}
0 commit comments