openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B

16,088 views
15,880 views

Published on

0 Comments
15 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
16,088
On SlideShare
0
From Embeds
0
Number of Embeds
4,820
Actions
Shares
0
Downloads
139
Comments
0
Likes
15
Embeds 0
No embeds

No notes for slide

openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B

  1. 1. ‣‣‣‣‣‣‣
  2. 2. ‣‣‣
  3. 3. ‣‣‣
  4. 4. ‣#pragma once#include "ofMain.h"class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); ofVec2f pos; //位置を記録するための変数(正確にはオブジェクト)};
  5. 5. ‣#include "testApp.h"void testApp::setup(){ ofSetFrameRate(60); //更新を秒間60コマに(fps) ofBackgroundHex(0x000000); //背景色を黒に pos.x = ofGetWidth()/2; /初期位置を画面の中心に:x / pos.y = ofGetHeight()/2; //初期位置を画面の中心に:y}void testApp::update(){ pos.x += 4.0; //位置を更新:x pos.y += 3.0; //位置を更新:y //画面の端まできたら、反対方向から出現 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 testApp::draw(){ ofSetHexColor(0x3399ff); //描画する色を指定 ofCircle(pos.x, pos.y, 20); //更新された値を利用して円を描く}
  6. 6.
  7. 7. ‣‣‣‣‣
  8. 8. ‣#pragma once#include "ofMain.h"class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); ofVec2f pos; //位置を記録するための変数(正確にはオブジェクト) ofVec2f vel; //パーティクルの速度(Velocity)};
  9. 9. ‣#include "testApp.h"void testApp::setup(){ ofSetFrameRate(60); //更新を秒間60コマに(fps) ofBackgroundHex(0x000000); //背景色を黒に //初期位置を画面の中心に pos.x = ofGetWidth()/2; pos.y = ofGetHeight()/2; //速度をランダムに決定 vel.x = ofRandom(-10, 10); vel.y = ofRandom(-10, 10);}void testApp::update(){ //位置を更新する pos += vel; //画面の端に来たら反対側へ 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(); //上}
  10. 10. ‣void testApp::draw(){ ofSetHexColor(0x3399ff); //描画する色を指定 ofCircle(pos.x, pos.y, 4); //更新された値を利用して円を描く}
  11. 11.
  12. 12. ‣‣‣‣ ( ) pos[0] pos[1] pos[2] NUM
  13. 13. ‣ (pos) (vel) pos[0] vel[0] pos[1] vel[1] pos[2] vel[2]
  14. 14. ‣‣ofVec2f pos[100]; //位置の配列ofVec2f vel[100]; //パーティクルの速度(Velocity)‣‣pos[0], pos[1], pos[2], pos[3] ...
  15. 15. ‣‣for (【初期化】;【ループの継続条件】;【カウンタ変数の更新】;) { 【くりかえし実行する処理】} ‣for (int i = 0; i < 100; i++) { 【くりかえし実行する処理】}
  16. 16. ‣‣for (int i = 0; i < 100; i++) { //100回くりかえし //速度をランダムに決定 vel[i].x = ofRandom(-10, 10); vel[i].y = ofRandom(-10, 10); }‣
  17. 17. ‣#pragma once#include "ofMain.h"#define NUM 100class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); ofVec2f pos[NUM]; //位置の配列 ofVec2f vel[NUM]; //パーティクルの速度(Velocity)};
  18. 18. ‣#include "testApp.h"void testApp::setup(){ ofSetFrameRate(60); //更新を秒間60コマに(fps) ofBackgroundHex(0x000000); //背景色を黒に for (int i = 0; i < NUM; i++) { //NUM回くりかえし //初期位置を画面の中心に pos[i].x = ofGetWidth()/2; pos[i].y = ofGetHeight()/2; //速度をランダムに決定 vel[i].x = ofRandom(-10, 10); vel[i].y = ofRandom(-10, 10); }}void testApp::update(){ for (int i = 0; i < NUM; i++) { //NUM回くりかえし //位置を更新する pos[i] += vel[i]; //画面の端に来たら反対側へ if (pos[i].x > ofGetWidth()) pos[i].x = 0; //右 if (pos[i].x < 0) pos[i].x = ofGetWidth(); //左 if (pos[i].y > ofGetHeight()) pos[i].y = 0; //下 if (pos[i].y < 0) pos[i].y = ofGetHeight(); //上 }}
  19. 19. ‣void testApp::draw(){ ofSetHexColor(0x3399ff); //描画する色を指定 for (int i = 0; i < NUM; i++) { //NUM回くりかえし ofCircle(pos[i].x, pos[i].y, 4); //更新された値を利用して円を描く }}
  20. 20.
  21. 21. ‣‣‣‣‣
  22. 22. ‣‣‣Particle p[100];‣‣vector <Particle> p;
  23. 23. ‣‣‣ particles.push_back(p);‣ particles.pop_back();‣ particles.clear();
  24. 24. ‣‣
  25. 25. ‣#pragma once#include "ofMain.h"class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); void mouseDragged(int x, int y, int button); void keyReleased(int key); vector<ofVec2f> pos; //位置の可変配列 vector<ofVec2f> vel; //パーティクルの速度の可変配列};
  26. 26. ‣#include "testApp.h"void testApp::setup(){ ofSetFrameRate(60); //更新を秒間60コマに(fps) ofEnableBlendMode(OF_BLENDMODE_ADD); //色を加算合成に ofBackgroundHex(0x000000); //背景色を黒に}void testApp::update(){ for (int i = 0; i < pos.size(); i++) { //NUM回くりかえし //位置を更新する pos[i] += vel[i]; //画面の端に来たら反対側へ if (pos[i].x > ofGetWidth()) pos[i].x = 0; //右 if (pos[i].x < 0) pos[i].x = ofGetWidth(); //左 if (pos[i].y > ofGetHeight()) pos[i].y = 0; //下 if (pos[i].y < 0) pos[i].y = ofGetHeight(); //上 }}
  27. 27. ‣void testApp::draw(){ ofSetHexColor(0x3399ff); //描画する色を指定 for (int i = 0; i < pos.size(); i++) { //NUM回くりかえし ofCircle(pos[i].x, pos[i].y, 4); //更新された値を利用して円を描く } //現在の数とフレームレートを表示 string log; log = "particle num = " + ofToString(pos.size(), 0) + "n"; log += "framerate = " + ofToString(ofGetFrameRate(), 4); ofSetHexColor(0xffffff); ofDrawBitmapString(log, 20, 20);}void testApp::mouseDragged(int x, int y, int button) { ofVec2f p; //位置の変数を一時的に生成 p.set(x, y); //位置をマウスをクリックした場所に設定 pos.push_back(p); //可変配列の末尾に位置を追加 ofVec2f v; //速度の変数を一時的に生成 v.set(ofRandom(-1, 1), ofRandom(-1, 1)); //速度を設定 vel.push_back(v); //可変配列の末尾に速度を追加}
  28. 28. ‣void testApp::keyReleased(int key) { if (key == c) { //「c」キーを押したら pos.clear(); //位置の配列を初期化 vel.clear(); //速度の配列を初期化 } if (key == f) { //「f」キーを押したら ofToggleFullscreen(); //フルスクリーンon/off }}
  29. 29.
  30. 30. ‣‣‣‣ofColor col; //色のオブジェクトをインスタンス化col.r = 31; //redを設定col.g = 127; //greenを設定col.b = 255; //blueを設定
  31. 31. ‣#pragma once#include "ofMain.h"class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); void mouseDragged(int x, int y, int button); void keyReleased(int key); vector<ofVec2f> pos; //位置の可変配列 vector<ofVec2f> vel; //パーティクルの速度の可変配列 vector<ofColor> col; //色の可変配列};
  32. 32. ‣#include "testApp.h"void testApp::setup(){ ofSetFrameRate(60); //更新を秒間60コマに(fps) ofEnableBlendMode(OF_BLENDMODE_ADD); //色を加算合成に ofBackgroundHex(0x000000); //背景色を黒に}void testApp::update(){ for (int i = 0; i < pos.size(); i++) { //NUM回くりかえし //位置を更新する pos[i] += vel[i]; //画面の端に来たら反対側へ if (pos[i].x > ofGetWidth()) pos[i].x = 0; //右 if (pos[i].x < 0) pos[i].x = ofGetWidth(); //左 if (pos[i].y > ofGetHeight()) pos[i].y = 0; //下 if (pos[i].y < 0) pos[i].y = ofGetHeight(); //上 }}
  33. 33. ‣void testApp::draw(){ for (int i = 0; i < pos.size(); i++) { //NUM回くりかえし ofSetColor(col[i].r, col[i].g, col[i].b);//ランダムな色で描画 ofCircle(pos[i].x, pos[i].y, 4); //更新された値を利用して円を描く } //現在の数とフレームレートを表示 string log; log = "particle num = " + ofToString(pos.size(), 0) + "n"; log += "framerate = " + ofToString(ofGetFrameRate(), 4); ofSetHexColor(0xffffff); ofDrawBitmapString(log, 20, 20);}
  34. 34. ‣void testApp::mouseDragged(int x, int y, int button) { ofVec2f p; //位置の変数を一時的に生成 p.set(x, y); //位置をマウスをクリックした場所に設定 pos.push_back(p); //可変配列の末尾に位置を追加 ofVec2f v; //速度の変数を一時的に生成 v.set(ofRandom(-1, 1), ofRandom(-1, 1)); //速度を設定 vel.push_back(v); //可変配列の末尾に速度を追加 ofColor c; //色を一時的に生成 c.r = ofRandom(255); //red成分をランダムに c.g = ofRandom(255); //green成分をランダムに c.b = ofRandom(255); //blue成分をランダムに col.push_back(c);}void testApp::keyReleased(int key) { if (key == c) { //「c」キーを押したら pos.clear(); //位置の配列を初期化 vel.clear(); //速度の配列を初期化 } if (key == f) { //「f」キーを押したら ofToggleFullscreen(); //フルスクリーンon/off }}
  35. 35.
  36. 36. ‣‣‣‣
  37. 37. ‣‣
  38. 38. ‣#pragma once#include "ofMain.h"class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); void mouseDragged(int x, int y, int button); void keyReleased(int key); vector<ofVec3f> pos; //位置の可変配列(3D) vector<ofVec3f> vel; //パーティクルの速度の可変配列(3D)};
  39. 39. ‣#include "testApp.h"void testApp::setup(){ ofSetFrameRate(60); //更新を秒間60コマに(fps) ofEnableBlendMode(OF_BLENDMODE_ADD); //色を加算合成に ofBackgroundHex(0x000000); //背景色を黒に}void testApp::update(){ for (int i = 0; i < pos.size(); i++) { //NUM回くりかえし //位置を更新する pos[i] += vel[i]; }}void testApp::draw(){ glEnable(GL_DEPTH_TEST); //奥行の判定をする ofSetHexColor(0x3399ff); for (int i = 0; i < pos.size(); i++) { //NUM回くりかえし ofPushMatrix(); ofTranslate(pos[i]); //位置を設定 ofCircle(0, 0, 4); //更新された値を利用して円を描く ofPopMatrix(); } glDisable(GL_DEPTH_TEST);
  40. 40. ‣ //現在の数とフレームレートを表示 string log; log = "particle num = " + ofToString(pos.size(), 0) + "n"; log += "framerate = " + ofToString(ofGetFrameRate(), 4); ofSetHexColor(0xffffff); ofDrawBitmapString(log, 20, 20);}void testApp::mouseDragged(int x, int y, int button) { ofVec3f p; //位置の変数を一時的に生成 p.set(x, y); //位置をマウスをクリックした場所に設定 pos.push_back(p); //可変配列の末尾に位置を追加 ofVec3f v; //速度の変数を一時的に生成 v.set(ofRandom(-1, 1), ofRandom(-1, 1), ofRandom(-1, 1));//速度を設定 vel.push_back(v); //可変配列の末尾に速度を追加}
  41. 41. ‣void testApp::keyReleased(int key) { if (key == c) { //「c」キーを押したら pos.clear(); //位置の配列を初期化 vel.clear(); //速度の配列を初期化 } if (key == f) { //「f」キーを押したら ofToggleFullscreen(); //フルスクリーンon/off }}
  42. 42.
  43. 43. ‣‣‣

×