๐Ÿ  Beranda โ€บ Coding โ€บ Panduan Lengkap: Membuat Game “Stickman Runner”...
Coding

Panduan Lengkap: Membuat Game “Stickman Runner” Berbasis Web dengan HTML, CSS, & JavaScript

Adi Irawan, M.Pd.Gr.
Adi Irawan, M.Pd.Gr.
๐Ÿ“… 20 September 2026 โฑ 11 mnt baca ๐Ÿ’ฌ 0 komentar
Panduan Lengkap: Membuat Game “Stickman Runner” Berbasis Web dengan HTML, CSS, & JavaScript

Pernahkah kamu bermain Dino T-Rex di Google Chrome saat internet mati? Hari ini, kita akan membuat game serupa versi kita sendiri bernama Stickman Runner!

Game ini menggunakan HTML untuk kerangka layar game (Canvas), CSS untuk mempercantik tampilan bergaya arcade, dan JavaScript untuk menghidupkan animasi, gravitasi, kontrol lompatan, rintangan acak, hingga sistem skor

Iklan

Iklan

Sebelum masuk ke kode utama, pastikan kamu memiliki teks editor seperti VS Code. Buat satu folder khusus dan beri nama file utamanya: index.html.

Seluruh kode (HTML, CSS, dan JavaScript) akan kita gabungkan dalam satu file agar mudah di-upload atau disematkan ke dalam postingan WordPress.

Maka kalian akan menghasilkan Game seperti yang ada di bawah ini

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Stickman Runner - Ekskul Coding SMP</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        body {
            background: linear-gradient(135deg, #1a1a2e, #16213e);
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            min-height: 100vh;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            color: #ffffff;
        }
        .game-container {
            text-align: center;
            background: #0f0f1a;
            padding: 20px;
            border-radius: 12px;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
            border: 2px solid #e94560;
        }
        h1 {
            font-size: 1.8rem;
            margin-bottom: 10px;
            color: #e94560;
            letter-spacing: 1px;
        }
        canvas {
            background: #0f0f23;
            border: 3px solid #0f3460;
            border-radius: 8px;
            display: block;
            margin: 0 auto 15px auto;
            box-shadow: inset 0 0 15px rgba(0,0,0,0.8);
        }
        .instructions {
            font-size: 0.9rem;
            color: #a0a0a0;
            background: #1a1a2e;
            padding: 10px;
            border-radius: 6px;
            display: inline-block;
        }
        span.key {
            background: #e94560;
            color: white;
            padding: 2px 8px;
            border-radius: 4px;
            font-weight: bold;
        }
    </style>
</head>
<body>

    <div class="game-container">
        <h1>๐Ÿƒ Stickman Runner Ultimate</h1>
        <canvas id="gameCanvas" width="700" height="250"></canvas>
        <div class="instructions">
            Tekan <span class="key">Spasi</span> atau <span class="key">Klik Layar</span> untuk Melompat (Bisa Double Jump!).
        </div>
    </div>

    <script>
        const canvas = document.getElementById('gameCanvas');
        const ctx = canvas.getContext('2d');

        // --- KONFIGURASI GAME & VARIABEL UTAMA ---
        let score = 0;
        let highScore = 0;
        let gameSpeed = 4;
        let isGameOver = false;
        let frameCount = 0;

        // Objek Stickman (Player)
        const stickman = {
            x: 60,
            y: 170,
            width: 30,
            height: 55,
            vy: 0,          // Kecepatan vertikal
            gravity: 0.6,   // Tarikan gravitasi
            jumpForce: -10, // Kekuatan lompatan
            grounded: false,// Status di tanah
            jumpsLeft: 2,   // Sisa kuota lompatan (untuk Double Jump)
            
            draw() {
                ctx.strokeStyle = '#ffffff';
                ctx.lineWidth = 3;
                ctx.lineCap = 'round';
                ctx.lineJoin = 'round';

                // Kepala
                ctx.beginPath();
                ctx.arc(this.x + 15, this.y + 8, 9, 0, Math.PI * 2);
                ctx.fillStyle = '#ffffff';
                ctx.fill();
                ctx.stroke();

                // Badan
                ctx.beginPath();
                ctx.moveTo(this.x + 15, this.y + 17);
                ctx.lineTo(this.x + 15, this.y + 40);
                ctx.stroke();

                // Tangan
                ctx.beginPath();
                ctx.moveTo(this.x + 15, this.y + 22);
                ctx.lineTo(this.x + 25, this.y + 32);
                ctx.stroke();

                // Kaki (Animasi lari sederhana berdasarkan frame)
                let legOffset = Math.sin(frameCount * 0.2) * 8;
                ctx.beginPath();
                ctx.moveTo(this.x + 15, this.y + 40);
                ctx.lineTo(this.x + 5 + legOffset, this.y + 55);
                ctx.moveTo(this.x + 15, this.y + 40);
                ctx.lineTo(this.x + 25 - legOffset, this.y + 55);
                ctx.stroke();
            },

            update() {
                // Terapkan gravitasi
                this.vy += this.gravity;
                this.y += this.vy;

                // Batas lantai tanah (posisi Y = 170)
                if (this.y > 170) {
                    this.y = 170;
                    this.vy = 0;
                    this.grounded = true;
                    this.jumpsLeft = 2; // Reset kuota lompat saat menyentuh tanah
                }
            },

            jump() {
                if (this.jumpsLeft > 0) {
                    this.vy = this.jumpForce;
                    this.grounded = false;
                    this.jumpsLeft--;
                }
            }
        };

        // Array untuk menyimpan daftar rintangan (kaktus/rintangan bawah & burung/atas)
        let obstacles = [];

        class Obstacle {
            constructor() {
                this.width = 20;
                this.height = Math.random() > 0.5 ? 40 : 25; // Variasi tinggi rintangan
                this.x = canvas.width;
                this.y = 225 - this.height; // Pas di atas garis tanah (Y = 225)
                this.color = '#e94560';
            }

            draw() {
                ctx.fillStyle = this.color;
                ctx.fillRect(this.x, this.y, this.width, this.height);
                
                // Detail kecil kaktus
                ctx.fillStyle = '#ff6b81';
                ctx.fillRect(this.x + 4, this.y + 5, 4, 10);
            }

            update() {
                this.x -= gameSpeed;
            }
        }

        // --- KONTROL INPUT PEMAIN ---
        window.addEventListener('keydown', function(e) {
            if (e.code === 'Space' || e.code === 'ArrowUp') {
                e.preventDefault(); // Mencegah layar scroll ke bawah
                if (isGameOver) {
                    resetGame();
                } else {
                    stickman.jump();
                }
            }
        });

        canvas.addEventListener('click', function() {
            if (isGameOver) {
                resetGame();
            } else {
                stickman.jump();
            }
        });

        // --- FUNGSI RESET GAME ---
        function resetGame() {
            score = 0;
            gameSpeed = 4;
            obstacles = [];
            isGameOver = false;
            frameCount = 0;
            loop();
        }

        // --- DETEKSI TABRAKAN (AABB Collision) ---
        function checkCollision(rect1, rect2) {
            // Berikan sedikit toleransi kotak (margin) agar game terasa adil
            let margin = 5;
            return (
                rect1.x + margin < rect2.x + rect2.width &&
                rect1.x + rect1.width - margin > rect2.x &&
                rect1.y + margin < rect2.y + rect2.height &&
                rect1.y + rect1.height - margin > rect2.y
            );
        }

        // --- GAME LOOP UTAMA ---
        function loop() {
            if (isGameOver) return;

            frameCount++;

            // 1. Bersihkan layar setiap frame
            ctx.clearRect(0, 0, canvas.width, canvas.height);

            // 2. Gambar Background & Tanah
            ctx.fillStyle = '#0f0f23';
            ctx.fillRect(0, 0, canvas.width, canvas.height);

            // Garis Tanah
            ctx.fillStyle = '#0f3460';
            ctx.fillRect(0, 225, canvas.width, 25);
            ctx.strokeStyle = '#e94560';
            ctx.lineWidth = 2;
            ctx.beginPath();
            ctx.moveTo(0, 225);
            ctx.lineTo(canvas.width, 225);
            ctx.stroke();

            // 3. Spawn Rintangan Secara Berkala (Semakin lama semakin cepat)
            if (frameCount % Math.max(60, 120 - Math.floor(score / 5)) === 0) {
                obstacles.push(new Obstacle());
            }

            // 4. Update & Gambar Rintangan
            for (let i = obstacles.length - 1; i >= 0; i--) {
                obstacles[i].update();
                obstacles[i].draw();

                // Cek Tabrakan dengan Stickman
                if (checkCollision(stickman, obstacles[i])) {
                    isGameOver = true;
                }

                // Hapus rintangan jika sudah keluar layar sebelah kiri
                if (obstacles[i].x + obstacles[i].width < 0) {
                    obstacles.splice(i, 1);
                    score += 10; // Tambah skor jika berhasil melewati rintangan
                    
                    // Tingkatkan kecepatan game secara bertahap
                    if (score % 50 === 0) {
                        gameSpeed += 0.5;
                    }
                }
            }

            // 5. Update & Gambar Stickman
            stickman.update();
            stickman.draw();

            // 6. Tampilkan Skor di Layar
            ctx.fillStyle = '#ffffff';
            ctx.font = 'bold 16px sans-serif';
            ctx.fillText(`Skor: ${score}`, 20, 30);
            ctx.fillText(`Kecepatan: ${gameSpeed.toFixed(1)}x`, canvas.width - 130, 30);

            // 7. Jika Game Over
            if (isGameOver) {
                if (score > highScore) {
                    highScore = score;
                }

                ctx.fillStyle = 'rgba(0, 0, 0, 0.75)';
                ctx.fillRect(0, 0, canvas.width, canvas.height);

                ctx.fillStyle = '#e94560';
                ctx.font = 'bold 30px sans-serif';
                ctx.textAlign = 'center';
                ctx.fillText('GAME OVER', canvas.width / 2, canvas.height / 2 - 20);

                ctx.fillStyle = '#ffffff';
                ctx.font = '16px sans-serif';
                ctx.fillText(`Skor Akhir: ${score} | High Score: ${highScore}`, canvas.width / 2, canvas.height / 2 + 15);
                ctx.fillText('Tekan Spasi / Klik untuk Main Lagi', canvas.width / 2, canvas.height / 2 + 45);
                ctx.textAlign = 'left'; // Reset alignment
                return;
            }

            requestAnimationFrame(loop);
        }

        // Mulai game pertama kali
        loop();
    </script>
</body>
</html>
Stickman Runner – Ekskul Coding SMP

๐Ÿƒ Stickman Runner Ultimate

Tekan Spasi atau Klik Layar untuk Melompat (Bisa Double Jump!).

๐ŸŽ’ Panduan Praktis untuk Siswa: Memulai & Menguji Game

Sebelum mulai mengetik atau menyalin kode, pastikan komputer atau laptop kalian sudah menyiapkan aplikasi pendukung berikut ini agar proses ngoding berjalan lancar!

1. Aplikasi Apa yang Harus Dibuka?

  • Teks Editor (Visual Studio Code / Notepad++ / Notepad): Aplikasi tempat kita menulis dan menyusun baris kode program. Di ekstrakurikuler kita, disarankan menggunakan VS Code.
  • Browser Web (Google Chrome / Microsoft Edge / Firefox): Jendela penjelajah internet yang akan kita pakai untuk menjalankan, melihat hasil, dan memainkan game buatan kita.

2. Langkah Menyimpan File Project

  1. Buka aplikasi teks editor pilihanmu (misalnya VS Code).
  2. Buat dokumen baru, lalu salin (copy-paste) kode lengkap game Stickman Runner ke dalam editor tersebut.
  3. Simpan file dengan menekan tombol Ctrl + S (atau Cmd + S jika pakai Mac).
  4. Beri nama file: index.html (Pastikan ekstensinya berakhiran .html, bukan .txt). Simpan di dalam satu folder khusus, contohnya folder Game-Stickman.

3. Cara Menguji Coba Game (Testing)

Setelah file berhasil disimpan, saatnya melihat apakah game buatanmu berfungsi dengan baik:

  • Buka folder tempat kamu menyimpan file index.html tadi.
  • Klik dua kali (Double-click) pada file index.html tersebut.
  • File akan otomatis terbuka di browser web (Chrome/Edge).
  • Uji kontrol permainan:
    • Tekan tombol Spasi atau Panah Atas di keyboard untuk membuat stickman melompat. Coba tekan dua kali dengan cepat untuk melakukan Double Jump!
    • Biarkan karakter menabrak rintangan kaktus untuk memastikan layar GAME OVER muncul dengan informasi skor akhir.
    • Tekan spasi sekali lagi di layar Game Over untuk menguji apakah game bisa dimulai ulang dari awal.
Tag: Coding
Adi Irawan
Adi Irawan, M.Pd.Gr.
Guru Matematika ยท CEO CV HNF GRAFIS ยท Mahasiswa S2 UM Metro
Pendidik dan pengembang perangkat lunak dari Lampung Tengah. Sekretaris MGMP Matematika dan Pengurus IGI Lampung Tengah. Membangun MahaGuru untuk menghadirkan pendidikan berkualitas bagi semua guru Indonesia.
๐Ÿ’ฌ Komentar 0
โœ๏ธ Tinggalkan Komentar
Email tidak akan ditampilkan publik. Komentar akan muncul setelah dimoderasi.
โšก
Generate Modul Ajar
Buat modul ajar Kurikulum Merdeka dalam hitungan menit.
Coba Sekarang โ†’