Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Die Gegner erschaffen
Jetzt ist es an der Zeit die Gegner zu erstellen, denen der Spieler ausweichen muss. Ihr Verhalten wird nicht allzu komplex sein: Mobs werden zufällig an den Rändern des Bildschirms spawnen, eine zufällige Richtung auswählen und sich in einer geraden Linie fortbewegen.
Wir werden dies in eine Mob-Szene einbauen, die wir dann instanziieren, um beliebig viele unabhängige Mobs im Spiel erstellen zu können.
Node einrichten
Klicken Sie im oberen Menü auf Szene -> Neue Szene und fügen Sie die folgenden Nodes hinzu:
RigidBody2D (genannt
Mob)
Don't forget to set the children so they can't be selected, like you did with
the Player scene. This is done by selecting the parent node (RigidBody2D) in the
Scene tree dock, then using the button at the top of the 2D editor
(Ctrl + G or Cmd + G on macOS).
Wählen Sie den Mob-Node und setzen Sie seine Property Schwerkraft-Skalierung im Abschnitt RigidBody2D des Inspektors auf 0. Dies wird verhindern, dass der Mob nach unten fällt.
In addition, in the Mob node inspector,
under the CollisionObject2D
section, expand the Collision group and
uncheck the 1 inside the Mask property.
This will ensure the mobs do not collide with each other.
Richten Sie den AnimatedSprite2D ein, wie Sie es für den Player getan haben. Dieses Mal haben wir 3 Animationen: fly, swim, und walk. Es gibt zwei Bilder für jede Animation im "art"-Ordner.
Die Eigenschaft Animationsgeschwindigkeit muß für jede einzelne Animation eingestellt werden. Stellen Sie sie auf 3 für alle 3 Animationen ein.
Sie können den "Animation abspielen"-Button rechts neben dem Eingabefeld Animationsgeschwindigkeit verwenden, um eine Vorschau Ihrer Animationen zu erhalten.
Wir werden eine der Animationen zufällig auswählen, sodass die Mobs eine gewisse Vielfalt haben.
Wie die Spielerbilder müssen auch die Mob-Bilder herunterskaliert werden. Setzen Sie die Eigenschaft Skalierung des AnimatedSprite2D auf (0.75, 0.75).
Wie in der Player-Szene, fügen Sie eine CapsuleShape2D für die Kollision hinzu. Um die Form mit dem Bild auszurichten, müssen Sie die Eigenschaft Rotation auf 90 setzen (unter "Transform" im Inspektor).
Speichern Sie die Szene.
Gegner-Skript
Fügen Sie ein Skript zur Mob wie folgt hinzu:
extends RigidBody2D
using Godot;
public partial class Mob : RigidBody2D
{
// Don't forget to rebuild the project.
}
Lassen Sie uns nun den Rest des Skripts betrachten. In _ready() wählen wir zufällig einen der drei Animationstypen:
func _ready():
var mob_types = Array($AnimatedSprite2D.sprite_frames.get_animation_names())
$AnimatedSprite2D.animation = mob_types.pick_random()
$AnimatedSprite2D.play()
public override void _Ready()
{
var animatedSprite2D = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
string[] mobTypes = animatedSprite2D.SpriteFrames.GetAnimationNames();
animatedSprite2D.Play(mobTypes[GD.Randi() % mobTypes.Length]);
}
Zuerst holen wir uns die Liste der Animationsnamen aus der Property sprite_frames von AnimatedSprite2D. Das Ergebnis ist ein Array mit allen drei Animationsnamen: ["walk", "swim", "fly"].
In the GDScript code, we use the Array.pick_random method
to select one of these animation names at random. Meanwhile, in the C# code, we pick a random number
between 0 and 2 to select one of these names from the list (array indices start at 0). The
expression GD.Randi() % n selects a random integer between 0 and n-1.
Finally, we call play() to start playing the chosen animation.
Der letzte Teil besteht darin, dass sich die Mobs selbst löschen, wenn sie den Bildschirm verlassen. Verbinden Sie das screen_exited()-Signal des VisibleOnScreenNotifier2D-Nodes mit dem Mob und fügen Sie diesen Code hinzu:
func _on_visible_on_screen_notifier_2d_screen_exited():
queue_free()
// We also specified this function name in PascalCase in the editor's connection window.
private void OnVisibleOnScreenNotifier2DScreenExited()
{
QueueFree();
}
queue_free() is a function that essentially 'frees', or deletes, the node at the end of the frame.
Damit ist die Mob-Szene fertig.
Da nun die Spieler und die Gegner fertig sind, werden wir sie im nächsten Teil in einer neuen Szene zusammenführen. Wir werden die Gegner zufällig rund um das Spielfeld spawnen lassen und sie vorwärts bewegen, was unser Projekt zu einem spielbaren Spiel macht.