Crie Jogos 2D com Tiniest2D
Exemplo de Jogo Completo
Lesson 10 of 11 • 10 XP
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
- Criar os sprites:
- Ctrl+Clique em
playerImg, desenhe um personagem (por exemplo, uma figura simples) - Ctrl+Clique em
wallImg, desenhe um bloco sólido -
Ctrl+Clique em
coinImg, desenhe um pequeno círculo ou diamante -
Desenhar a cena:
- Ctrl+Clique em
level - Selecione
wallImgno painel esquerdo, defina a colisão como "Estática" - Pinte paredes ao redor das bordas e crie um labirinto
- Selecione
coinImg, defina a colisão como "Nenhuma" para tiles decorativos de moedas -
Coloque moedas ao redor do nível como guias visuais
-
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.