ランダムウォーク
提供:kuhalaboWiki
(版間での差分)
(1人の利用者による、間の12版が非表示) | |||
1行: | 1行: | ||
− | = | + | == openFrameworksのサンプル == |
+ | |||
+ | |||
+ | ランダムに東西南北の方角に動く虫 | ||
+ | |||
=== クラスの作成 === | === クラスの作成 === | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == ソースコード == | + | *Bugクラスを作成 |
− | ; | + | ** Bug.h Bugクラスの宣言。変数とメソッド(関数) |
+ | ** Bug.cpp コンストラクター Bug()とメソッドの定義 | ||
+ | |||
+ | # 新しくクラスを作るには、'''「プロジェクト > 新しい項目の追加...」''' を開き,'''「C++ファイル」'''と'''「ヘッダーファイル」'''を作る。 | ||
+ | #* 名前を それぞれ'''Bug.cpp''','''Bug.h'''とする。 | ||
+ | #* 場所はともに '''..\src''' とする。 | ||
+ | #* (注)「クラスの追加」や「クラスウィザード」は使えない。 | ||
+ | # ソリューションエクスプローラー上の'''src'''の中に'''Bug.cpp''' と '''Bug.h''' が新規作成される。 | ||
+ | |||
+ | === ソースコード === | ||
+ | ;Bug.h | ||
<pre> | <pre> | ||
#pragma once | #pragma once | ||
#include "ofMain.h" | #include "ofMain.h" | ||
− | class | + | class Bug { |
public: | public: | ||
ofPoint pos; | ofPoint pos; | ||
22行: | 29行: | ||
int dw; // 歩幅 | int dw; // 歩幅 | ||
− | + | Bug(); | |
void draw(); | void draw(); | ||
void update(); | void update(); | ||
28行: | 35行: | ||
</pre> | </pre> | ||
− | ; | + | ;Bug.cpp |
<pre> | <pre> | ||
− | #include " | + | #include "Bug.h" |
− | + | Bug::Bug(){ | |
pos = ofPoint(ofGetWidth()/2, ofGetHeight()/2); | pos = ofPoint(ofGetWidth()/2, ofGetHeight()/2); | ||
radius = ofRandom(10,20); | radius = ofRandom(10,20); | ||
40行: | 47行: | ||
} | } | ||
− | void | + | void Bug::update(){ |
int d = ofRandom(0, 4); //0から3までの乱数を発生 | int d = ofRandom(0, 4); //0から3までの乱数を発生 | ||
switch(d) | switch(d) | ||
64行: | 71行: | ||
} | } | ||
− | void | + | void Bug::draw(){ |
ofSetColor(bcolor); | ofSetColor(bcolor); | ||
ofCircle(pos.x, pos.y, radius); | ofCircle(pos.x, pos.y, radius); | ||
75行: | 82行: | ||
#include "ofMain.h" | #include "ofMain.h" | ||
− | #include " | + | #include "Bug.h" |
class ofApp : public ofBaseApp{ | class ofApp : public ofBaseApp{ | ||
95行: | 102行: | ||
void gotMessage(ofMessage msg); | void gotMessage(ofMessage msg); | ||
− | + | Bug bugs[NUM]; //Ballクラスのインスタンスを配列で指定 | |
}; | }; | ||
</pre> | </pre> | ||
116行: | 123行: | ||
void ofApp::update(){ | void ofApp::update(){ | ||
for(int i = 0; i < NUM; i++){ | for(int i = 0; i < NUM; i++){ | ||
− | + | bugs[i].update(); | |
} | } | ||
} | } | ||
128行: | 135行: | ||
for(int i = 0; i < NUM; i++){ | for(int i = 0; i < NUM; i++){ | ||
− | + | bugs[i].draw(); | |
} | } | ||
} | } | ||
142行: | 149行: | ||
} | } | ||
</pre> | </pre> | ||
+ | |||
+ | ;斜め方向も含めた動き | ||
+ | <pre> | ||
+ | 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; | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | === 内部状態 === | ||
+ | ;応用問題 | ||
+ | |||
+ | 虫の内部状態を設定し、内部状態に応じて動きを変えるプログラムを書いてみよう。 | ||
== 参考 == | == 参考 == |
2020年10月31日 (土) 00:24時点における最新版
目次 |
[編集] openFrameworksのサンプル
ランダムに東西南北の方角に動く虫
[編集] クラスの作成
- 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++){ bugs[i].update(); } } //-------------------------------------------------------------- void ofApp::draw(){ //全画面を半透明の黒でフェード ofSetColor(0, 0, 0, 10); ofRect(0, 0, ofGetWidth(), ofGetHeight()); for(int i = 0; i < NUM; i++){ bugs[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; }
[編集] 内部状態
- 応用問題
虫の内部状態を設定し、内部状態に応じて動きを変えるプログラムを書いてみよう。