ゼロからEntityComponentSystemを書いてみる 4

前回、こんなコードを書きました

```rust:main.rs
use rand;

fn main() {
    
    // idは配列の要素数を表す
    let mut id = 0;

    // 配列をやめて、ベクタで宣言する
    let mut pos_ary: Vec<(i32, i32)> = vec![];

    // 効果を確かめるために、10回 create_entity を呼び出す
    for i in 0..10 {
        // ランダムな値を取得する
        let (x, y) = rand::random();
        create_entity(&mut id, &mut pos_ary,);
        let t = id -1;
        set_data(&t, &mut pos_ary, (x, y));
    }



    for i in 0..id  {
        println!("{}: {:?}", i, pos_ary[i])
    }
}

// idを増やして、配列に要素を追加する
fn create_entity(id: &mut usize, ary: &mut Vec<(i32, i32)>){
    *id += 1;
    ary.push((0, 0));
}

// idを増やして、配列に指定された値の要素を追加する
fn create_entity_pos(id: &mut usize, ary: &mut Vec<(i32, i32)>, data: (i32, i32)) {
    *id += 1;
    ary.push(data);
}

// 配列の指定されたidの要素に、指定された値を代入する
fn set_data (id: &usize, ary: &mut Vec<(i32, i32)>, data: (i32, i32)) {
    ary[*id] = data;
}
```

このコードには、課題があります。
それは、
コンポーネントに構造体を使っていないこと
コンポーネントが１種類しかないこと

この２つが今のところ思いつく課題です。
おさらいですが、コンポーネントとは変数で、このコードにおいてはベクタの各要素のことを言います。

ひとまず、コンポーネントを構造体として宣言したいと思います。

```rust:main.rs
struct Position {
    x: i32,
    y: i32,
}
```

そして、ベクタの要素の型を変更します。

```rust:main.rs
// Position構造体のベクタ
let mut pos_ary: Vec<Position> = vec![];
```

さらに、関数の引数の型を変更します。
```rust:main.rs
// idを増やして、配列に要素を追加する
fn create_entity(id: &mut usize, ary: &mut Vec<Position>){
    *id += 1;
    ary.push((0, 0));
}

// idを増やして、配列に指定された値の要素を追加する
fn create_entity_pos(id: &mut usize, ary: &mut Vec<Position>, data: Position) {
    *id += 1;
    ary.push(Position { x: 0, y: 0 });
}

// 配列の指定されたidの要素に、指定された値を代入する
fn set_data (id: &usize, ary: &mut Vec<Position>, data: Position) {
    ary[*id] = data;
}
```

それに伴って、呼び出し元の引数の型も変更します。
```rust:main.rs
    for i in 0..10 {
        // ランダムな値を取得する
        let (x, y) = rand::random();
        create_entity(&mut id, &mut pos_ary,);
        let t = id -1;
        set_data(&t, &mut pos_ary,Position{ x, y });
    }
```

おっと、Postion構造体にDebugトレイトを導出する注釈をつけるのを忘れていました。
```rust:main.rs
#[derive(Debug)]
struct Position {
    x: i32,
    y: i32,
}
```

これで動くか確認してみます
Cargo runをしてみましょう

```terminal
0: Position { x: 253010460, y: 1647529502 }
1: Position { x: -1855768632, y: -310070913 }
2: Position { x: -1184919839, y: 275218234 }
3: Position { x: 813619422, y: -1874309672 }
4: Position { x: -1033269152, y: 765376488 }
5: Position { x: -1789425102, y: -1191237685 }
6: Position { x: 195321910, y: 1891753740 }
7: Position { x: -1316809000, y: 2088883475 }
8: Position { x: -839467135, y: -1777315675 }
9: Position { x: 1877112859, y: -980626680 }
```

はい。きちんと構造体の名前もフィールドの名前も出力されました。

コンポーネントを構造体にするのは完成です。
構造体にしたおかげで、コンポーネントに名前を付けることができ、意味が明確になりました。

今回は、ここまでにします。
次回は、コンポーネントの種類を増やしたいと思います。

最後に、コードの全体を記載して終わります。
```rust:main.rs
use rand;

#[derive(Debug)]
struct Position {
    x: i32,
    y: i32,
}

fn main() {
    
    // idは配列の要素数を表す
    let mut id = 0;

    // 配列をやめて、ベクタで宣言する
    // Position構造体のベクタ
    let mut pos_ary: Vec<Position> = vec![];

    // 効果を確かめるために、10回 create_entity を呼び出す
    for i in 0..10 {
        // ランダムな値を取得する
        let (x, y) = rand::random();
        create_entity(&mut id, &mut pos_ary,);
        let t = id -1;
        set_data(&t, &mut pos_ary,Position{ x, y });
    }



    for i in 0..id  {
        println!("{}: {:?}", i, pos_ary[i])
    }
}

// idを増やして、配列に要素を追加する
fn create_entity(id: &mut usize, ary: &mut Vec<Position>){
    *id += 1;
    ary.push(Position { x: 0, y: 0 });
}

// idを増やして、配列に指定された値の要素を追加する
fn create_entity_pos(id: &mut usize, ary: &mut Vec<Position>, data: Position) {
    *id += 1;
    ary.push(data);
}

// 配列の指定されたidの要素に、指定された値を代入する
fn set_data (id: &usize, ary: &mut Vec<Position>, data: Position) {
    ary[*id] = data;
}
```