Criar Platformer Estilo Mario no GameMaker Studio 2 (Tutorial Completo)

Construir platformer tipo Mario no GameMaker Studio 2 (GMS2.3+/GML Visual ou Código) é projeto clássico aprendizagem. Aqui está roteiro estruturado.

1. Setup Projeto

  • Novo Projeto: GML Code (recomendado) ou GML Visual.
  • Resolução: 640×360 (16:9, escala para 720p/1080p/4K). Viewport = 640×360.
  • Física: Não use Physics Engine built-in para platformers. Escreva colisão custom (ver abaixo).

2. Pipeline Assets

  • Sprites: Importe sprite strips (Idle, Run, Jump, Fall, Climb, Swim, Power-ups). Defina Origin: Middle Center (pés).
  • Tilesets: 16×16 ou 32×32. Camada colisão = "Solid" tile layer.
  • Áudio: .ogg/.wav. Grupos: Música, SFX, Voz.

3. Objeto Jogador (obj_player)

// Create Event
hsp = 0; vsp = 0; grav = 0.45; jump_force = -9.5; max_speed = 4.5; accel = 0.35; decel = 0.4; coyote_time = 6; jump_buffer = 6; // frames
coyote = 0; jbuf = 0; on_ground = false; state = "idle"; // idle, run, jump, fall, attack
sprite_index = spr_mario_idle; image_speed = 0.15;

// Step Event
// Input
var left = keyboard_check(vk_left) or keyboard_check(ord("A"));
var right = keyboard_check(vk_right) or keyboard_check(ord("D"));
var jump_pressed = keyboard_check_pressed(vk_space) or keyboard_check_pressed(ord("W"));
var jump_held = keyboard_check(vk_space) or keyboard_check(ord("W"));

// Jump Buffer
if (jump_pressed) jbuf = jump_buffer; else if (jbuf > 0) jbuf--;

// Horizontal
if (left) hsp = max(hsp - accel, -max_speed);
else if (right) hsp = min(hsp + accel, max_speed);
else hsp = lerp(hsp, 0, decel);

// Coyote Time
if (on_ground) coyote = coyote_time; else if (coyote > 0) coyote--;

// Jump Logic
if (jbuf > 0 && coyote > 0) {
  vsp = jump_force; on_ground = false; coyote = 0; jbuf = 0;
  audio_play_sound(snd_jump, 10, false);
}

// Variable Jump Height (cut)
if (!jump_held && vsp < -2) vsp = -2;

// Gravity
vsp = min(vsp + grav, 16); // terminal velocity

// Collision & Move (see Section 4)
// ... collision code sets on_ground, adjusts x/y ...

// Animation State Machine
if (!on_ground) {
  if (vsp < 0) state = "jump"; else state = "fall";
} else if (hsp != 0) state = "run";
else state = "idle";
sprite_index = sprite_get("spr_mario_" + state);

4. Colisão Precisa (O Feel Mario)

// Horizontal
var _x = x + sign(hsp);
repeat(abs(hsp)) {
  if (!place_meeting(_x, y, obj_solid)) x = _x;
  else { hsp = 0; break; }
  _x += sign(hsp);
}

// Vertical
var _y = y + sign(vsp);
repeat(abs(vsp)) {
  if (!place_meeting(x, _y, obj_solid)) y = _y;
  else {
    vsp = 0;
    if (vsp > 0) on_ground = true; else on_ground = false; // head bonk
    break;
  }
  _y += sign(vsp);
}

Este loop pixel-perfect previne sticking, permite precisão sub-pixel, e sente-se tight.

5. Inimigos (Goomba / Koopa)

  • State machine: Walk → Stomped (achatado) → Kicked (shell) → Shell slide.
  • Shell: obj_shell com hsp alto, mata inimigos, quebra tijolos, magoa jogador.
  • Deteção stomp: if (vsp > 0 && place_meeting(x, y+1, obj_enemy)) → bounce (vsp = jump_force * 0.6).

6. Power-Ups e Blocos

  • Bloco ?: Timer → spawn Cogumelo / Flor / Estrela / Moeda. Acerte por baixo (vsp < 0 && place_meeting(x, y-1, obj_question)).
  • Cogumelo: Move direita, cai, vira paredes. Colisão → player.state = "grow" (animação → sprite_index = spr_mario_big, bbox altura ×2).
  • Flor: Atira fireballs (obj_fireball: linear, quica, morre parede).
  • Estrela: Timer invencibilidade, ciclo paleta, kill-on-touch.

7. Câmara

// obj_camera Step
var target_x = obj_player.x;
var target_y = obj_player.y - 100; // look ahead
camera_set_view_pos(view_camera[0],
  lerp(camera_get_view_x(view_camera[0]), target_x, 0.1),
  lerp(camera_get_view_y(view_camera[0]), target_y, 0.1));
// Clamp to room bounds

8. Level Design

  • Room por nível (ou room grande + regiões ativação).
  • Tile collision layer + Instance layer (inimigos, itens).
  • Use Herança: obj_enemy_parent → obj_goomba, obj_koopa.

9. Polish Essencial

  • Coyote Time + Jump Buffer (implementado acima) — crítico para justiça.
  • Partículas FX: Pó aterragem/corrida, estrelas stomp, screen shake morte.
  • Sound Design: Variação pitch jump/moeda (audio_play_sound_at com pitch aleatório 0.9–1.1).
  • Game Feel: 5-frame jump startup, 3-frame landing lag, 1-frame input buffer.

10. Recursos

  • HeartBeast / FriendlyCosmonaut (YouTube): "Make a Platformer in GameMaker 2023".
  • GameMaker Docs: Collision Functions, Tilemap Functions, State Machines.
  • YoYo Games Tech Blog: "Platformer Collision" article.
  • GitHub: Pesquise "GameMaker Mario Clone" para projetos referência.

Comece pequeno: Uma room, Mario move, salta, colide, stompa um Goomba. Expanda semanalmente.

HT Jogos © direito autoral [www.ptjogos.com]