0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MYJLabAdvent Calendar 2024

Day 15

TikTokでよく見る「ドレミファソラシドゲーム」をつくろう

Posted at

はじめに

こんにちは!MYJLab Advent Calendar 2024、15日目の担当する3年の嶋岡です。

この記事では、TikTokでよく見る「ドレミファソラシドゲーム」を実際に作ってみます!

ドレミファソラシドゲームは、音声入力を利用してボールを操作し、指定された音程に合わせて障害物をクリアしていくというものです。

見たことがないって人は、「TikTok ドレミファソラシドゲーム」で調べてみてください!

音声認識は、松田さんも紹介していたLibrosaというPythonのライブラリを使用します!


🎮 ゲームの概要

このゲームでは、音声の高さ(ピッチ)を利用してボールの高さを制御します。画面右側から流れてくる壁には音符に対応した穴が空いており、プレイヤーは正しい音を出してボールを穴に通過させる必要があります。

ゲームの要素は以下の通りです:

  • 音符: ドレミファソラシド(C3〜C4)
  • : 音符に対応した穴が空いています
  • ボール: プレイヤーが操作するオレンジ色の球体
  • クリア条件: 全ての壁を正しい音符で通過する

🛠️ 使用技術

  • Python: メインのプログラミング言語
  • Pygame: ゲームの描画と基本的なイベント処理
  • SoundDevice: 音声入力の処理
  • Librosa: 音声のピッチ解析

📝 ゲームのコード構成

以下にゲームの主要な機能を簡単に解説します。

1. 音声入力とピッチ検出

ここではSoundDviceライブラリで音声を受け取り、Librosaでピッチ解析を行っています。

def process_audio(indata, frames, time, status):
    global ball_y, is_audio_active
    energy = np.sum(indata[:, 0] ** 2) / len(indata)
    is_audio_active = energy > ENERGY_THRESHOLD 

    if is_audio_active:
        note = get_pitch(indata[:, 0], SAMPLING_RATE)
        if note and note in NOTE_POSITIONS:
            ball_y = NOTE_POSITIONS[note]

2. 壁の生成と移動

壁を管理するコードです。壁はリストで管理され、ゲームループ内で移動と描画を行います。

walls = [{"x": SCREEN_WIDTH, "note": wall_order[0], "speed": -3, "bounced": False, "bounce_timer": 0, "cleared": False}]

for wall in walls:
    wall["x"] += wall["speed"]
    pygame.draw.rect(screen, BLACK, (wall["x"], 0, 50, SCREEN_HEIGHT))
    hole_y = NOTE_POSITIONS[wall["note"]]
    pygame.draw.rect(screen, WHITE, (wall["x"], hole_y - 25, 50, 50))

3. 衝突判定

ボールが壁の穴を通過したかどうかを判定します。

if not wall["cleared"] and wall["x"] < ball_x + ball_radius < wall["x"] + 50:
    if not (hole_y - 25 < ball_y < hole_y + 25):
        wall["speed"] = 5  
    else:
        wall["cleared"] = True  

4. クリア画面とランキング

クリアした際の画面とランキングの保存機能です。

def show_clear_screen(elapsed_time):
    ranking.append(elapsed_time)
    save_ranking(ranking)
    font = pygame.font.Font(None, 72)
    text = font.render("Game Cleared!", True, WHITE)
    screen.blit(text, (SCREEN_WIDTH // 2 - 200, SCREEN_HEIGHT // 2 - 100))

🎨 ゲーム画面

以下は、実際のゲームプレイ画面です。
image.png


🚀 動作デモ

ゲームのデモ動画をYoutubeにアップしたので、ぜひ見てください!

https://www.youtube.com/shorts/FjC6vjQ4Ajo
↑デモ動画


🏁 最後に

この記事を通じて、音声入力を活用したゲームの可能性に興味を持っていただければ幸いです。もしこのプロジェクトを試してみたい方がいれば、ぜひコードを改良してオリジナルのゲームを作ってみてください!

ソースコードは以下に公開しています:
https://github.com/shokkun47/Do-Re-Mi-Fa-So-La-Si-Do-Game

それでは、楽しいゲーム開発ライフを!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?