formatting update
This commit is contained in:
parent
d509f3e4aa
commit
6609a5783c
@ -5,6 +5,10 @@ This week we do:
|
|||||||
* Enemies
|
* Enemies
|
||||||
* Player death
|
* Player death
|
||||||
|
|
||||||
|
# Multiple Levels
|
||||||
|
|
||||||
|
Having multiple levels means changing things so that the game controller remains persistent in memory across all other things in the display list getting reloaded, or even destroyed.
|
||||||
|
|
||||||
### Moving the GameController
|
### Moving the GameController
|
||||||
|
|
||||||
The game controller needs to be persistent across the entire life of the game. Godot provides a way to move a class outside of the display tree to live on its own in a persistent manner. It is called an 'autoload' and it can be found in project settings > globals.
|
The game controller needs to be persistent across the entire life of the game. Godot provides a way to move a class outside of the display tree to live on its own in a persistent manner. It is called an 'autoload' and it can be found in project settings > globals.
|
||||||
@ -19,7 +23,7 @@ Now that the game controller is persistent, it does not reload when the level ti
|
|||||||
|
|
||||||
We can use this example to show the relationship of the scene manager to the game controller - because the scene manager DOES reload each time the level is updated. As it loads, it will tell the game controller to reset the timer.
|
We can use this example to show the relationship of the scene manager to the game controller - because the scene manager DOES reload each time the level is updated. As it loads, it will tell the game controller to reset the timer.
|
||||||
|
|
||||||
In game controller:
|
In `Gamecontroller`:
|
||||||
|
|
||||||
```
|
```
|
||||||
func reset():
|
func reset():
|
||||||
@ -41,7 +45,7 @@ Let's create a routine that allows the scene manager to connect signals from the
|
|||||||
|
|
||||||
Put all of your triggers in a blank Node2D, like we have done with our crates.
|
Put all of your triggers in a blank Node2D, like we have done with our crates.
|
||||||
|
|
||||||
In Scenemanager>buildLevel:
|
In `Scenemanager`>buildLevel:
|
||||||
|
|
||||||
```
|
```
|
||||||
for obj in triggers.get_children():
|
for obj in triggers.get_children():
|
||||||
@ -52,7 +56,7 @@ for obj in triggers.get_children():
|
|||||||
|
|
||||||
We can now update the game controller with a custom signal it will emit to indicate that the crate should be destroyed when it hits the "destroy" trigger.
|
We can now update the game controller with a custom signal it will emit to indicate that the crate should be destroyed when it hits the "destroy" trigger.
|
||||||
|
|
||||||
In Gamecontroller:
|
In `Gamecontroller`:
|
||||||
|
|
||||||
```
|
```
|
||||||
func _on_trigger_fired(effect: Variant, body: Variant) -> void:
|
func _on_trigger_fired(effect: Variant, body: Variant) -> void:
|
||||||
@ -72,14 +76,14 @@ Now if something hits the "destroy" trigger, the game controller checks to see i
|
|||||||
|
|
||||||
Lets move the option to load scenes to the scene manager as well, and trigger it using a custom signal from the game controller.
|
Lets move the option to load scenes to the scene manager as well, and trigger it using a custom signal from the game controller.
|
||||||
|
|
||||||
In Scenemanager:
|
In `Scenemanager`:
|
||||||
|
|
||||||
```
|
```
|
||||||
func loadLevel():
|
func loadLevel():
|
||||||
get_tree().reload_current_scene()
|
get_tree().reload_current_scene()
|
||||||
```
|
```
|
||||||
|
|
||||||
In Gamecontroller, change any references to loading scenes to simple signal emits:
|
In `Gamecontroller`, change any references to loading scenes to simple signal emits:
|
||||||
|
|
||||||
```
|
```
|
||||||
func _on_trigger_fired(effect: Variant, body: Variant) -> void:
|
func _on_trigger_fired(effect: Variant, body: Variant) -> void:
|
||||||
@ -103,7 +107,7 @@ func secondCounter():
|
|||||||
|
|
||||||
We have now freed the game controller from the roll of loading scenes. And we have seen how to make additions to the functionality of our game.
|
We have now freed the game controller from the roll of loading scenes. And we have seen how to make additions to the functionality of our game.
|
||||||
|
|
||||||
### Multiple Levels
|
# Multiple Levels
|
||||||
|
|
||||||
Copy your initial "game" level, and name the copies "level2" and "level3"
|
Copy your initial "game" level, and name the copies "level2" and "level3"
|
||||||
|
|
||||||
@ -248,5 +252,40 @@ func playerDamage(body, badguy):
|
|||||||
print("player got damaged")
|
print("player got damaged")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Enemy Movement
|
||||||
|
|
||||||
|
To get the enemy moving around, we will use Raycast2D to have them detect obstacles, or if they are reaching the edge of a ledge.
|
||||||
|
|
||||||
|
We can use the `_process` function to update the position of the enemy every frame, and to update what direction they should be facing.
|
||||||
|
|
||||||
|
```
|
||||||
|
class_name Badguy extends Area2D
|
||||||
|
@onready var right_side_cast: RayCast2D = $RightSideCast
|
||||||
|
@onready var right_down_cast: RayCast2D = $RightDownCast
|
||||||
|
@onready var left_down_cast: RayCast2D = $LeftDownCast
|
||||||
|
@onready var left_side_cast: RayCast2D = $LeftSideCast
|
||||||
|
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
|
||||||
|
|
||||||
|
var direction = 1
|
||||||
|
var speed = 100
|
||||||
|
|
||||||
|
signal playerDamageSignal
|
||||||
|
|
||||||
|
func _process(delta: float) -> void:
|
||||||
|
if not right_down_cast.is_colliding():
|
||||||
|
#about to fall on the right....
|
||||||
|
direction = -1
|
||||||
|
sprite.flip_h = true
|
||||||
|
if not left_down_cast.is_colliding():
|
||||||
|
direction = 1
|
||||||
|
sprite.flip_h = false
|
||||||
|
|
||||||
|
position.x += direction * speed * delta
|
||||||
|
|
||||||
|
func _on_body_entered(body: Node2D) -> void:
|
||||||
|
playerDamageSignal.emit(body, self)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user