私が作ったゲームエンジンで初めてのゲームをリリース

## はじめに
広大で進化し続けるゲーム開発の世界において、カスタムゲームエンジン「Goku」を使用したローグライクゲームの制作は、ゲームデザインとソフトウェア開発の両方にユニークな視点を提供します。この記事では、ローグライクゲームの開発に伴う技術的な複雑さと創造的な決定に焦点を当て、主要な特徴、課題、およびコードベースについて詳しく掘り下げます。

## ゲーム概要
このゲームは、ランダム生成されるローグライクの冒険で、プレイヤーはダンジョンを探索し、敵と戦い、すべての困難に立ち向かいます。ゲームは、上から見下ろす視点とタイルベースのグラフィックスを特徴とし、モダンなひねりを加えたクラシックなローグライク体験を提供します。

### 主要な特徴:
- **ランダム生成ダンジョン**: 各プレイスルーは新しいレイアウトを提供し、リプレイ性を高めます。
- **ダイナミックライティング**: 点光源を使用した雰囲気効果。
- **敵AI**: 敵はランダムに生成され、プレイヤーを追いかけることで、挑戦的な体験を生み出します。
- **無限のレベル**: 終わりなき探索と進行。
- **戦闘メカニクス**: プレイヤーは敵に攻撃でき、ゲームプレイに戦略的な層を追加します。
- **健康システム**: プレイヤーの生命力を追跡するためのシンプルなヘルスバー。
- **オーディオ効果**: 背景音楽とサウンドエフェクト。
- **ミニマップ**: ダンジョンのレイアウトを小規模に表現。

## 技術的洞察とアルゴリズム
ゲームのソースコードはRustで構築され、安全性とパフォーマンスを提供します。主要なコンポーネントには敵AI、衝突検出、レベル生成、プレイヤーのコントロールなどが含まれます。コードは、カスタムGokuエンジンでのゲームループ、イベント処理、レンダリング技術の効率的な使用を示しています。

### コードのハイライト:
- **敵AIと動き**: 敵はプレイヤーを追跡し、衝突を避けるようプログラムされており、ゲームにダイナミックな挑戦を追加します。
- **レベル生成**: 各レベルは壁、敵、進行のためのはしごとともにランダムに生成されます。
- **プレイヤーコントロール**: プレイヤーは移動のために矢印キーを、攻撃のためにスペースを使用する、シンプルで効果的なコントロール

スキームです。
- **グラフィックスとレンダリング**: ゲームはSDL2を使用してレンダリングし、テクスチャ、アニメーション、ゲームのUIコンポーネントを処理します。

### 敵AIの動き
敵AIの動きのアルゴリズムは、敵がプレイヤーに向かって賢くナビゲートし、その速度を考慮し、衝突を避けるように設計されています：

```rust
if player_moved {
    if last_move.elapsed() >= core::time::Duration::from_millis((1000 / speed) as u64) {
        direction.0 = if player_pos.0 < enemy_pos.0 { -1 } else if player_pos.0 > enemy_pos.0 { 1 } else { 0 };
        direction.1 = if player_pos.1 < enemy_pos.1 { -1 } else if player_pos.1 > enemy_pos.1 { 1 } else { 0 };

        *last_move = std::time::Instant::now();
    }
}
```

### 衝突検出
衝突検出は、ゲームプレイの整合性を維持するために不可欠です。このゲームでは、他の敵とプレイヤーとの潜在的な衝突をチェックします：

```rust
enemies.iter().any(|enemy| {
    let enemy_grid_position = ((enemy.position.x / TILE_SIZE) as usize, (enemy.position.y / TILE_SIZE) as usize);
    new_position == enemy_grid_position
})
```

### 手続き型レベル生成
レベルの手続き型生成により、各ゲーム体験はユニークになります。このアルゴリズムは、壁、障害物、スポーンポイントをランダムに配置します：

```rust
let mut grid = vec![vec![0; width]; height];
// 周囲の壁とランダムな内部の壁を設定
for x in 0..width {
    grid[0][x] = 2; grid[height-1][x] = 2;
}
for y in 0..height {
    grid[y][0] = 2; grid[y][width-1] = 2;
    for x in 1..(width - 1) {
        if (x, y) != player_pos && (x, y) != door_pos {
            grid[y][x] = if rng.gen_bool(0.2) { 2 } else { 0 };
        }
    }
}
```

### ミニマップのレンダリング
ミニマップはナビゲーションにとって重要な機能です。これは、メインマップを縮小して表示し、プレイヤーや敵の位置などの主要な要素を表示します：

```rust
let tile_size = (TILE_SIZE as f32 * MINIMAP_SCALE) as u32;
for (y, row) in tile_map.tile_map.iter().enumerate() {
    for (x, &tile) in row.iter().enumerate() {
        let tile_rect = sdl2::rect::Rect::new(minimap_rect.x() + x as i32 * tile_size, minimap_rect.y() + y as i32 * tile_size, tile_size, tile_size);
        canvas.set_draw_color(match tile { 2 => wall_color, _ => floor_color });
        canvas.fill_rect(tile_rect)?;
    }
}
```

### メインゲームループ
メインゲームループは、イベントの処理、ゲーム状態の更新、レンダリングの管理を行います。これはゲーム機能の核心であり、スムーズなゲームプレイを確実にします：

```rust
'mainloop: loop {
    match game_state {
        GameState::Menu => { /* メニューのイベントとレンダリングを処理 */ },
        GameState::Playing => {
            handle_input(&mut input_handler);
            update_game_state(&mut enemies, &mut player, &tile_map);
            render_scene(&mut window.canvas, &tile_map, &player, &enemies, &camera);
        },
    }
    window.canvas.present();
}
```

## Gokuゲームエンジンの主要なアップデート

### 1. コアファイルのモジュール化
以前、Gokuエンジンの機能は単一の大きなファイル `two_d.rs` にカプセル化されていました。バージョン0.1.2では、このファイルが `game_object.rs`、`particle_system.rs` など、複数の小さなサブファイルに分割されています。このモジュール化にはいくつかの利点があります：
- **メンテナンスの容易さ**：小さく、明確に定義されたファイルは、管理やデバッグが容易です。
- **コードの整理の改善**：モジュラーなアプローチにより、エンジンの構造が直感的になり、迅速な拡張や機能追加が可能になります。
- **コラボレーションの向上**：独立したコンポーネントにより、複数の開発者が同時にエンジンの異なる部分で衝突なく作業できます。

### 2. AudioPlayerのバグ修正と機能強化
新しいバージョンでは、`AudioPlayer` モジュールの重要なバグが対処されています：
- **バグの説明**：以前のバージョンでは、オーディオファイルのキャッチと正確な再生に問題があり、ゲーム開発におけるオーディオ処理の一般的な課題でした。
- **解決策**：バグが修正され、信頼性の高いオーディオ再生が保証されます。修正された機能を示す例が追加され、ユーザーがゲームに効果的にオーディオを実装する方法をガイドします。

### 3. READMEファイルの更新
GokuエンジンのREADMEファイルがこれらの変更を反映するよう更新されました。これには以下が含まれます：
- **変更された例**：新機能とバグ修正を示す例は、ユーザーにエンジンの能力について実践的な理解を提供します。
- **ドキュメントの強化**：より明確で包括的な情報により、新しいユーザーが始めやすく、経験豊富なユーザーが変更に適応できるようになります。

### 4. GUIの開発と分離
Gokuの一般ユーザーインターフェース（GUI）の開発において、重要な進展がありました：
- **別のGUIフォルダ**：GUIコンポーネントは専用のフォルダに配置され、エン

ジンの構造が整理されています。
- **進行中の開発**：GUIモジュールはまだ開発中で、ユーザー体験の向上とさらなる機能の統合に焦点を当てています。

## ウェブサイトと言語サポートの更新
Gokuエンジンの公式ウェブサイトが更新され、日本語を含む他の言語に完全に対応しています。ただし、ニュースの更新は現在日本語でのみ利用可能であることに注意が必要です。

## 将来の計画とコラボレーションへの招待

### 「Whispering Depths」のクロスプラットフォームサポート
「Whispering Depths」をMac OSやWASMなど他のプラットフォームに拡張する計画が進行中です。しかし、特にEmscriptenを使用したWASM統合において課題が発生しています。この分野に関する専門知識や知識が非常に役立つため、協力を歓迎します。

### コミュニティへの参加のお誘い
「Whispering Depths」やGokuエンジンについての貢献、議論、または学びに興味がある方は、私たちの[Discord](https://discord.gg/9TAMqdRyED)に参加し、[Gokuエンジンのウェブサイト](https://gokuengine.com/)を訪れてください。私たちのGitHubは[Goku](https://github.com/ladroid/goku)です。

## 結論
Gokuのようなカスタムエンジンでローグライクゲームを作ることは、独自の課題と学びの機会を提供します。これには、ゲームメカニクス、AI、レベルデザイン、プログラミングの深い理解が必要です。このプロジェクトは、技術的な能力だけでなく、創造的な問題解決能力やゲームデザインスキルを示しています。

---

このゲームは、エンゲージメントと挑戦を提供し、独立したゲーム開発におけるカスタムゲームエンジンの可能性を示しています。技術的な側面に興味がある方や開発への貢献を考えている方は、ソースコードを利用できます。

_今すぐ「Whispering Depths」を[itch.io](https://ladroid.itch.io/whispering-depths)でプレイし、果てしないダンジョンと冒険の世界に飛び込んでください。_