ランダムウォーク

提供:kuhalaboWiki
(版間での差分)
移動: 案内, 検索
 
(1人の利用者による、間の16版が非表示)
1行: 1行:
;ランダムに東西南北の方角に歩くアリ
+
== openFrameworksのサンプル ==
  
;Ball.h
+
 
 +
ランダムに東西南北の方角に動く虫
 +
 
 +
=== クラスの作成 ===
 +
 
 +
*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 Ball {
+
class Bug {
 
public:
 
public:
 
ofPoint pos;
 
ofPoint pos;
13行: 29行:
 
int dw;  // 歩幅
 
int dw;  // 歩幅
  
Ball();
+
Bug();
 
void draw();
 
void draw();
 
void update();
 
void update();
19行: 35行:
 
</pre>
 
</pre>
  
;Ball.cpp
+
;Bug.cpp
 
<pre>
 
<pre>
#include "Ball.h"
+
#include "Bug.h"
  
Ball::Ball(){
+
Bug::Bug(){
 
pos = ofPoint(ofGetWidth()/2, ofGetHeight()/2);
 
pos = ofPoint(ofGetWidth()/2, ofGetHeight()/2);
 
radius = ofRandom(10,20);
 
radius = ofRandom(10,20);
 
bcolor = ofColor(ofRandom(0,255), ofRandom(0,255), ofRandom(0,255), 100);
 
bcolor = ofColor(ofRandom(0,255), ofRandom(0,255), ofRandom(0,255), 100);
  
dw= 20;
+
dw= 5;
 
}
 
}
  
void Ball::update(){
+
void Bug::update(){
 
int d = ofRandom(0, 4); //0から3までの乱数を発生
 
int d = ofRandom(0, 4); //0から3までの乱数を発生
 
switch(d)
 
switch(d)
55行: 71行:
 
}
 
}
  
void Ball::draw(){
+
void Bug::draw(){
 
ofSetColor(bcolor);
 
ofSetColor(bcolor);
 
ofCircle(pos.x, pos.y, radius);
 
ofCircle(pos.x, pos.y, radius);
66行: 82行:
  
 
#include "ofMain.h"
 
#include "ofMain.h"
#include "Ball.h"
+
#include "Bug.h"
  
 
class ofApp : public ofBaseApp{
 
class ofApp : public ofBaseApp{
86行: 102行:
 
void gotMessage(ofMessage msg);
 
void gotMessage(ofMessage msg);
 
 
Ball balls[NUM]; //Ballクラスのインスタンスを配列で指定
+
Bug bugs[NUM]; //Ballクラスのインスタンスを配列で指定
 
};
 
};
 
</pre>
 
</pre>
107行: 123行:
 
void ofApp::update(){
 
void ofApp::update(){
 
for(int i = 0; i < NUM; i++){
 
for(int i = 0; i < NUM; i++){
balls[i].update();
+
bugs[i].update();
 
}
 
}
 
}
 
}
113行: 129行:
 
//--------------------------------------------------------------
 
//--------------------------------------------------------------
 
void ofApp::draw(){
 
void ofApp::draw(){
 +
 +
//全画面を半透明の黒でフェード
 +
ofSetColor(0, 0, 0, 10);
 +
ofRect(0, 0, ofGetWidth(), ofGetHeight());
 +
 
for(int i = 0; i < NUM; i++){
 
for(int i = 0; i < NUM; i++){
balls[i].draw();
+
bugs[i].draw();
 
}
 
}
 
}
 
}
128行: 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>
 +
 +
=== 内部状態 ===
 +
;応用問題
 +
 +
虫の内部状態を設定し、内部状態に応じて動きを変えるプログラムを書いてみよう。
  
 
== 参考 ==
 
== 参考 ==
[[生命情報アート論]]
+
[[ジェネラティブアート論]]
  
 
[[Category:授業]]
 
[[Category:授業]]

2020年10月31日 (土) 00:24時点における最新版

目次

[編集] openFrameworksのサンプル

ランダムに東西南北の方角に動く虫

[編集] クラスの作成

  • Bugクラスを作成
    • Bug.h Bugクラスの宣言。変数とメソッド(関数)
    • Bug.cpp コンストラクター Bug()とメソッドの定義
  1. 新しくクラスを作るには、「プロジェクト > 新しい項目の追加...」 を開き,「C++ファイル」「ヘッダーファイル」を作る。
    • 名前を それぞれBug.cppBug.hとする。
    • 場所はともに ..\src とする。
    • (注)「クラスの追加」や「クラスウィザード」は使えない。
  2. ソリューションエクスプローラー上のsrcの中にBug.cppBug.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;
    }

[編集] 内部状態

応用問題

虫の内部状態を設定し、内部状態に応じて動きを変えるプログラムを書いてみよう。

[編集] 参考

ジェネラティブアート論

個人用ツール
名前空間

変種
操作
案内
ツールボックス