ランダムウォーク
提供:kuhalaboWiki
目次 |
ランダムに東西南北の方角に動く虫
クラスの作成
- Bugクラスを作成
- Bug.h Bugクラスの宣言。変数とメソッド(関数)
- Bug.cpp コンストラクター Bug()とメソッドの定義
- 新しくクラスを作るには、「プロジェクト > 新しい項目の追加...」 を開き,「C++ファイル」と「ヘッダーファイル」を作る。
- 名前を それぞれBug.cpp,Bug.hとする。
- 場所はともに ..\src とする。
- (注)「クラスの追加」や「クラスウィザード」は使えない。
- ソリューションエクスプローラー上のsrcの中にBug.cpp と Bug.h が新規作成される。
ソースコード
- Bug.h
#pragma once
#include "ofMain.h"
class Bug {
public:
ofPoint pos;
float radius;
ofColor bcolor;
int dw; // 歩幅
Bug();
void draw();
void update();
};
- Bug.cpp
#include "Bug.h"
Bug::Bug(){
pos = ofPoint(ofGetWidth()/2, ofGetHeight()/2);
radius = ofRandom(10,20);
bcolor = ofColor(ofRandom(0,255), ofRandom(0,255), ofRandom(0,255), 100);
dw= 5;
}
void Bug::update(){
int d = ofRandom(0, 4); //0から3までの乱数を発生
switch(d)
{
case 0: // 東(X軸の正)へ進む
pos.x += dw;
break;
case 1: // 西(X軸の負)へ進む
pos.x -= dw;
break;
case 2: // 南(Y軸の正)へ進む
pos.y += dw;
break;
case 3: // 北(Y軸の負)へ進む
pos.y -= dw;
break;
}
if( pos.x > ofGetWidth() ) pos.x = 0;
if( pos.x < 0 ) pos.x = ofGetWidth();
if( pos.y > ofGetHeight() ) pos.y = 0;
if( pos.y < 0 ) pos.y = ofGetHeight();
}
void Bug::draw(){
ofSetColor(bcolor);
ofCircle(pos.x, pos.y, radius);
}
- ofApp.h
#pragma once
#include "ofMain.h"
#include "Bug.h"
class ofApp : public ofBaseApp{
public:
static const int NUM = 2; //配列の大きさを指定
void setup();
void update();
void draw();
void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
Bug bugs[NUM]; //Ballクラスのインスタンスを配列で指定
};
- ofApp.cpp
#include "ofApp.h"
//--------------------------------------------------------------
void ofApp::setup(){
ofBackground(0, 0, 0); //背景色の設定
ofSetColor(255, 255, 0); //描画色の設定
ofSetBackgroundAuto(false);
ofSetFrameRate(20);
ofEnableAlphaBlending(); //アルファチャンネルを有効にする
ofSetCircleResolution(64);
}
//--------------------------------------------------------------
void ofApp::update(){
for(int i = 0; i < NUM; i++){
balls[i].update();
}
}
//--------------------------------------------------------------
void ofApp::draw(){
//全画面を半透明の黒でフェード
ofSetColor(0, 0, 0, 10);
ofRect(0, 0, ofGetWidth(), ofGetHeight());
for(int i = 0; i < NUM; i++){
balls[i].draw();
}
}
//--------------------------------------------------------------
void ofApp::keyPressed(int key){
}
//--------------------------------------------------------------
void ofApp::keyReleased(int key){
}
- 斜め方向も含めた動き
int d = ofRandom(0, 8); //0から7までの乱数を発生
switch(d)
{
case 0: // 東(X軸の正)へ進む
pos.x += dw;
break;
case 1: // 西(X軸の負)へ進む
pos.x -= dw;
break;
case 2: // 南(Y軸の正)へ進む
pos.y += dw;
break;
case 3: // 北(Y軸の負)へ進む
pos.y -= dw;
break;
case 4: // 北東(X軸の正、Y軸の負)へ進む
pos.x += dw;
pos.y -= dw;
break;
case 5: // 北西(X軸の負、Y軸の負)へ進む
pos.x -= dw;
pos.y -= dw;
break;
case 6: // 南東(X軸の正、Y軸の正)へ進む
pos.x += dw;
pos.y += dw;
break;
case 7: // 南西(X軸の負、Y軸の負)へ進む
pos.x -= dw;
pos.y += dw;
break;
}
- 応用問題
虫の内部状態を設定し、内部状態に応じて動きを変えるプログラムを書いてみよう。