Descubra como adicionar um elemento imprevisível ao seu jogo.

No desenvolvimento de jogos, elementos de aleatoriedade e imprevisibilidade podem contribuir muito para a experiência geral do jogo. Uma maneira particular de introduzir esse elemento é por meio de objetos em movimento aleatório, que adicionam uma camada extra de interação e desafio.

Se você estiver trabalhando com o Godot, poderá obter esse efeito usando o GDScript, a linguagem de script nativa do Godot.

Configurando seu jogo Godot

Antes de começar, configure uma cena de jogo 2D básica em o motor de jogo Godot. Crie uma nova cena 2D e adicione um CharacterBody2D nó para o personagem do jogador. O CharacterBody2D node é o principal elemento para representar personagens que podem se movimentar e interagir com seu ambiente.

O código usado neste artigo está disponível neste Repositório GitHub e é gratuito para você usar sob a licença do MIT.

Adicione dois nós filhos ao personagem do jogador: um CollisionShape2D com formato retangular e Sprite2D para a representação gráfica do jogador.

Para adicionar mobilidade ao personagem, você pode usar o seguinte código GDScript:

extends CharacterBody2D

var speed = 200

func _physics_process(delta):
var velocity = Vector2()

if Input.is_action_pressed('ui_right'):
velocity.x += 1

if Input.is_action_pressed('ui_left'):
velocity.x -= 1

if Input.is_action_pressed('ui_down'):
velocity.y += 1

if Input.is_action_pressed('ui_up'):
velocity.y -= 1

velocity = velocity.normalized() * speed
move_and_collide(velocity * delta)

Defina uma variável, velocidade, para a velocidade de movimento do seu jogador. O _physics_process (delta) A função controla o movimento do personagem em resposta às entradas do jogador. Normalize a velocidade e a direção do personagem para garantir um movimento consistente, independentemente da direção.

Criando objetos estáticos com StaticBody2D

Em seguida, crie objetos com os quais seu jogador possa interagir. O exemplo a seguir demonstra a criação de um objeto estático usando o método StaticBody2D nó:

extends StaticBody2D

func _ready():
var collision_shape = CollisionShape2D.new()
collision_shape.shape = RectangleShape2D.new()
add_child(collision_shape)

Adicionando um Algoritmo de Movimento Aleatório para Objetos Estáticos

Agora que seus objetos estáticos estão prontos, é hora de adicionar aleatoriedade ao seu jogo. Para fazer isso, você pode usar um algoritmo de movimento aleatório simples:

extends StaticBody2D

var speed = 100
var value = randf_range(-1, 1)
var direction = Vector2(value, value).normalized()

func _physics_process(delta):
position += direction * speed * delta

Defina a velocidade do seu objeto estático. Além disso, crie uma direção Vector2 e inicialize-a com valores aleatórios entre -1 e 1 para ambos os eixos.

No _physics_process (delta) função, incrementa a posição do objeto pelo produto de sua direção, velocidade e delta de tempo, fazendo com que ele se mova na direção na velocidade dada.

Posições e Trajetórias Aleatórias para Objetos Estáticos

Você pode aumentar a aleatoriedade e a imprevisibilidade variando não apenas a velocidade e a direção dos objetos, mas também suas posições iniciais e trajetórias.

extends StaticBody2D

var speed = randf_range(50, 150)
var value = randf_range(-1, 1)
var direction = Vector2(value, value).normalized()

func _ready():
var val1 = randf_range(0, get_viewport().size.x)
var val2 = randf_range(0, get_viewport().size.y)
position = Vector2(val1, val2)

func _physics_process(delta):
position += direction * speed * delta

Aqui a velocidade é um valor aleatório entre 50 e 150. A posição inicial do objeto é determinada aleatoriamente dentro do tamanho da viewport no _preparar() função e a posição do objeto é atualizada no _physics_process (delta) funcionar exatamente como antes.

Ajustando velocidade, direção e aleatoriedade

Você pode criar uma jogabilidade mais interativa e envolvente manipulando a velocidade, a direção e a aleatoriedade do movimento de objetos estáticos. Você pode criar esses controles usando GDScript:

extends StaticBody2D

var speed = randf_range(50, 150)
var value = randf_range(-1, 1)
var direction = Vector2(value, value).normalized()
var speed_variation_rate = 0.5
var direction_variation_rate = 0.5

func _ready():
var val1 = randf_range(0, get_viewport().size.x)
var val2 = randf_range(0, get_viewport().size.y)
position = Vector2(val1, val2)

func _physics_process(delta):
randomize_speed_and_direction()
position += direction * speed * delta

func randomize_speed_and_direction():
if randf() < speed_variation_rate:
speed = randf_range(50, 150)

if randf() < direction_variation_rate:
direction = Vector2(value, value).normalized()

Recursos adicionais para seus objetos em movimento aleatório

Embora o movimento aleatório básico adicione uma dinâmica imprevisível ao seu jogo, existem inúmeros recursos adicionais que você pode adicionar para aprimorar ainda mais o seu jogo. Alguns exemplos incluem:

Variação de cor

Semelhante à forma como você randomizou a velocidade e a direção dos objetos, você também pode randomizar suas cores. Isso pode adicionar um aspecto mais vibrante e visualmente atraente ao seu jogo. Você pode fazer isso alterando o modular propriedade do sprite.

sprite.modulate = Color(randf(), randf(), randf())

Variação de tamanho

Alterar aleatoriamente o tamanho dos objetos adiciona outro nível de dificuldade e imprevisibilidade. Os jogadores precisarão se adaptar constantemente às mudanças de tamanho dos objetos. Você pode alterar o tamanho de um objeto ajustando sua escala propriedade:

sprite.scale = Vector2(randf_range(0.5, 2.0), randf_range(0.5, 2.0))

Geração de objetos

Em vez de ter um número fixo de objetos móveis aleatórios, você pode implementar um sistema que gera novos objetos em intervalos regulares ou sob certas condições. Isso pode adicionar uma nova camada de dificuldade, pois o jogador precisará ajustar sua estratégia à medida que mais objetos aparecerem na tela.

Vida útil do objeto

Além de gerar novos objetos, você também pode fazer com que os objetos se destruam automaticamente após um certo período de tempo. Isso pode evitar que a tela fique muito confusa e manter a jogabilidade atualizada.

Interações

Pense em adicionar interações específicas entre o jogador e os objetos em movimento. Por exemplo, a colisão com certos objetos pode aumentar a pontuação do jogador, alterar a velocidade do jogador ou até mesmo alterar o ambiente do jogo. Você também pode permitir que o jogador pule quando estiver em uma plataforma.

Práticas recomendadas para adicionar objetos em movimento aleatório

Ao adicionar objetos aleatórios em movimento, é importante considerar algumas práticas recomendadas para garantir um jogo bem equilibrado e envolvente:

Considerações de desempenho

Embora seja tentador adicionar tantos objetos quanto possível, lembre-se de que cada objeto aumenta a carga computacional no mecanismo do jogo. Sempre teste seu jogo no hardware de destino para garantir que o desempenho não seja afetado negativamente.

Equilibrando Aleatoriedade e Jogabilidade

Embora objetos aleatórios possam adicionar imprevisibilidade divertida, muita aleatoriedade pode levar à frustração. Certifique-se de testar extensivamente para encontrar o equilíbrio certo entre desafio e prazer.

Colisões e Resposta

Certifique-se de que o jogo lide com as colisões entre o jogador e os objetos de forma adequada. Objetos em movimento aleatório podem causar cenários de colisão inesperados, portanto, planeje-os e teste completamente.

Clareza visual

Objetos em movimento aleatório devem se destacar do fundo e de outros elementos não interativos. Isso ajuda os jogadores a entender rapidamente a situação do jogo e planejar suas ações de acordo. Você também pode adicionar efeitos sonoros aos seus objetos para destacá-los.

Impacto de objetos em movimento aleatório em seu jogo Godot

Objetos em movimento aleatório podem contribuir significativamente para tornar seu jogo Godot mais envolvente. Eles introduzem um elemento de imprevisibilidade que mantém os jogadores alertas. Cada vez que um jogador inicia o jogo, ele o cumprimenta com uma configuração diferente de objetos, aumentando sua rejogabilidade.

Além disso, como os jogadores não podem prever o caminho dos objetos em movimento, eles precisam permanecer focados e responsivos para navegar no ambiente do jogo.