Slide 1 / 11

Bedah Kode Pygame

Proyek 2: Space Defender — List, Peluru, Musuh, dan Collision

Game sederhana: pemain menggerakkan pesawat, menembak musuh, mengumpulkan skor, dan kalah jika tersentuh musuh.

1. Setup Window dan Konstanta

Game dimulai dengan mengaktifkan Pygame, membuat layar, lalu menyimpan ukuran dan warna dalam variabel agar mudah dipakai ulang.

import pygame
import random
import sys

pygame.init()

WIDTH = 500
HEIGHT = 600

window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Space Defender")
clock = pygame.time.Clock()

2. Player dan Data Utama

Player dibuat sebagai kotak pygame.Rect. Peluru dan musuh disimpan dalam list karena jumlahnya bisa lebih dari satu.

player = pygame.Rect(225, 530, 50, 30)
player_speed = 6

bullets = []
bullet_speed = 8

enemies = []
enemy_speed = 3

score = 0

3. Membuat Banyak Musuh

Loop for dipakai untuk membuat 5 musuh sekaligus. Posisi X diacak, sedangkan posisi Y dimulai dari atas layar agar musuh muncul bertahap.

for i in range(5):
    enemy = pygame.Rect(
        random.randint(0, WIDTH - 40),
        random.randint(-400, -50),
        40,
        40
    )

    enemies.append(enemy)

4. Game Loop dan Event

Selama running bernilai True, game terus membaca event, memproses input, menghitung gerakan, dan menggambar ulang layar.

running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

5. Kontrol Pesawat

Tombol panah kiri dan kanan mengubah posisi X player. Kondisi player.left > 0 dan player.right < WIDTH menjaga pesawat tetap di dalam layar.

keys = pygame.key.get_pressed()

if keys[pygame.K_LEFT] and player.left > 0:
    player.x -= player_speed

if keys[pygame.K_RIGHT] and player.right < WIDTH:
    player.x += player_speed

6. Menembak dengan Cooldown

Tombol spasi membuat peluru baru. Cooldown mencegah peluru muncul terlalu cepat, sehingga tembakan terasa lebih rapi dan mudah dikontrol.

current_time = pygame.time.get_ticks()

if keys[pygame.K_SPACE]:
    if current_time - last_shot >= shoot_cooldown:
        bullet = pygame.Rect(
            player.centerx - 3,
            player.top,
            6,
            15
        )

        bullets.append(bullet)
        last_shot = current_time

7. Menggerakkan dan Menghapus Peluru

Setiap peluru bergerak ke atas. Jika sudah keluar layar, peluru dihapus dari list agar game tidak menyimpan objek yang tidak terlihat.

for bullet in bullets[:]:
    bullet.y -= bullet_speed

    if bullet.bottom < 0:
        bullets.remove(bullet)

bullets[:] berarti membuat salinan list, sehingga aman saat ada elemen yang dihapus ketika loop berjalan.

8. Musuh Turun dan Respawn

Musuh bergerak turun terus-menerus. Jika melewati bawah layar, posisinya diacak lagi di atas layar untuk muncul kembali.

for enemy in enemies:
    enemy.y += enemy_speed

    if enemy.top > HEIGHT:
        enemy.x = random.randint(0, WIDTH - enemy.width)
        enemy.y = random.randint(-300, -50)

9. Collision dan Skor

Saat peluru bertabrakan dengan musuh, peluru dihapus, skor bertambah, lalu musuh dikembalikan ke posisi acak di atas layar.

for bullet in bullets[:]:
    for enemy in enemies:
        if bullet.colliderect(enemy):
            if bullet in bullets:
                bullets.remove(bullet)

            score += 10
            enemy.x = random.randint(0, WIDTH - enemy.width)
            enemy.y = random.randint(-300, -50)
            break

10. Game Over, Render, dan FPS

Jika musuh menyentuh player, game berhenti. Setelah semua logika selesai, layar dibersihkan, objek digambar, skor ditampilkan, lalu frame dikunci di 60 FPS.

if player.colliderect(enemy):
    print("GAME OVER")
    running = False

window.fill(BLACK)
pygame.draw.rect(window, BLUE, player)
pygame.draw.rect(window, YELLOW, bullet)
pygame.draw.rect(window, RED, enemy)

score_text = font.render(f"Score: {score}", True, WHITE)
window.blit(score_text, (10, 10))

pygame.display.update()
clock.tick(60)