Criando jogo do Fantasma na Torre com JavaScript
O jogo do Fantasma na Torre é um desafio emocionante onde você controla um fantasma que precisa escalar uma torre cheia de portas e obstáculos. O objetivo é sobreviver o máximo possível, evitando cair ou ser atingido pelas grades. Sua criação em JavaScript usando a biblioteca p5.js é uma excelente forma de aprender sobre desenvolvimento de jogos, lógica de programação e animações interativas!
Passo 1: Configurando o ambiente
Antes de começarmos a programar, certifique-se de ter um ambiente de desenvolvimento configurado:
Um editor de código (VS Code)
- Um navegador (Google Chrome)
A biblioteca p5.js
Passo 2: Criando as variáveis
O jogo será composto por um fantasma, uma torre, portas, obstáculos e um sistema de pontuação. Vamos começar declarando as variáveis necessárias.
// Estado do jogo
var gameState;
// Torre e fundo
var tower, towerImg;
// Portas e obstáculos
var door, doorImg, doorsGroup;
var climber, climberImg, climbersGroup;
var invisibleBlock, invisibleBlockGroup;
// Fantasma
var ghost, ghostImg;
// Sons do jogo
var spookySound;
Passo 3: Pré-carregando imagens e sons
Antes de iniciarmos o jogo, precisamos carregar os recursos gráficos e sonoros.
function preload() {
// Carrega as imagens
towerImg = loadImage("tower.png");
doorImg = loadImage("door.png");
climberImg = loadImage("climber.png");
ghostImg = loadImage("ghost-standing.png");
// Carrega o som de fundo
spookySound = loadSound("spooky.wav");
}
Passo 4: Configurando o Cenário e o Fantasma
Agora, vamos configurar o cenário do jogo e criar o fantasma.
function setup() {
createCanvas(600, 600);
// Toca o som de fundo em loop
spookySound.loop();
// Cria a torre
tower = createSprite(300, 300);
tower.addImage("tower", towerImg);
tower.velocityY = 1;
// Cria o fantasma
ghost = createSprite(200, 200, 50, 50);
ghost.scale = 0.3;
ghost.addImage("ghost", ghostImg);
}
Passo 5: Movimentação do Fantasma
Vamos permitir que o jogador controle o fantasma usando as setas do teclado e a barra de espaço para pular.
function draw() {
background(0);
// Atualizando o cenário
if (tower.y > 400) {
tower.y = 300;
}
// Movimentação para a esquerda
if (keyDown("left_arrow")) {
ghost.x = ghost.x - 3;
}
// Movimentação para a direita
if (keyDown("right_arrow")) {
ghost.x = ghost.x + 3;
}
// Pulo
if (keyDown("space")) {
ghost.velocityY = -10;
}
// Aplica gravidade ao fantasma
ghost.velocityY = ghost.velocityY + 0.8;
// Desenha os sprites na tela
drawSprites();
}
Passo 6: Gerando Portas e Obstáculos
Para tornar o jogo desafiador, precisamos gerar portas e obstáculos de forma aleatória.
function spawnDoors() {
if (frameCount % 240 === 0) {
// Cria uma porta, um escalador e um bloco invisível
var door = createSprite(200, -50);
var climber = createSprite(200, 10);
var invisibleBlock = createSprite(200, 15,100,20);
// Configura os sprites
door.x = Math.round(random(120, 400));
climber.x = door.x;
invisibleBlock.x = door.x;
// Adiciona as imagens
door.addImage(doorImg);
climber.addImage(climberImg);
// Define a velocidade
door.velocityY = 1;
climber.velocityY = 1;
invisibleBlock.velocityY = 1;
//Definindo camanda do fantasma
ghost.depth = door.depth;
ghost.depth +=1;
// Define o tempo de vida
door.lifetime = 800;
climber.lifetime = 800;
invisibleBlock.lifetime = 800;
// Adiciona aos grupos
doorsGroup.add(door);
climbersGroup.add(climber);
invisibleBlockGroup.add(invisibleBlock);
//colidindo com a climber
ghost.collide(climbersGroup)
}
}
function setup() {
createCanvas(600, 600);
// Toca o som de fundo em loop
spookySound.loop();
// Cria a torre
tower = createSprite(300, 300);
tower.addImage("tower", towerImg);
tower.velocityY = 1;
// Cria o fantasma
ghost = createSprite(200, 200, 50, 50);
ghost.scale = 0.3;
ghost.addImage("ghost", ghostImg);
// Inicializa os grupos de portas e obstáculos
doorsGroup = new Group();
climbersGroup = new Group();
invisibleBlockGroup = new Group();
// Estado de jogo
gameState= "PLAY";
}
function draw() {
background(0);
// Atualizando o cenário
if (tower.y > 400) {
tower.y = 300;
}
// Movimentação para a esquerda
if (keyDown("left_arrow")) {
ghost.x = ghost.x - 3;
}
// Movimentação para a direita
if (keyDown("right_arrow")) {
ghost.x = ghost.x + 3;
}
// Pulo
if (keyDown("space")) {
ghost.velocityY = -10;
}
// Aplica gravidade ao fantasma
ghost.velocityY = ghost.velocityY + 0.8;
// Gera as portas e obstáculos
spawnDoors();
// Desenha os sprites na tela
drawSprites();
}
Passo 7: Criando o estado de jogo PLAY
O jogo terá dois estados principais: PLAY e END. No estado PLAY, o o fantasma pode se mover e pular, e os obstáculos continuam aparecendo. Se colidir com um obstáculo, o jogo entra no estado END.
function PLAY() {
// Atualizando o cenário
if (tower.y > 400) {
tower.y = 300;
}
// Movimentação para a esquerda
if (keyDown("left_arrow")) {
ghost.x = ghost.x - 3;
}
// Movimentação para a direita
if (keyDown("right_arrow")) {
ghost.x = ghost.x + 3;
}
// Pulo
if (keyDown("space")) {
ghost.velocityY = -10;
}
// Aplica gravidade ao fantasma
ghost.velocityY = ghost.velocityY + 0.8;
// Verifica colisões
if (climbersGroup.isTouching(ghost)) {
ghost.velocityY = 0;
}
// Fim de jogo se o fantasma cair ou colidir com um bloco invisível
if (invisibleBlockGroup.isTouching(ghost) || ghost.y > 600) {
gameState = "END";
}
// Gera as portas e obstáculos
spawnDoors();
}
function draw() {
background(0);
// Chama a função PLAY se o estado do jogo for "PLAY"
if (gameState == "PLAY") {
PLAY();
}
// Desenha os sprites na tela
drawSprites();
}
Passo 8: Criando o estado de jogo END
Após o Fantasma colidir com um obstáculo, o jogo entra no estado END. E o jogador tem a opção de recomeçar o jogo.
function END() {
// Deixando o fantasma invisivel
ghost.visible= false;
//Criando o texto de fim de jogo
stroke("yellow");
fill("yellow");
textSize(30);
text("Fim de Jogo, pressione R para reiniciar", 30,250)
// Reinicia o jogo quando o botão de restart é pressionado
if (keyDown("r")) {
reset();
}
}
function draw() {
background(0);
// Chama a função PLAY se o estado do jogo for "PLAY"
if (gameState == "PLAY") {
PLAY();
}
// Chama a função END se o estado do jogo for "END"
if (gameState == "END") {
END();
}
// Desenha os sprites na tela
drawSprites();
}
Passo 9: Reset do jogo
O jogo terá dois estados principais: PLAY e END. No estado PLAY, o T-Rex pode pular e o jogo avança continuamente. Se colidir com um obstáculo, o jogo entra no estado END.
function reset() {
// Deixando o fantasma visivel
ghost.visible= true;
// Reseta o estado do jogo para "PLAY"
gameState = "PLAY";
// Reposiciona o fantasma
ghost.x = 200;
ghost.y = 200;
ghost.velocityY = 0;
// Reposiciona a torre
tower.y = 300;
// Destroi todos os obstáculos
climbersGroup.destroyEach();
invisibleBlockGroup.destroyEach();
doorsGroup.destroyEach();
// Reinicia o som
spookySound.stop();
spookySound.loop();
}
RESULTADO
// Estado do jogo
var gameState;
// Torre e fundo
var tower, towerImg;
// Portas e obstáculos
var door, doorImg, doorsGroup;
var climber, climberImg, climbersGroup;
var invisibleBlock, invisibleBlockGroup;
// Fantasma
var ghost, ghostImg;
// Sons do jogo
var spookySound;
function preload() {
// Carrega as imagens
towerImg = loadImage("tower.png");
doorImg = loadImage("door.png");
climberImg = loadImage("climber.png");
ghostImg = loadImage("ghost-standing.png");
// Carrega o som de fundo
spookySound = loadSound("spooky.wav");
}
function setup() {
createCanvas(600, 600);
// Toca o som de fundo em loop
spookySound.loop();
// Cria a torre
tower = createSprite(300, 300);
tower.addImage("tower", towerImg);
tower.velocityY = 1;
// Cria o fantasma
ghost = createSprite(200, 200, 50, 50);
ghost.scale = 0.3;
ghost.addImage("ghost", ghostImg);
// Inicializa os grupos de portas e obstáculos
doorsGroup = new Group();
climbersGroup = new Group();
invisibleBlockGroup = new Group();
// Estado de jogo
gameState= "PLAY";
}
function draw() {
background(0);
// Desenha os sprites na tela
drawSprites();
// Chama a função PLAY se o estado do jogo for "PLAY"
if (gameState == "PLAY") {
PLAY();
}
// Chama a função END se o estado do jogo for "END"
if (gameState == "END") {
END();
}
}
function PLAY() {
// Atualizando o cenário
if (tower.y > 400) {
tower.y = 300;
}
// Movimentação para a esquerda
if (keyDown("left_arrow")) {
ghost.x = ghost.x - 3;
}
// Movimentação para a direita
if (keyDown("right_arrow")) {
ghost.x = ghost.x + 3;
}
// Pulo
if (keyDown("space")) {
ghost.velocityY = -10;
}
// Aplica gravidade ao fantasma
ghost.velocityY = ghost.velocityY + 0.8;
// Verifica colisões
if (climbersGroup.isTouching(ghost)) {
ghost.velocityY = 0;
}
// Fim de jogo se o fantasma cair ou colidir com um bloco invisível
if (invisibleBlockGroup.isTouching(ghost) || ghost.y > 600) {
gameState = "END";
}
// Gera as portas e obstáculos
spawnDoors();
}
function END() {
// Deixando o fantasma invisivel
ghost.visible= false;
//Criando o texto de fim de jogo
stroke("yellow");
fill("yellow");
textSize(30);
text("Fim de Jogo, pressione R para reiniciar", 30,250)
// Reinicia o jogo quando o botão de restart é pressionado
if (keyDown("r")) {
reset();
}
}
function spawnDoors() {
if (frameCount % 240 === 0) {
// Cria uma porta, um escalador e um bloco invisível
var door = createSprite(200, -50);
var climber = createSprite(200, 10);
var invisibleBlock = createSprite(200, 15,100,20);
invisibleBlock.visible= false
// Configura os sprites
door.x = Math.round(random(120, 400));
climber.x = door.x;
invisibleBlock.x = door.x;
// Adiciona as imagens
door.addImage(doorImg);
climber.addImage(climberImg);
// Define a velocidade
door.velocityY = 1;
climber.velocityY = 1;
invisibleBlock.velocityY = 1;
// Define o tempo de vida
door.lifetime = 800;
climber.lifetime = 800;
invisibleBlock.lifetime = 800;
// Adiciona aos grupos
doorsGroup.add(door);
climbersGroup.add(climber);
invisibleBlockGroup.add(invisibleBlock);
}
}
function reset() {
// Deixando o fantasma visivel
ghost.visible= true;
// Reseta o estado do jogo para "PLAY"
gameState = "PLAY";
// Reposiciona o fantasma
ghost.x = 200;
ghost.y = 200;
ghost.velocityY = 0;
// Reposiciona a torre
tower.y = 300;
// Destroi todos os obstáculos
climbersGroup.destroyEach();
invisibleBlockGroup.destroyEach();
doorsGroup.destroyEach();
// Reinicia o som
spookySound.stop();
spookySound.loop();
}