Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Exemplo: Jogo Completo

Esta lição constrói um pequeno jogo de coleta. O jogador se move por uma cena, bate em paredes, coleta moedas e imprime uma pontuação final quando o jogo termina.

Em vez de colar todo o script de uma vez, o exemplo é dividido nas mesmas partes que você usará na maioria dos projetos Tiniest2D:

  • variáveis de ativo e estado
  • start()
  • onUpdate(dt)
  • onCollision(objA, objB)
  • end()

1. Ativos e Estado do Jogo

A primeira seção cria os ativos e variáveis que o resto do script usará. Sprites são imagens, a cena é o nível, o jogador é um objeto colocado nessa cena, e as variáveis de pontuação/velocidade armazenam um estado simples do jogo.

// Criar ativos
var playerImg = Sprite(16, 16)
var wallImg = Sprite(16, 16)
var coinImg = Sprite(8, 8)
var level = Scene()

// Criar objeto jogador
var player = Object("Player")

// Estado do jogo
var score = 0
var speed = 100

Neste ponto, as variáveis existem, mas o jogo ainda não colocou nada na cena. Essa configuração acontece em start().

2. A Função start()

start() é executado uma vez quando o jogo começa. Use-o para configurar objetos, definir a primeira cena, posicionar a câmera e preparar quaisquer valores de início.

func start() {
    // Configurar jogador
    setSprite(player, playerImg)
    setCollisionType(player, COLLISION_DYNAMIC())
    setX(player, 50)
    setY(player, 50)
    addObject(level, player)

    // Definir cena inicial
    setScene(level)

    // Centralizar câmera no jogador
    setCameraX(level, getX(player))
    setCameraY(level, getY(player))
    setCameraZoom(level, 3)

    print("Colete as moedas!")
}

O jogador usa COLLISION_DYNAMIC() porque deve colidir e ser empurrado para fora das paredes. A câmera começa centralizada no jogador para que a visão do nível comece no lugar certo.

3. A Função onUpdate(dt)

onUpdate(dt) é executado a cada quadro. Aqui é onde o jogador lê a entrada, se move, atualiza a câmera e verifica as teclas de reinício.

dt significa "delta time": a quantidade de tempo desde o quadro anterior. Multiplicar movimento por dt torna a velocidade de movimento mais consistente em diferentes taxas de quadros.

func onUpdate(dt) {
    // Movimento do jogador
    var moveX = 0
    var moveY = 0

    if (isKeyHeld(KEY_LEFT()) || isKeyHeld(KEY_A())) {
        moveX = -1
    }
    if (isKeyHeld(KEY_RIGHT()) || isKeyHeld(KEY_D())) {
        moveX = 1
    }
    if (isKeyHeld(KEY_UP()) || isKeyHeld(KEY_W())) {
        moveY = -1
    }
    if (isKeyHeld(KEY_DOWN()) || isKeyHeld(KEY_S())) {
        moveY = 1
    }

    // Aplicar movimento
    setX(player, getX(player) + moveX * speed * dt)
    setY(player, getY(player) + moveY * speed * dt)

    // Câmera segue o jogador
    setCameraX(level, getX(player))
    setCameraY(level, getY(player))

    // Reiniciar nível com a tecla R
    if (isKeyPressed(KEY_R())) {
        resetScene(level)
        setX(player, 50)
        setY(player, 50)
        score = 0
        print("Nível reiniciado!")
    }
}

O código de movimento constrói uma direção a partir da entrada do teclado. Em seguida, adiciona essa direção à posição atual do jogador. A câmera é atualizada após o movimento para que siga a nova posição.

4. A Função onCollision(objA, objB)

onCollision(objA, objB) é executado quando dois objetos colidem. Neste exemplo, as moedas devem usar COLLISION_TRIGGER(). Objetos de trigger relatam sobreposições, mas não bloqueiam movimento.

func onCollision(objA, objB) {
    var nameB = getName(objB)
    var typeB = getCollisionType(objB)

    // Coleta de moedas (moedas devem ser do tipo TRIGGER no editor de cena)
    if (typeB == COLLISION_TRIGGER()) {
        removeObject(level, objB)
        score = score + 1
        print("Pontuação: " + score)
    }
}

Quando o jogador toca um trigger, o script remove esse objeto da cena e aumenta a pontuação. Este é o padrão básico para coletas, chaves, power-ups e pontos de verificação.

5. A Função end()

end() é executado quando o jogo para. Este exemplo apenas imprime a pontuação final, mas jogos maiores podem usar esta função para limpeza ou mensagens de depuração finais.

func end() {
    print("Pontuação final: " + score)
}

Configurando o Exemplo

  1. Criar os sprites:
  2. Ctrl+Clique em playerImg, desenhe um personagem (por exemplo, uma figura simples)
  3. Ctrl+Clique em wallImg, desenhe um bloco sólido
  4. Ctrl+Clique em coinImg, desenhe um pequeno círculo ou diamante

  5. Desenhar a cena:

  6. Ctrl+Clique em level
  7. Selecione wallImg no painel esquerdo, defina a colisão como "Estática"
  8. Pinte paredes ao redor das bordas e crie um labirinto
  9. Selecione coinImg, defina a colisão como "Nenhuma" para tiles decorativos de moedas
  10. Coloque moedas ao redor do nível como guias visuais

  11. Criar objetos de moeda trigger:

Sprites carimbados na cena são úteis para tiles e decoração, mas moedas colecionáveis devem ser objetos para que callbacks de colisão possam removê-las. Adicione objetos de moeda assim:

var coin1 = Object("Coin1")
var coin2 = Object("Coin2")

func start() {
    // ... configuração do jogador ...

    // Configurar moedas como triggers
    setSprite(coin1, coinImg)
    setCollisionType(coin1, COLLISION_TRIGGER())
    setX(coin1, 100)
    setY(coin1, 80)
    addObject(level, coin1)

    setSprite(coin2, coinImg)
    setCollisionType(coin2, COLLISION_TRIGGER())
    setX(coin2, 150)
    setY(coin2, 120)
    addObject(level, coin2)

    // ... resto do start ...
}

Esse mesmo padrão pode ser expandido para mais moedas, inimigos, portas ou qualquer objeto que precise de comportamento de script.