💿

CD Engine Documentação

Introdução

A CD Engine é uma game engine simples criada com NodeJs e ElectronJs para originalmente desenvolvedores linux criarem jogos de forma simples utilizando JavaScript mas com um apoio de algumas pessoas o projeto foi escalado para uma engine multi plataforma focada em Linux, Windows e Android.

O propósito da engine é ser simples e focada na criação de jogos 2d para navegadores e sua principal filosofía é ser leve e simples para qualquer pessoa poder aprender a programar nela sem precisar fazer cursos e cursos e também por ser uma engine Brasileira desenvolvida por uma pessoa só, ela tem o propósito de atender a características Brasileiras e ser bem inclusiva.

Primeiros passos

Configurando um novo projeto

A CD Engine usa a linguagem de programação JavaScript e isso faz ela ser simples e leve, para começar seu projeto, basta definir o caminho aonde seus projetos serão salvos depois criar um novo projeto, abrir a pasta de seu projeto e abrir o arquivo game.js no seu editor de códigos favorito e só começar a programar.

Como iniciar um projeto?

Para iniciar seu projeto, basta abrir o programa/apk da engine, abrir o projeto desejado e apertar em run e pronto, seu projeto foi iniciado.

Estruturas

Na CD Engine temos 2 estruturas opicionais mas que podem ser importantes pois ajudam no desenvolvimento, organização e ordem do projeto, temos o onStart que executa comandos assim que o jogo abre e o onUpdate que executa comandos a cada frame do jogo e essas estruturas não dependem da cena, por isso, use com sabedoria.

onStart = ()=>{
	// Quando o jogo abrir
}

onUpdate = ()=>{
	// A cada frame
}

Nodes (objetos)

Na CD Engine utilizamos Nodes que são objetos manipuláveis, nodes podem conter física e sprites para serem visualizados e/ou simulados no mundo do seu jogo.

Para criar um novo Node basta criar uma variável com o nome desejado e atribuir um new Node().

Veja um exemplo :

var NovoObjeto = new Node(
	0, // Posição x
	0, // Posição y
	50, // Largura
	50, // Altura
	"imagem.png", // Sprite do objeto, deve estar na pasta do projeto, caso esteja dentro de uma subpasta, deve-se incluir a pasta
	MainWorld, // Mundo / Cena que o objeto será criado
);

Caso queira removerem um objeto, basta usar a função .remove para a remoção do objeto.

Veja um exemplo :

NovoObjeto.remove(); // Remove o objeto da cena atual

Mundos (Cenas)

Mundos na CD Engine são como cenas, eles servem para diferenciar locais e acontecimentos em seu jogo e de padrão existe o mundo MainWorld que é criado por padrão pela engine, mas você pode criar outros mundos e iniciar eles.

Aqui um exemplo :

const MeuMundo = new World(); // Cria um mundo novo
changeWorld(MeuMundo); // Seleciona o mundo criado e inicia ele
ThisWorld; // Variável que retorna o mundo atual

E você pode alterar a cor de fundo usando o setBackgroundColor. Com essa função você pode escolher uma cor (rgb, rgba, hex, hsls e etc) e definir a cor de seu fundo de forma simples e você pode também escolher uma imagem para ser o fundo do seu jogo.

Os mundos possuem estruturas que podem ajudar no desenvolvimento de seu jogo pois com as estruturas, seu jogo ficará mais organizado e bem estruturado.

Aqui um exemplo :

const MeuMundo = new World();
MeuMundo.onStart = ()=>{
	// Quando a cena iniciar
};

MeuMundo.onUpdate = ()=>{
	// Sempre que a cena estiver em execução
};

MeuMundo.onEnd = ()=>{
	// Quando a cena finalizar
};

Aqui um exemplo :

setBackgroundColor("#f00"); // Cor de fundo mudada para vermelho
setBackgroundSprite("background.png"); // Imagem de fundo mudada
setBackgroundPosition(0,0); // Posição de fundo mudada para x 0 e y 0

Física com Nodes

Como dito anteriormente, podemos usar da física para criar elementos com gravidade ou estáticos para a criação de seu jogo.

Para criar um objeto com física basta adicionarmos o atributo addPhysicbody e definir se ele vai ser estático ou não.

Aqui um exemplo bem simples de como usar :

Player.addPhysicbody(); // Objeto com física dinâmico
Ground.addPhysicbody(false); // Objeto com física estático

Podemos também definir a velocidade do objeto para poder criar sistemas de pulo e movimento, podemos usar para fazer portas abrirem/fecharem e até mesmo veículos simples, para isso usamos a função defineVelocity para a definição da velocidade, com isso podemos definir a velocidade x e y do objeto desejado e caso não queira mudar o x somente o y e vice-versa, basta adicionar null no local.

Aqui um exemplo :

// Pulo simples apenas com a velocidade y

Player.defineVelocity(
	0, // Velocidade x
	-200 // Velocidade y
);

// Movimento simples apenas com a velocidade x

Player.defineVelocity(
	100, // Velocidade x
	0 // Velocidade y
);

// Pulo simples apenas com a velocidade y sem alterar a velocidade x

Player.defineVelocity(
	null, // Velocidade x
	-200 // Velocidade y
);

// Movimento simples apenas com a velocidade x sem alterar a velocidade y

Player.defineVelocity(
	100, // Velocidade x
	null // Velocidade y
);

Podemos bloquear a rotação de um node também usando o .fixedAngle de forma simples.

Aqui um exemplo :

Player.fixedAngle = true; // Bloqueia a rotação

Caso seu node tenha física aplicada, você recebe uma função para definir a posição do node com física.

Ficaria assim :

Player.definePosition(0,0); // Posição no x 0 e y 0

Você também pode verificar se dois objetos estão colidindo de forma simples usando o checkCollision e definindo uma precisão, quanto menor a precisão, mais preciso.

Aqui um exemplo :

const onUpdate = ()=>{
	if(checkCollision(obj1, obj2, 1) return true; // Retorna true se ojb1 estiver colidindo com obj2
};

Spritesheet

Na CD Engine, podemos criar sprites sheets de forma simples, cada node tem uma variável chamada sheet que é um sub-objeto que tem os atributos da sheet.

Aqui um exemplo completo usando spritesheets :

var Player = new Node(0,0,40,60,"spritesheet.png");
Player.sheet.enabled = true; // Habilita o spritesheet
Player.sheet.x = 0; // Posição x no spritesheet
Player.sheet.y = 0; // Posição y no spritesheet
Player.sheet.width = 40; // Largura da sprite no spritesheet
Player.sheet.height = 60; // Altura da sprite no spritesheet

Câmera

Na CD Engine, colocar um ponto de visualização (câmera) é muito simples, basta você usar o pointView e selecionar o node desejado.

Segue um exemplo :

pointView.node = Player; // Câmera focará no player

Interfaces

Na CD Engine é possível criar interfaces simples para seus jogos como textos e botões para criar sistemas como menu, tela de loading, GUI do jogador e etc.

Para criar essas interfaces é similar ao Node, mas deve-se usar Interface .

Segue-se um exemplo :

var MinhaInterface = new Interface(
	0, // Posição x
	0, // Posição y
	100, // Largura
	50, // Altura
	"#0005" // Cor de fundo
);

MinhaInterface.setText("Não me toque"); // Define o texto da interface

MinhaInterface.addClickEvent(()=>{ // Adiciona evento de quando clicado
	alert("Não me toque!!!");
});

MinhaInterface.setColor("red"); // Define a cor da interface
MinhaInterface.setSprite("imagem.png"); // Define a sprite da interface
MinhaInterface.setText("Hello, World"); // Define o texto da interface

MinhaInterface.hide(); // Esconde a interface
MinhaInterface.show(); // Mostra a interface
MinhaInterface.clicked // Retorna true se a interface estiver sendo clicada com o mouse
MinhaInterface.touched // Retorna true se a interface estiver sendo clicada com o toque

Detectar tecla pressionada

Na CD Engine, você pode verificar se uma tecla foi pressionada usando a variável pressedKeys para verificar se uma tecla desejada foi pressionada, você deve usar um loop para fazer isso, pode ser um requestAnimationFrame (recomendado) ou um setInterval.

Segue um exemplo :

function verificarTeclas(){ // Cria um loop
	requestAnimationFrame(verificarTeclas); // Chama o loop
	if(pressedKeys.includes("d") { // Verifica se a tecla D está sendo pressionada
		Player.defineVelocity(100, null); // Se a tecla estiver sendo pressionada, a velocidade x do objeto Player é definida para 100.
	};
};
requestAnimationFrame(verificarTeclas); // Inicia o loop

Funções

Aqui uma lista de funções da engine que podem ajudar no desenvolvimento de seu projeto :

getRandom(mínimo, máximo); // Retorna um número aleatório com um valor mínimo e um máximo

wait(segundos, () => { // Executa um código após alguns segundos
  console.log("Passaram 2 segundos!");
});

print("Texto", x, y, tamanho, "cor", "Fonte", "estilo", "centralização"); // Escreve algo direto na tela

loadFont("https://example.com/fonts/MyFont.ttf"); // Carrega uma fonte para ser usada no print

Sons

A CD Engine tem suporte a sistemas de sons com e sem loopings que facilita a aplicação de músicas de fundo e efeitos sonoros como morte, pulo, captura de moeda e etc.

Sons devem ser criados fora de extruturas e devem ser executadas dentro de alguma estrutura e de preferência onStart por segurança do JavaScript.

Aqui um bom exemplo :

// Estrutura do som "Sound(caminho do som.mp3, é loop?)"
var som; // Define a variável do som

onStart = ()=>{
	som = new Sound("som.mp3", true); // Cria o som em loop
	som.play(); // Inicia o som
	som.stop(); // Finaliza o som
}

Apoio

Obrigado por escolher a CD Engine, você pode me apoiar entrando no grupo do Whatsapp e/ou doar em meu pix leonardopinezi.ti@gmail.com

Esse projeto dá muito trabalho, cada apoio ajuda muito, muito obrigado <3

Projetos de exemplo

// Cria um jogo simples com um player, um chão e um sistema de movimentação simples com teclado.

var player_sprite = "Defina a sprite do player";

var player;
var ground;

pointView.node = player;

onStart = ()=>{
	player = new Node(0,0,50,50,player_sprite);
	ground = new Node(0,250,500,50,"Defina a sprite do chão");
	player.addPhysicbody();
	ground.addPhysicbody(false);
};


onUpdate = ()=>{
  if(pressedKeys.includes("d")) player.defineVelocity(100,null);
  if(pressedKeys.includes("a")) player.defineVelocity(-100,null);
  if(!pressedKeys.includes("a") && !pressedKeys.includes("d")) player.defineVelocity(0,null);
};
const playerSprite = "player.png";
const groundSprite = "ground.png";

onStart = () => {
  // Criar o jogador
  const player = new Node(200, 100, 50, 50, playerSprite);
  player.addPhysicbody(1); // Corpo dinâmico para o jogador
  pointView.node = player; // Centraliza a câmera no jogador

  // Criar o chão
  const ground = new Node(0, 300, 800, 50, groundSprite);
  ground.addPhysicbody(0); // Corpo estático para o chão

  // Adicionar várias plataformas
  for (let i = 0; i < 5; i++) {
    const platform = new Node(150 * i + 100, 200 - 50 * i, 100, 20, groundSprite);
    platform.addPhysicbody(0); // Corpo estático para as plataformas
  }

  // Adicionar controle ao jogador
  onUpdate = (dt) => {
    const speed = 200;
    const jumpForce = -300;

    // Movimento lateral
    if (pressedKeys.includes("ArrowRight")) {
      player.defineVelocity(speed, null);
    } else if (pressedKeys.includes("ArrowLeft")) {
      player.defineVelocity(-speed, null);
    } else {
      player.defineVelocity(0, null);
    }

    // Pulo (somente se estiver tocando o chão)
    if (pressedKeys.includes("ArrowUp") && Math.round(player.body.velocity[1]) === 0) {
      player.defineVelocity(null, jumpForce);
    }

    // Prevenir que o jogador saia da tela
    if (player.x < 0) player.x = 0;
    if (player.x > canvas.width - player.width) player.x = canvas.width - player.width;
  };
};