Banner dos Jogos Okamon.


DevLog #0 : 24/03/2025

DevLob #0

Esse DevLog vai servir para apresentar o que foi feito até aqui, originalmente tinha planos de criar um jogo de coleção de criaturas, com tudo eu tive problemas para utilizar a gerenciação de dicionários e matrizes (dictionary e arrays), então eu comecei a seguir o tutorial do canal Barry's Development Hell onde ele desenvolvia um jogo de cartas, e para isso ele utilizava gerenciação de objetos por meio de fila e pilha com arrays, isso me ajudou muito a entender o básico.

Com tudo eu fiz algumas alterações, muitas pelo fato de ter um gosto estico diferente eu adicionei algumas mudanças, colocando junto algumas curvas que fizeram a mão ter variação de altura e curvatura

imagem de exemplo de uma mão curvada

Eu utilizo uma formulas similares as apresentadas por

Barry's Development Hell

mas com algumas diferenças, porém sigo o mesmo conceito.
@onready var tamanho_telaX :float = get_viewport_rect().size.x
@onready var tamanho_telaY :float = get_viewport_rect().size.y
@onready var centro_da_telaX : float = tamanho_telaX/2.0
@onready var centro_da_telaY : float = tamanho_telaY/2.0

Essa função abaixo é um passo extra que eu adicionei para a partir da disposição:

func _atualizar_posicao_na_mao() -> void:
       for i : int in range(mao_jogador.size()):

             var carta: carta_padrao = mao_jogador[i]
             var posicao_X: float = _calcular_posicao_X(i,_calcular_tamanho_carta())
             var rotacao: float = _calcular_rotacao(posicao_X)
             var nova_posicao : Vector2 = Vector2(posicao_X, _calcular_posicao_Y(posicao_X))
             emit_signal('criartween',carta,nova_posicao,i,rotacao)

a função _calcular_posicao_X é quase igual a apresentada nesse video, HAND Godot 4 Card Game Tutorial só que com a diferença de diminuir o tamanho total da mão pelo tamanho de uma carta para fins de centralização.

func _calcular_posicao_X(index: int,_tamanho:float)->float:
       var pivot_x : float = centro_da_telaX+((index)*tamanho_carta)-(_tamanho-tamanho_carta)/2:
       return pivot_x:

var posicao_X: float = _calcular_posicao_X(i,_calcular_tamanho_carta()) deve ter percebido que aqui ao invés de ter um tamanho definido por uma variável eu preferir limitar uma mão por numero de cartas, eu prefiro limitar a mão a uma porcentagem da tela, como segue a função:

func _calcular_tamanho_carta() -> float:
       var tamanho_mao : int = mao_jogador.size()
       var tamanho_maximo : float = (tamanho_telaX*tamanho_mao_escala)

       if tamanho_total >= tamanho_maximo:
             tamanho_carta = (tamanho_maximo/mao_jogador.size())
       else:
             tamanho_carta = tamanho_padrao_carta

       tamanho_total = tamanho_mao * tamanho_carta
       return tamanho_total

a variável tamanho carta é definida como igual tamanho_padrao_carta que é uma variável exportada, ela tem o tamanho de 150.0 pixeis.
a variável tamanho_mao_escala é uma variável exportada que na captura de tela esta com o valor de 0.8, ou seja a mão ocupa até 80% da tela, se tamanho_total que é o numero de cartas na mão, obtido pelo tamanho da array multiplicado pelo tamanho de cada atual das cartas, se ele for maior ou igual a 80% da tela o tamanho da carta é definido como o tamanho máximo da mão dividido pelo numero de cartas, caso contrario o tamanho da carta sera mantido ou retornará ao tamanho padrão definido em 150 pixeis, podemos observar nas capturas de exemplo a variação.

captura explor com 3 cartas captura explor com 14 cartas

Eu mudei o tamanho máximo 40% para ficar mais fácil de observar a diferença entre o tamanho das cartas gerados automaticamente e o tamanho padrão.

Eu adicionei duas curvas onde que eu uso para calcular a altura da carta.

imagem da curvaimagem dos valores da curva

Ela é feita por meio da seguinte função:

func _calcular_posicao_Y(posX:float)->float:
       var posrelaX :float = posX/tamanho_telaX
       var posY : float = tamanho_telaY-urva_posicao_Y.sample_baked(posrelaX)*tamanho_telaY
       return posY

Por sua vez também é calculado com a rotação por meio da curva a baixo.

imagem da curvaimagem dos valores da curva

Por fim eu adicionei uma pausa entre cada carta comprada.

func _mao_inicial(n_cartas:int) -> void:
       for i : int in range(n_cartas):
             _comprar_carta()
             await tween.finished
       emit_signal("final_abertura")

Esperando que o sinal do tween terminado seja disparado antes de novas chamadas do loop, por enquanto é isso, eu só movi o campo de batalha de um ambiente 2d para um 3d estou ainda trabalhando na integração da parte 2d com a 3d do jogo.