プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Processing、丸が画面上を適当に動き回るやつ
気分転換に作ってみました。
画面上を丸が、うろちょろ動くだけのものです。

ということで、実際のコードは、こんな感じφ(--)

int DIAMETER = 100;    //円の直径
int positionX;    //円の位置ー横
int positionY;    //円の位置ー縦

int MIN_MOVE = -5;    //移動距離ー最小
int MAX_MOVE = 5;     //移動距離ー最大
int moveX;            //移動距離ー横
int moveY;            //移動距離ー縦

int MAX_COUNTER = 200;    //どれだけ同じ方向に動くかの調整用カウンタ
int counter;    //どれだけ同じ方向に動くかの調整用カウンタ

void setup(){
        size(500,500);
        background(255);
        
        //初期値設定
        positionX = 50;        //円の位置ー横
        positionY = 100;    //円の位置ー縦
        moveX = 1;                //移動距離ー横
        moveY = 1;                //移動距離ー縦
        counter = 0;            //どれだけ同じ方向に動くかの調整用カウンタ
}

void draw(){
    background(255);

    //移動方向・距離を決める
    if(counter < MAX_COUNTER){    //MAXになっていないときは何もしない
        counter++;
    }else{                                    //MAXのときは移動方向・距離変更
        counter = 0;
        moveX = int(random(MIN_MOVE, MAX_MOVE));
        moveY = int(random(MIN_MOVE, MAX_MOVE));
    }

    //丸の横位置決定
    positionX = positionX + moveX;    //移動後の横位置決定
    if(positionX < 0){    //左に突き抜けたら移動方向を反転
        positionX = 0;
        moveX = moveX * -1;
    }
    if(positionX > width){    //右に突き抜けたら移動方向を反転
        positionX = width;
        moveX = moveX * -1;
    }

    //丸の縦位置決定
    positionY = positionY + moveY;    //移動後の縦位置決定
    if(positionY < 0){    //上に突き抜けたら移動方向を反転
        positionY = 0;
        moveY = moveY * -1;
    }
    if(positionY > height){    //下に突き抜けたら移動方向を反転
        positionY = height;
        moveY = moveY * -1;
    }
    
    //丸を描く
    ellipse(positionX,positionY,DIAMETER,DIAMETER);
    
    //デバッグ用:テキスト表示
    fill(0);
    text(counter + ":" + moveX + ":" + moveY, positionX, positionY);
    noFill();
}

少しだけ工夫した点は

1.一定時間が経過する毎に移動する方向と距離(速度)が変わる
2.画面の端に行ったら跳ね返る

でしょうかね。
ランダムはランダムですが、そのランダムさを少しだけ制御しています。

該当の処理は

    //移動方向・距離を決める
    if(counter < MAX_COUNTER){    //MAXになっていないときは何もしない
        counter++;
    }else{                                    //MAXのときは移動方向・距離変更
        counter = 0;
        moveX = int(random(MIN_MOVE, MAX_MOVE));
        moveY = int(random(MIN_MOVE, MAX_MOVE));
    }

    //丸の横位置決定
    positionX = positionX + moveX;    //移動後の横位置決定
    if(positionX < 0){    //左に突き抜けたら移動方向を反転
        positionX = 0;
        moveX = moveX * -1;
    }
    if(positionX > width){    //右に突き抜けたら移動方向を反転
        positionX = width;
        moveX = moveX * -1;
    }

    //丸の縦位置決定
    positionY = positionY + moveY;    //移動後の縦位置決定
    if(positionY < 0){    //上に突き抜けたら移動方向を反転
        positionY = 0;
        moveY = moveY * -1;
    }
    if(positionY > height){    //下に突き抜けたら移動方向を反転
        positionY = height;
        moveY = moveY * -1;
    }

の部分です。

counterがMAX_COUNTERに達したときだけ移動量(moveX、moveY)を変更しています。
MAX_COUNTERの値を変えることで、移動量を変更するタイミングを変更できます。

跳ね返りは、単純に現在地と画面の大きさ(width、heightで取得)を比較して、
突き抜けていたら方向転換(moveX、moveY × -1)しているだけです。

画面の幅は、最初から用意されている変数「width」に入っています。
画面の高さは、最初から用意されている変数「height」に入っています。
画面の大きさの判定は、その変数を使っています。

スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:Processing  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事