7 способов использовать Enum в качестве аргумента функции в игровом движке Godot

В Godot, популярном игровом движке с открытым исходным кодом, перечисления являются мощным инструментом для определения набора именованных значений. Их можно использовать различными способами для улучшения читаемости кода, удобства сопровождения и даже производительности. В этой статье мы рассмотрим семь различных методов использования перечислений в качестве аргументов функций в Godot, а также приведем примеры кода для каждого метода.

Метод 1. Использование операторов if-else

enum Direction { UP, DOWN, LEFT, RIGHT }
func move_player(direction: Direction) -> void:
    if direction == Direction.UP:
        # Move the player up
    elif direction == Direction.DOWN:
        # Move the player down
    elif direction == Direction.LEFT:
        # Move the player left
    elif direction == Direction.RIGHT:
        # Move the player right

Метод 2: операторы переключения регистра

enum Direction { UP, DOWN, LEFT, RIGHT }
func move_player(direction: Direction) -> void:
    match direction:
        Direction.UP:
            # Move the player up
        Direction.DOWN:
            # Move the player down
        Direction.LEFT:
            # Move the player left
        Direction.RIGHT:
            # Move the player right

Метод 3. Использование словаря

enum Direction { UP, DOWN, LEFT, RIGHT }
var direction_map = {
    Direction.UP: Vector2(0, -1),
    Direction.DOWN: Vector2(0, 1),
    Direction.LEFT: Vector2(-1, 0),
    Direction.RIGHT: Vector2(1, 0)
}
func move_player(direction: Direction) -> void:
    var move_vector = direction_map[direction]
    # Move the player using the move_vector

Метод 4. Реализация методов в перечислении

enum Direction {
    UP,
    DOWN,
    LEFT,
    RIGHT
    func move_player() -> void:
        match self:
            UP:
                # Move the player up
            DOWN:
                # Move the player down
            LEFT:
                # Move the player left
            RIGHT:
                # Move the player right
}
# Usage:
var direction = Direction.UP
direction.move_player()

Метод 5. Использование карты функций

enum Direction { UP, DOWN, LEFT, RIGHT }
var direction_map = {
    Direction.UP: move_player_up,
    Direction.DOWN: move_player_down,
    Direction.LEFT: move_player_left,
    Direction.RIGHT: move_player_right
}
func move_player_up() -> void:
    # Move the player up
func move_player_down() -> void:
    # Move the player down
func move_player_left() -> void:
    # Move the player left
func move_player_right() -> void:
    # Move the player right
func move_player(direction: Direction) -> void:
    direction_map[direction]()

Метод 6. Использование сигналов

enum Direction { UP, DOWN, LEFT, RIGHT }
signal move_up
signal move_down
signal move_left
signal move_right
func move_player(direction: Direction) -> void:
    match direction:
        Direction.UP:
            emit_signal("move_up")
        Direction.DOWN:
            emit_signal("move_down")
        Direction.LEFT:
            emit_signal("move_left")
        Direction.RIGHT:
            emit_signal("move_right")
# Connect the signals to appropriate methods
func _ready() -> void:
    connect("move_up", self, "move_player_up")
    connect("move_down", self, "move_player_down")
    connect("move_left", self, "move_player_left")
    connect("move_right", self, "move_player_right")

Метод 7. Использование полиморфизма и наследования

enum Direction { UP, DOWN, LEFT, RIGHT }
class PlayerMovement:
    func move_player() -> void:
        pass
class MoveUp(PlayerMovement):
    func move_player() -> void:
        # Move the player up
class MoveDown(PlayerMovement):
    func move_player() -> void:
        # Move the player down
class MoveLeft(PlayerMovement):
    func move_player() -> void:
        # Move the player left
class MoveRight(PlayerMovement):
    func move_player() -> void:
        # Move the player right
func move_player(direction: Direction) -> void:
    var movement = match direction:
        Direction.UP:
            MoveUp.new()
        Direction.DOWN:
            MoveDown.new()
        Direction.LEFT:
            MoveLeft.new()
        Direction.RIGHT:
            MoveRight.new()
    movement.move_player()

Перечисления – это универсальная функция Godot, которая может значительно улучшить рабочий процесс разработки игр. Используя их в качестве аргументов функции, вы можете создавать более чистый и управляемый код, который легче читать и поддерживать. Методы, описанные в этой статье, предоставляют различные подходы к использованию перечислений в Godot, что дает вам возможность выбрать тот, который лучше всего подходит для вашего конкретного случая использования.