Diferencia entre revisiones de «Godot»

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda
Línea 98: Línea 98:
Cal afegir els sprites corresponents a l'enemic:
Cal afegir els sprites corresponents a l'enemic:
[[Archivo:Mob animations.gif|frame|none|Els sprites es fan igual que els del player.]]
[[Archivo:Mob animations.gif|frame|none|Els sprites es fan igual que els del player.]]
Per últim, els donem una escala de 0.75 i configurem la seua CollisionShape2D per a ser una càpsula com el player, però amb una rotació de 90 graus:
[[Archivo:Peek 30-11-2018 15-46.gif|frame|none|La forma de col·lisió.]]

Revisión del 16:33 11 ene 2019

Godot és un motor de jocs amb IDE per a programar-los. Si vols aprendre Godot, el millor és anar al manual oficial i després anar fent exemples i tutorials. Aquest article és un tutorial més, adaptat més o menys al nivell de 2on de la ESO i pensat per a que siga didàctic per a gent que no ha programat abans.

El teu primer joc

Aquest article (en construcció), és una simplificació i traducció del manual oficial. Si ja eres experimentat i tens soltura en l'anglés, et recomane l'original
Aquest és el resultat final del joc (captura extreta del manual oficial)

Anem a fer el joc per fases i explicarem el perquè de cadascuna.

Configuració inicial

El primer que tenim que fer és crear el projecte. Ens tenim que descarregar els recursos de la web oficial en aquest enllaç. Després, creem un projecte nou i descomprimim els recursos en la carpeta del projecte.

Observa que la carpeta del projecte té dins la dels recursos.

Dins de godot, tenim que fer que la pantalla tinga unes dimensions determinades de 480x720 i crear el jugador com un node Area2D amb nom Player:

Creació del projecte
Els projectes de godot estan dins d'una carpeta que creem quan li donem nom. Podem seleccionar la ruta on estarà. El projecte té un arxiu principal project.godot i altres .tscn que són les escenes.
Una escena en Godot és qualsevol element del joc que té entitat pròpia. En el nostre cas el jugador, els enemics i la pantalla principal. La creació del player és la primera escena que anem a fer i quan es guarde tindrà un arxiu de nom Player.tscn.

L'escena del Player

Els personatges i objectes dels jocs en 2D es poden fer en qualsevol dels nodes de la secció de 2D. Cal triar bé quin utilitzem. Per exemple, el Area2D del Player és un node que detecta col·lisions i li afecten aspectes de la física del joc. El Area2D pot ser controlat per jugador amb el teclat.

Animació

A continuació cal crear l'animació del node Player. En aquest cas, triem un AnimatedSprite al que donarem varis moviments. Amb l'opció Frames.

Creació del AnimatedSprite
En aquesta captura es veu cóm afegir el moviment rigthi up

Per últim, el farem un poc més menut:

Escalar el sprite al 50%

La forma de col·lisió

Ara toca definir la forma per la qual detectarà les col·lisions. En el nostre cas, la que més es sembla és la càpsula:

Creació de la CollisionShape. Observa que sols manipulem els punts interiors de la forma i no el rectangle exterior. Això és important.
Els personatges en 2D poden tindre formes molt complexes i detectar quan toquen amb altres personatges pot ser molt costós computacionalment. Per tant, es tracta de simplificar aquestes formes en altres més simples com són les formes geomètriques. Mentre que una forma en mapa de bits necessitaria comprovar cada píxel amb cada píxel de l'altre node, una forma geomètrica pot comprovar la col·lisió amb una fórmula matemàtica a partir de les dimensions i coordenades.

És important que, una vegada estan tots els nodes fills creats, bloquegem al node Player de manera que no es puga seleccionar nodes fills. Això es fa en aquest botó:

Bloquejar el node pare per a no poder manipular els fills.

El moviment del Player

Afegir un script a un node.

El nostre jugador es mourà amb les fletxes del teclat. Per aconseguir-ho, tenim que crear un script per al node que detecte el teclat i canvie la posició del node en la pantalla. Aquest és l'script:

extends Area2D

export (int) var speed  # velocita del jugador (pixels/sec).
var screensize  # mida de la pantalla

func _ready():
    screensize = get_viewport_rect().size

func _process(delta):
    var velocity = Vector2() # Vector de velocitat (x,y)
    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
    if velocity.length() > 0:
        velocity = velocity.normalized() * speed
        $AnimatedSprite.play() # Si hi ha moviment es mou
    else:
        $AnimatedSprite.stop() # Si no hi ha moviment para l'animació
    position += velocity * delta # Calcula la posició
    position.x = clamp(position.x, 0, screensize.x)
    position.y = clamp(position.y, 0, screensize.y)

    if velocity.x != 0:                                        # Si es mou de costat
     $AnimatedSprite.animation = "right"  
     $AnimatedSprite.flip_v = false
     $AnimatedSprite.flip_h = velocity.x < 0     # Dreta o esquerra
    elif velocity.y != 0:                                    # Si es mou en vertical
     $AnimatedSprite.animation = "up"
     $AnimatedSprite.flip_v = velocity.y > 0     # Dalt o baix

Els enemics

Els enemics han d'estar en una altra escena. Cal crear un RigidBody2D i crear aquest arbre:

Node Mob (enemic) amb tots les seus nodes fills

I cal afegir algunes propietats al node:

Propietats de l'enemic.

D'aquesta manera als enemics no els afecta la gravetat, i no col·lisionen entre ells.

Cal afegir els sprites corresponents a l'enemic:

Els sprites es fan igual que els del player.

Per últim, els donem una escala de 0.75 i configurem la seua CollisionShape2D per a ser una càpsula com el player, però amb una rotació de 90 graus:

La forma de col·lisió.