관리자 인증 확인 중...
B 또는 Space 로 복귀
LUNA CODE LAB · CLASS I Week 7 — 보스전과 게임 BGM 초4 · 중3 / 90분
1 / 9 📄 워크시트
WEEK 07 · 2026

보스를 쓰러뜨리고
BGM을 깐다

4주짜리 비행기 게임 완성. 100점 도달 = 보스 등장. 좌우로 움직이며 탄막을 쏘는 보스를 무찌르면 승리. 그리고 Suno로 8비트 BGM을 직접 작곡해 게임에 깝니다. 이게 진짜 게임 개발자의 마지막 단계.

Duration90 minutes
ToolClaude Code + Suno
Output완성된 슈팅 게임
Phase비행기 게임 완성 (4/4)
02 / Learning Goals⏱ 5분

오늘의 학습 목표

1
보스 등장 트리거
점수 100점 도달 → 일반 스폰 정지 → 보스 하나만 등장. 게임 상태 관리(state machine) 첫 등장.
2
보스 행동 패턴 + 탄막
보스는 좌우로 천천히 움직이면서 1초마다 탄막 3발. 부채꼴로 발사.
3
보스 HP 바 (대형)
화면 상단 가운데 큰 HP 바. 미사일 맞을 때마다 줄어듦. 보라색→빨강으로 그라데이션.
4
Suno로 BGM 작곡 + 임베드
Suno에서 "8-bit retro space shooter" 프롬프트 → MP3 다운로드 → audio 태그로 게임에 깔기.
03 / Concept · State Machine⏱ 8분

게임은 상태 기계

지금까지는 '평소' 한 가지 상태였지만, 보스가 들어오면 상태가 여러 개 — PLAYING → BOSS → VICTORY / GAMEOVER. 매 프레임 "지금 무슨 상태?"부터 묻는 게 큰 게임의 비밀.

🎮
PLAYING
평소 — 적 스폰
점수 100까지
👹
BOSS
보스 등장
일반 적 정지
🏆
VICTORY
보스 HP 0
승리 화면
코드 한 줄: let state = 'playing'; // 'playing' | 'boss' | 'victory' | 'gameover'
매 프레임 if (state === 'boss') { 보스 행동 } else if (state === 'playing') { 평소 } — 끝.
04 / Suno · BGM 작곡⏱ 12분

Suno로 BGM 직접 만들기

❌ 막연한 프롬프트
"게임 음악 만들어줘"
왜 안 좋나? Suno가 100가지 게임 음악 중 뭘 만들어야 할지 모름. 결과: 발라드? 록? 재즈? 매번 다른 게 나옴.
✓ 좋은 프롬프트
8-bit retro space shooter BGM,
fast tempo (140 BPM),
chiptune synth lead,
looping, instrumental only,
NES-style action game
왜 좋나? 장르·BPM·악기·구조·레퍼런스(NES) 다 명시. Suno가 정확히 그 분위기 곡 생성. 보컬 빼는 것도 중요.
💡 Suno 프롬프트 5요소 (Week 1 프롬프트 공식이랑 똑같아):
① 장르 (8-bit, lo-fi, orchestral) ② 분위기 (긴장감/잔잔/신남) ③ BPM (느리면 70, 빠르면 140) ④ 악기 (chiptune synth, piano, drums) ⑤ 참고작 ("like Mega Man" 등)
05 / Live Build · Step 1⏱ 10분

Step 1 — 보스 등장 조건

점수 100점 → 일반 적 스폰 정지 → 화면 위에서 보스가 천천히 내려와 자리 잡는다.

1
Claude에게 보낼 프롬프트
"보스 등장 시스템 추가해줘. - 게임 상태 변수: state = 'playing' | 'boss' | 'victory' - score >= 100이 되면 state = 'boss'로 전환 - 보스 상태에선 setInterval 일반 적 스폰 정지 - 화면 밖 위에서 보스(150x100, 보라색) 등장 - 보스가 y=80까지 천천히 내려와 자리 잡음 - 보스 hp=30, maxHp=30, x = 화면 가운데"
핵심 코드 — 상태 전환
let state = 'playing'; let boss = null; let spawnInterval = null; function startSpawning() { spawnInterval = setInterval(spawnEnemy, 1000); } function update() { // 점수 100 도달 시 보스 모드로 if (state === 'playing' && score >= 100) { state = 'boss'; clearInterval(spawnInterval); // 일반 적 정지 boss = { x: canvas.width/2 - 75, y: -100, w: 150, h: 100, hp: 30, maxHp: 30, dir: 1, lastShot: 0 }; } if (state === 'boss' && boss.y < 80) boss.y += 1; // 등장 애니메이션 }
🎙
상태 기계의 위력 "이거 한 번 이해하면 RPG·격투·횡스크롤 다 똑같아요. 메뉴 → 게임 → 일시정지 → 게임오버 다 'state'예요. AI에게 'state machine' 한 단어만 알려주면 알아서 짜줘요."
05 / Live Build · Step 2⏱ 15분

Step 2 — 보스 패턴 · 탄막

보스가 좌우로 왔다갔다 하면서 1초마다 부채꼴 3발 탄막을 쏜다. 진짜 슈팅 게임 보스의 시작.

2
Claude에게 보낼 프롬프트
"보스 행동 패턴 추가해줘. - 좌우로 천천히 이동(속도 2). 화면 끝 닿으면 방향 전환. - 1초마다 탄막 3발 부채꼴로 발사 · 가운데 발 (똑바로 아래) · 왼쪽 사선 (-15도) · 오른쪽 사선 (+15도) - 탄막은 작은 보라 원(8px), 속도 4 - 탄막이 비행기에 닿으면 hp--, 무적시간 1초 - bossBullets 배열로 관리, 화면 밖 나가면 filter로 제거"
핵심 코드 — 좌우 이동 + 탄막 발사
const bossBullets = []; // 매 프레임 — 보스 상태일 때만 if (state === 'boss' && boss && boss.y >= 80) { // 좌우 이동 boss.x += boss.dir * 2; if (boss.x < 0 || boss.x > canvas.width - boss.w) boss.dir *= -1; // 1초마다 탄막 3발 const now = Date.now(); if (now - boss.lastShot > 1000) { boss.lastShot = now; const cx = boss.x + boss.w/2, cy = boss.y + boss.h; [-15, 0, 15].forEach(deg => { const rad = (deg + 90) * Math.PI / 180; // 아래쪽 기준 bossBullets.push({ x: cx, y: cy, w: 8, h: 8, vx: Math.cos(rad) * 4, vy: Math.sin(rad) * 4 }); }); } } bossBullets.forEach(b => { b.x += b.vx; b.y += b.vy; });
🎙
vx, vy "속도를 'vx(가로 속도) + vy(세로 속도)'로 나누면 모든 방향 발사가 가능. cos/sin은 외울 필요 없어 — AI한테 '몇 도로 발사'만 알려주면 알아서 계산해줘요."
05 / Live Build · Step 3⏱ 10분

Step 3 — 보스 HP 바 + 승리

상단 가운데 큰 HP 바. 보라→빨강 그라데이션. 보스 잡으면 VICTORY 화면.

3
Claude에게 보낼 프롬프트
"보스 HP 시스템 + 승리 화면 추가해줘. - 미사일이 보스 맞히면 boss.hp-- - 화면 상단 가운데에 큰 HP 바 (400x18) · 'BOSS' 라벨 위에 표시 · 보라(#7B5BA8)에서 빨강 그라데이션 - boss.hp가 0 되면 state = 'victory' - VICTORY 화면: 노란 'VICTORY!' + 최종점수 + 'Press SPACE' - 스페이스 누르면 처음부터 다시 시작"
핵심 코드 — HP 바 그라데이션 + 승리
// 미사일 vs 보스 충돌 missiles.forEach(m => { if (boss && isColliding(m, boss)) { m.dead = true; boss.hp--; if (boss.hp <= 0) state = 'victory'; } }); // HP 바 그라데이션 (보라→빨강) if (state === 'boss' && boss) { const bx = canvas.width/2 - 200, by = 20; ctx.fillStyle = '#333'; ctx.fillRect(bx, by, 400, 18); const grad = ctx.createLinearGradient(bx, 0, bx + 400, 0); grad.addColorStop(0, '#7B5BA8'); grad.addColorStop(1, '#B84A4A'); ctx.fillStyle = grad; ctx.fillRect(bx, by, 400 * (boss.hp/boss.maxHp), 18); ctx.fillStyle = '#fff'; ctx.font = 'bold 12px monospace'; ctx.textAlign = 'center'; ctx.fillText(`BOSS ${boss.hp}/${boss.maxHp}`, canvas.width/2, by + 13); } // 승리 화면 if (state === 'victory') { ctx.fillStyle = 'rgba(0,0,0,0.7)'; ctx.fillRect(0,0,canvas.width,canvas.height); ctx.fillStyle = '#FFD700'; ctx.font = 'bold 80px monospace'; ctx.textAlign = 'center'; ctx.fillText('VICTORY!', canvas.width/2, canvas.height/2); }
🎙
그라데이션 "createLinearGradient는 화면에 색 점점 바뀌는 효과예요. 'a에서 b로'만 알려주면 알아서. HP 바, 하늘, 폭발 효과 다 이거 써요."
05 / Live Build · Step 4⏱ 13분

Step 4 — Suno에서 BGM 작곡

suno.com 접속 → Custom 모드 → 아래 프롬프트 → 90초 BGM 생성 → MP3 다운로드.

4
Suno에 입력할 Style 프롬프트 (3가지 옵션)
// 옵션 A — 긴장감 있는 슈팅 "8-bit retro space shooter BGM, fast tempo 140 BPM, chiptune synth lead, driving bass, NES-style, looping, instrumental, like Mega Man stage music" // 옵션 B — 잔잔한 슈팅 "chill synthwave space arcade, 100 BPM, soft synth pads, light drums, retro 80s game, looping background music, no vocals" // 옵션 C — 보스전 에픽 "epic 8-bit boss battle BGM, 160 BPM, heavy chiptune drums, dark synth lead, tense and dramatic, NES boss theme style, instrumental loop"
Suno 사용 순서 (5분 안에 가능)
1. suno.com 접속 → Google 로그인 (무료 가입) 2. 좌측 'Create' → 'Custom' 모드 토글 ON 3. 'Style' 칸에 위 프롬프트 중 하나 붙여넣기 4. 'Lyrics' 칸은 '[instrumental]' (보컬 빼기) 5. 'Instrumental' 토글 ON (가사 없음 확실히) 6. 'Create' 버튼 → 약 1분 대기 7. 두 곡 동시 생성됨 → 들어보고 마음에 드는 것 8. ⋯ 메뉴 → 'Download Audio' → MP3 저장 9. 게임 폴더에 bgm.mp3로 저장
🎵
학생 액션 (10분) 본인 게임 분위기 맞춰 옵션 A/B/C 중 선택 → 자유롭게 단어 바꿔봐 (BPM·악기·참고작) → Suno에서 곡 생성 → 만족스러우면 다운로드, 별로면 다시 생성. 무료 계정은 하루 10번 가능.
05 / Live Build · Step 5⏱ 7분

Step 5 — BGM 게임에 임베드

방금 다운받은 bgm.mp3를 게임에 넣어 자동 재생 + 루프. HTML audio 태그 + JS 한 줄로 끝.

5
Claude에게 보낼 프롬프트
"게임에 BGM을 추가해줘. - 같은 폴더에 bgm.mp3 파일 있음 - HTML에 audio 태그 (loop 옵션, hidden) - 처음 클릭/키 입력 시 재생 시작 (브라우저 자동재생 정책) - 볼륨 30%로 잔잔하게 - 게임오버 시 일시정지, 재시작 시 다시 재생 - M 키로 음소거 토글 + 화면 우하단에 '🎵 ON/OFF' 표시"
핵심 코드 — audio + 자동 시작 + 음소거
// HTML <audio id="bgm" src="bgm.mp3" loop></audio> // JS const bgm = document.getElementById('bgm'); bgm.volume = 0.3; let bgmStarted = false; // 첫 입력 시 재생 (브라우저 정책) function startBGM() { if (!bgmStarted) { bgm.play(); bgmStarted = true; } } document.addEventListener('keydown', startBGM, { once: true }); // 게임 상태에 따라 일시정지/재생 if (state === 'gameover') bgm.pause(); else if (bgmStarted && bgm.paused) bgm.play(); // M 키로 음소거 document.addEventListener('keydown', e => { if (e.key === 'm' || e.key === 'M') bgm.muted = !bgm.muted; });
🎙
오늘의 마무리 — 7주의 여정 "7주 전엔 노란 배경에 빨간 사각형 하나 만들었어요. 지금은 보스전 + 직접 작곡한 BGM이 깔린 슈팅 게임. 이게 누적의 힘이에요. 다음 주부터는 캐릭터·자동공격·서바이버 시리즈로 갑니다."
10 / Checkpoint⏱ 5분

여기까지 됐나? 확인하기

잘 됐다면
  • 100점 도달 시 보스 등장 + 일반 적 정지
  • 보스가 좌우로 움직이며 1초마다 탄막 3발
  • 상단에 보스 HP 바 (보라→빨강 그라데이션)
  • 보스 잡으면 VICTORY! 화면
  • Suno BGM 자동 재생 + M키 음소거
⚠️자주 막히는 부분
  • 보스 등장 후 일반 적도 계속 → clearInterval 호출 빠짐
  • 탄막이 일자로만 → cos/sin 각도 계산 잘못
  • HP 바 그라데이션 안 됨 → createLinearGradient 매개변수 확인
  • BGM 자동재생 안 됨 → 첫 키 입력 후 play() — 브라우저 정책
  • Suno 곡에 가사 들어감 → Instrumental 토글 OFF 됐었음
11 / Challenge⏱ 10분

더 해보고 싶다면 도전

🎯
보스 HP 50%일 때 패턴 변경 — 탄막 3발 → 5발로 늘리고 속도 1.5배. 2단계 보스.
난이도 ★
🔊
승리 BGM 따로 만들기 — Suno에서 'victory fanfare 8-bit'로 추가 곡 생성. VICTORY 화면에서 자동 재생.
난이도 ★★
💀
보스 죽을 때 폭발 애니메이션 — 0.5초 동안 파티클 30개가 사방으로, 화면 흔들림 효과.
난이도 ★★★
12 / Student Gallery⏱ 7분

작년 친구들 작품

13 / Next Week⏱ 3분

다음 시간 예고

WEEK 08 · COMING UP

캐릭터와 자동공격 —
서바이버 시작

비행기 게임 4주가 끝났습니다. 다음 주부터는 새 시리즈 — Vampire Survivors 스타일. 이번엔 캐릭터가 가만히 있어도 자동으로 공격하고, 적이 사방에서 몰려옵니다. 미사일을 안 쏴도 게임이 되는 비밀.

PREPARE · 준비물
  • 완성된 비행기 게임 (오늘 만든 보스+BGM 버전) — 학원 SNS에 공유
  • 좋아하는 액션 게임 캐릭터 사진 1장 (도트풍이면 더 좋음)
  • "내 캐릭터 이름과 능력 한 줄" 메모해 오기