Behind Coleus

大学生なのに特別大学で楽しいことが一 つもない。虐待と男子校病のせいにしてみる。→日本脱出しました 今ジャカルタにいます。→ジャカルタから帰ってきました。→6月19日から小笠原沖で、インドネシア人とメカジキ漁

Bevy Engine環境構築

すばらしい!! はじめ、visual studio redistってやつでインストールしたら、rustがエラーはいてきて、visual studio setupっていうやつを使ってインストールしたら、大丈夫になったんだ。

そして、最初は

これの意味が分からなくて、rustがダウンロードできなかったんだけど(terminalで読み込んでも、エラーが出た。)、このコマンドプロンプトだけではダウンロードはできてなくて、just press enterということで、enterキーを押して初めてダウンできたんだ。

このあとも一回失敗したけど、PC再起動したらできた

取り敢えず、

brogmymxo.hatenablog.com

brogmymxo.hatenablog.com
この二つの 記事をchatGPTに読み込ませました。そしたら、以下のコードが出てきました。


まず、以下の順番で開発を進めるとスムーズに進められます。


ステップ 1: プロジェクトのセットアップ

  1. Rustの開発環境を整える(Rustをインストール済みならOK)
  2. bevy をプロジェクトに追加
    cargo new card_game
    cd card_game
    cargo add bevy
    
  3. bevy_ecs の導入(エンティティ・コンポーネント・システムを活用するため)
    cargo add bevy_ecs
    

ステップ 2: カードの基本構造を作成

  • Card の基本クラスを作成し、FirstEnergyCardFighterCardTacticsCard の3つのサブクラスを定義。
  • カードごとに必要な情報を持たせる。
#[derive(Debug, Clone)]
pub enum CardType {
    FirstEnergy,
    Fighter,
    Tactics,
}

#[derive(Debug, Clone)]
pub struct Card {
    pub name: String,
    pub furigana: String,
    pub card_type: CardType,
    pub flavor_text: String,
    pub pack_info: String,
}

#[derive(Debug, Clone)]
pub struct FirstEnergyCard {
    pub base: Card,
    pub energy: u32,
    pub effect: String,
}

#[derive(Debug, Clone)]
pub struct FighterCard {
    pub base: Card,
    pub power: u32,
    pub class: String,
    pub tags: Vec<String>,
    pub skills: Vec<String>,
    pub effects: Vec<String>,
    pub energy: Vec<u32>,
    pub element: Vec<String>,
}

#[derive(Debug, Clone)]
pub struct TacticsCard {
    pub base: Card,
    pub required_energy: u32,
    pub effects: Vec<String>,
    pub tags: Vec<String>,
    pub energy: Vec<u32>,
    pub element: Vec<String>,
}

ステップ 3: ゾーンの管理

ゲームのゾーン(Sゾーン, Fゾーン, Xゾーン, デッキ, 墓地など)を構造体で表現。

#[derive(Debug)]
pub struct Zone {
    pub name: String,
    pub cards: Vec<Card>, 
}

impl Zone {
    pub fn new(name: &str) -> Self {
        Zone {
            name: name.to_string(),
            cards: Vec::new(),
        }
    }

    pub fn add_card(&mut self, card: Card) {
        self.cards.push(card);
    }

    pub fn remove_card(&mut self, index: usize) -> Option<Card> {
        if index < self.cards.len() {
            Some(self.cards.remove(index))
        } else {
            None
        }
    }
}

ステップ 4: ゲームの進行

ターン制の処理を組み込む。

pub struct Game {
    pub deck: Zone,
    pub hand: Zone,
    pub s_zone: Zone,
    pub f_zone: Zone,
    pub x_zone: Zone,
}

impl Game {
    pub fn new() -> Self {
        Game {
            deck: Zone::new("Deck"),
            hand: Zone::new("Hand"),
            s_zone: Zone::new("S-Zone"),
            f_zone: Zone::new("F-Zone"),
            x_zone: Zone::new("X-Zone"),
        }
    }

    pub fn start_game(&mut self) {
        // ファーストエナジーカードをSゾーンに配置
        if let Some(first_energy_card) = self.deck.cards.iter().find(|c| matches!(c.card_type, CardType::FirstEnergy)) {
            self.s_zone.add_card(first_energy_card.clone());
        }
    }

    pub fn draw_card(&mut self) {
        if let Some(card) = self.deck.remove_card(0) {
            self.hand.add_card(card);
        }
    }

    pub fn play_card(&mut self, index: usize) {
        if let Some(card) = self.hand.remove_card(index) {
            match card.card_type {
                CardType::Fighter => self.f_zone.add_card(card),
                CardType::Tactics => self.x_zone.add_card(card),
                _ => (),
            }
        }
    }
}

ステップ 5: ビジュアルの実装

  • bevy を使ってカードのUIを作成
  • bevy_ecs でエンティティ・コンポーネントを活用

(ここは進捗に応じて追加)


次にやること

  1. 基本的なカードの処理を完成させる
    • FirstEnergyCard の効果発動処理
    • FighterCard の戦闘処理
    • TacticsCard の発動処理
  2. デッキのシャッフル機能
  3. プレイヤーのターン管理
  4. UIの実装(bevyを使ってカードを表示)

Rust + Bevy で進めていくなら、まずはテキストベースでロジックを完成させてから、UIを作るのがスムーズ!

bavy_ecsってうっちゃってだめだった。bevyだよー

chatGPTが無料プランだとすぐ切れちゃって、セクハラチャット用に、サブスクチャット買ってたGPT4-o miniで、もう一回やり直してます。


素晴らしい計画ですね!あなたのカードゲームの構造は非常に詳細で、興味深い要素がたくさんあります。この後、Bevyエンジンを使用してRustで実装を進めるために、以下の機能や要素を追加していくと良いでしょう。

### 1. **ファーストエナジーカードの実装**
   - ゲーム開始前に、ファーストエナジーを裏向きでSゾーンに配置し、ゲーム開始時に表向きにするロジックを追加します。

### 2. **ターン制管理**
   - ターン制のロジックを追加します。ターンプレイヤーを管理し、ターンの開始、終了を管理するメソッドを実装します。
   - `turn_start`, `prepare_phase`, `withdraw_phase`, `x_phase`, `main_phase`, `turn_end`の各フェーズを管理するメソッドを追加します。

### 3. **HPと勝利条件の実装**
   - 各プレイヤーにHPを持たせ、攻撃が行われた際に相手のHPを減少させるロジックを実装します。
   - 勝利条件を確認するメソッドを追加し、ゲームが終了した際に勝者を決定します。

### 4. **撤退処理の追加**
   - 撤退フェーズのロジックを実装し、FゾーンからSゾーンへのファイターの移動を管理するメソッドを追加します。

### 5. **スピン状態の管理**
   - カードのスピン状態とリスピン状態を管理するために、カードに新しい状態を持たせるロジックを追加します。
   - ターンごとにカードの状態を更新する関数を実装します。

### 6. **エナジー管理**
   - Sゾーンのエナジー合計を計算し、10を超えた場合にエナジー調整を行うロジックを追加します。

### 7. **インタラプトカードの実装**
   - 相手ターン中に特定の条件で発動するインタラプトカードの機能を実装します。

### 8. **カード効果の処理**
   - 各カードが持つ効果を処理するためのロジックを追加します。特に、ファイターとタクティクスカードの効果を実装します。

### 9. **ユーザーインターフェースの作成**
   - Bevyエンジンを使用して、ゲームの状態やカード情報を表示するUIを作成します。カードの詳細情報を表示するための機能も実装します。

### 10. **テストとデバッグ**
   - ゲームの各機能が期待通りに動作するかどうかを確認するために、ユニットテストや統合テストを追加します。

これらの機能を実装していくことで、ゲームが徐々に完成に近づいていくでしょう。頑張ってください!もし具体的なコードや実装方法について質問があれば、お気軽に聞いてください。

 

もちろんです!以下に整形したテキストを用意しました。これをブログに貼り付ければ、すっきりとした形式で表示されると思います。

---

## プロジェクト内にJSONファイルを作成する方法

### 1. プロジェクトの構造

プロジェクトの構造は、以下のようにすることができます。

```
your_project/
├── src/
│   ├── main.rs
│   └── ...
├── assets/
│   ├── cards.json
│   └── images/
│       ├── image1.png
│       ├── image2.png
│       └── ...
└── Cargo.toml
```

### 2. ファイルの配置

- **`src/`フォルダ**: Rustのソースコードが入っている場所。
- **`assets/`フォルダ**: ゲームで使用するアセット(画像、JSONファイルなど)を置く場所。`cards.json`をここに配置します。
- **`images/`フォルダ**: カードの画像ファイルを保存するためのサブフォルダ。

### 3. JSONファイルへのアクセス

Rustプログラム内からJSONファイルにアクセスするには、相対パスを使ってファイルを読み込むことができます。例えば、`assets/cards.json`というパスを指定してファイルを読み込むことになります。

以下は、JSONファイルを読み込む簡単な例です。

```rust
use std::fs;
use serde::{Deserialize};

#[derive(Debug, Deserialize)]
struct CardData { 
    name: String,
    furigana: String,
    // 他のフィールドもここに追加...
}

fn main() {
    // JSONファイルの読み込み
    let file_path = "assets/cards.json";
    let data = fs::read_to_string(file_path).expect("Unable to read file");
    
    // JSONデータをパースする(serde_jsonクレートが必要)
    let card_list: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse JSON");
    
    // カード情報の表示などの処理を書く
    println!("{:?}", card_list);
}
```

### 4. 注意点

- JSONファイルを読み込むためには、`serde`および`serde_json`クレートをCargo.tomlに追加する必要があります。それにより、RustプログラムからJSONを扱いやすくなります。

```toml
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
```

### 結論

プロジェクト内にJSONファイルを作成することは非常に合理的な方法です。アセットや設定ファイルを一元管理できるため、後々のメンテナンスや拡張に役立ちます。何か他に質問があれば、お知らせください!

---

この形式であれば、ブログに貼り付けても見やすく整理された内容になると思います。何か他に手伝ってほしいことがあれば教えてください!