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

前回はこのようなコードを書きました

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

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

    // 効果を確かめるために、10回 create_entity を呼び出す
    for i in 0..10 {
        create_entity(&mut id, &mut pos_ary);
    }

    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));
}
```

このコードには問題点があります。
pos_aryの要素が必ず(0, 0)になること。

この解決策は２つあります。
１つめは、create_entity関数の引数を増やす
２つめは、エンティティを作った直後にコンポーネントの値を変更する

どちらが有利か今のところわからないので、ふたつとも実装してみます

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

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

    // 効果を確かめるために、10回 create_entity を呼び出す
    for i in 0..10 {
        create_entity(&mut id, &mut pos_ary);
    }



    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;
}

```

新たに関数を書いて、使ってみます。
代入する値はランダムにしてみたいと思います。

ターミナルでcargo add randをしてrandクレートを追加します。

まずは、create_entity_pos関数を使ってみます。

```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_pos(&mut id, &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;
}
```

結果は、このようになりました。
問題なく値がランダムになっています
```terminal
0: (631301613, -1321658491)
1: (1064433629, 714273517)
2: (651317540, 1527130298)
3: (637752836, -1758116208)
4: (1064518213, 286156136)
5: (1338577346, -1317936462)
6: (-488325186, -51452308)
7: (-636916261, 429026785)
8: (-1750250952, -1231776558)
9: (1426910556, -1350481101)
```

次に、set_data関数を使ってみます。

```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,);
        set_data(&id, &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;
}
```

結果は、エラー
```terminal
thread 'main' panicked at 'index out of bounds: the len is 1 but the index is 1', src\main.rs:40:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: process didn't exit successfully: `target\debug\EntitiyCompornentSystem-Rust.exe` (exit code: 101)
```

set_data関数でidを-1していませんでした。
気を取り直して修正します。

```rust:set_data関数
fn set_data (id: &usize, ary: &mut Vec<(i32, i32)>, data: (i32, i32)) {
    ary[*id -1] = data;
}
```

修正したので結果を見てみます
```terminal
0: (-1624067781, 1784680369)
1: (-678787888, -217647087)
2: (-281588722, -77193557)
3: (811644284, 26805558)
4: (1165551360, -253299836)
5: (-1638065505, -465493239)
6: (-1235961454, 2018485865)
7: (654307265, 2093340278)
8: (-966811836, 1103924710)
9: (1149485780, 1684219541)
```

ちゃんとランダムになっていますね
今回はここまでにしようと思います。