Boid - SoraMame Script
公式Web
Samples
うごかす
とめる
わける
へんかん
//ボイド:生き物の群れのように動き回るボール @最大速度は実数型 = 5 @半径は実数型 = 10 @ボイド数は整数型 = 10 @ボイドはボイド型[] = 新しいボイド型[@ボイド数] @p1は実数型 = 0.8 // パラメータ:群れの中心に向かう度合 @p2は実数型 = 5 // パラメータ:仲間を避ける度合 @p3は実数型 = 0.1 // パラメータ:群れの平均速度に合わせる度合 @求心力は整数型 = 100 @距離境界は整数型 = 30 ---初期設定する{ {幅:300, 高さ:300}のサイズ {ミリ秒:20}のコマ数 塗りつぶしなし {幅:2}の輪郭幅 {色:255}の輪郭色 @間隔は実数型 = @幅 / @ボイド数 {開始:@iは整数型 = 0, 条件:@i < @ボイド数, 変化:@i+=1}のくりかえし{ @開始位置xは実数型 = @i * @間隔 @開始位置yは実数型 = @高さ / 2 @ボイド[@i] = 新しく{ 開始位置x:@開始位置x, 開始位置y:@開始位置y}に {初期速度x:{下限:-@最大速度,上限:@最大速度}の乱数, 初期速度y:{下限:-@最大速度,上限:@最大速度}の乱数, 識別番号:@i, 他群:@ボイド} のボイド型 } } ---くり返し描画する{ {色:0}の背景色 {開始:@iは整数型 = 0, 条件:@i < @ボイド数, 変化:@i+=1}のくりかえし{ @ボイド[@i]、ベクトル初期化 } {開始:@iは整数型 = 0, 条件:@i < @ボイド数, 変化:@i+=1}のくりかえし{ @ボイド[@i]、判定する @ボイド[@i]、移動する @ボイド[@i]、描く } } ===ボイド型{ @位置xは実数型 //ボールの現在位置(中心) @位置yは実数型 //ボールの現在位置(中心) @速度xは実数型 //ボールの移動量 @速度yは実数型 //ボールの移動量 @v1はPベクトル型 = 新しいPベクトル型 //移動量:群れの中心に向かう @v2はPベクトル型 = 新しいPベクトル型 //移動量:仲間を避ける @v3はPベクトル型 = 新しいPベクトル型 //移動量:群れの平均速度に合わせる @識別番号は整数型 //ボイドの識別番号 @他ボイド群はボイド型[] //コンストラクタ +++{位置:@_xは実数型, 位置:@_yは実数型}に {速度:@_vxは実数型, 速度:@_vyは実数型, 番号:@_idは整数型, 他:@_othersはボイド型}の ボイド型{ @位置x = @_x @位置y = @_y @速度x = @_vx @速度y = @_vy @識別番号 = @_id @他ボイド群 = @_others } ---移動する{ @速度x += @p1 * @v1の@x + @p2 * @v2の@x + @p3 * @v3の@x @速度y += @p1 * @v1の@y + @p2 * @v2の@y + @p3 * @v3の@y //移動量が限度を超えてないか @vVectorは実数型 = {計算:@速度x * @速度x + @速度y * @速度y}のルート もし {条件:@vVector > @最大速度} ならば { @速度x = (@速度x / @vVector) * @最大速度 @速度y = (@速度y / @vVector) * @最大速度 } //現在位置に移動量を加える @位置x += @速度x @位置y += @速度y //位置が境界を越えていないか もし{条件:@位置x - @半径 <= 0} ならば{ @位置x = @半径 @速度x *= -1 } もし{条件:@位置x + @半径 >= @幅} ならば{ @位置x = @幅 - @半径 @速度x *= -1 } もし{条件:@位置y - @半径 <= 0} ならば{ @位置y = @半径 @速度y *= -1 } もし{条件:@位置y + @半径 >= @高さ} ならば{ @位置y = @高さ - @半径 @速度y *= -1 } } ---描く { {位置:@位置x, 位置:@位置y}に{幅:@半径*2,高さ:@半径*2}のマル {始点X:@位置x, 始点y:@位置y}と{終点X:@位置x+@速度x*3, 終点y:@位置y+@速度y*3}にセン } //移動距離オブジェクトを初期化 ---ベクトル初期化 { @v1の@x = 0 @v1の@y = 0 @v2の@x = 0 @v2の@y = 0 @v3の@x = 0 @v3の@y = 0 } ---判定する { ルール1_計算する ルール2_計算する ルール3_計算する } // 計算:群れの中心に向かう量 ---ルール1_計算する { {開始:@iは整数型 = 0, 条件:@i < @ボイド数, 変化:@i+=1}のくりかえし{ もし{条件:@これ != @他ボイド群[@i]}ならば{ @v1の@x += @他ボイド群[@i]の@位置x @v1の@y += @他ボイド群[@i]の@位置y } } @v1の@x /= @ボイド数 - 1 //平均 @v1の@y /= @ボイド数 - 1 //平均 @v1の@x = (@v1の@x - @位置x) / @求心力 @v1の@y = (@v1の@y - @位置y) / @求心力 } // 計算:仲間を避ける量 ---ルール2_計算する{ {開始:@iは整数型 = 0, 条件:@i < @ボイド数, 変化:@i+=1}のくりかえし{ もし{条件:@これ != @他ボイド群[@i]}ならば{ もし{条件:{始点x:@位置x, 始点y:@位置y}と{終点x:@他ボイド群[@i]の@位置x, 終点y:@他ボイド群[@i]の@位置y}の距離 < @距離境界} ならば{ @v2の@x -= @他ボイド群[@i]の@位置x - @位置x @v2の@y -= @他ボイド群[@i]の@位置y - @位置y } } } } // 計算:群れの平均速度に合わせる量 ---ルール3_計算する { {開始:@iは整数型 = 0, 条件:@i < @ボイド数, 変化:@i+=1}のくりかえし{ もし{条件:@これ != @他ボイド群[@i]}ならば{ @v3の@x += @他ボイド群[@i]の@速度x @v3の@y += @他ボイド群[@i]の@速度y } } @v3の@x /= (@ボイド数 - 1) //平均 @v3の@y /= (@ボイド数 - 1) //平均 @v3の@x = (@v3の@x - @速度x)/2 @v3の@y = (@v3の@y - @速度y)/2 } }
変換コード