ウインドウサイズの変更時の留意点
実行時にウインドウサイズを変更した際、表示が上手くいかない時。
・対象のオブジェクトをwindowResized()内に記述。
・windowResized()ブロック内の最初に、対象のオブジェクトをclear()した後再定義して、初期化。
ex.
[ofApp.h]
ofPolyline groundLine;
int w = ofGetWidth();
int h = ofGetHeight();
int lX1 = w/10;
int lX2 = w-w/10;
int lY = h-h/10;
[ofApp.cpp]
void ofApp::windowResized(int w, int h){
groundLine.clear();
int lX1 = w/10;
int lX2 = w-w/10;
int lY = h-h/10;
world2d.createGround(lX1, lY, lX2, lY);
groundLine.addVertex(lX1, lY);
groundLine.addVertex(lX2, lY);
}
関数を初期化する場合は、clear()関数定義し、その中に数値を書いて初期化。
対象の関数の前で呼び出す。
[particleVec2.h]
particleVec2::particleVec2(){
friction = 0.01;
radius = 5.0;
mass = 1.0;
position = ofVec2f(ofGetWidth()/2.0, ofGetHeight()/2.0);
velocity = ofVec2f(0,0);
minx = 0;
miny = 0;
maxx = ofGetWidth();
maxy = ofGetHeight();
}
void particleVec2::bounceOffWalls(){
if(position.x > maxx){
position.x = maxx;
velocity.x *= -1;
}
if(position.x < minx){
position.x = minx;
velocity.x *= -1;
}
if(position.y > maxy){
position.y = maxy;
velocity.y *= -1;
}
if(position.x < miny){
position.y = miny;
velocity.y *= -1;
}
}
void particleVec2::clear(){
minx = 0;
miny = 0;
maxx = ofGetWidth();
maxy = ofGetHeight();
}
[ofApp.cpp]
void ofApp::update(){
for(int i = 0; i<num; i++){
particle[i].addForce(0,1.0);
particle[i].bounceOffWalls();
particle[i].update();
}
}
void ofApp::windowResized(int w, int h){
for(int i = 0; i<num; i++){
particle[i].clear();
particle[i].bounceOffWalls();
}
}
openFrameworks 簡単にAudioRreactiveなオブジェクトを作る
-ofApp.h-
#pragma once
#include "ofMain.h"
class ofApp:public ofBaseApp{
...
ofSoundPlayer mySound; //ofSoundPlayerクラスをインスタンス化
float radius; //円の半径
};
-ofApp.cpp-
#include "ofApp.h"
void ofApp::setup(){
...
}
void ofApp::update(){
//サウンドの音量をリアルタイムに取得しvalポインタ配列に格納
float * val =ofSoundGetSpectrum(1)
radius = val[0] * 800.0; //円の半径に適用
}
C++のクラスとは #2 クラスの利用編
宣言したクラスは、自身で定義した新しい型のひとつ。つまりは、クラス型の変数を宣言することができる。
クラス型の変数の宣言は通常の変数を宣言する方法と同じ。
クラス名 変数名;
Car car1; //Carクラスの値を記憶できる変数car1の宣言。
//carクラスが設計図だとするならば、それを元に車を一台(car1)制作した。
このクラス型の変数を「オブジェクト」、または「インスタンス」と呼ぶ。
このオブジェクトをコード中で利用するには、「.」ドット演算子を使う。
car1.num = 1234; //Car設計図を元に制作されたcar1のナンバーが1234。
car1.gas = 20.5; //Car設計図を元に制作されたcar1のガソリン量が20.5。
car1.show(); //Car設計図を元に制作されたcar1の機能の呼び出し。
なお、オブジェクトのためにメモリを確保すること(ここではcar1を定義すること)を、オブジェクトを作成するという。また、オブジェクトの利用終了とともにメモリが解放されることを、オブジェクトを破棄するという。
main()関数内で宣言されたローカル関数はmain()関数が開始されるとともにオブジェクトが作成され、main()関数が終了した時に破棄される。
一方、オブジェクトを動的に作成することもできる。
new演算子を使ってオブジェクトのためのメモリを確保し、delete演算子を使ってメモリを解放する。
{
Car* pCar; //Carクラスへのポインタを準備。
pCar = new Car; //ポインタにアドレス(Car)を代入。
pCar ->num =1234; //アロー演算子を使ってメンバにアクセス。
pCar ->gas = 20.5; //アロー演算子を使ってメンバにアクセス。
delete pCar; //オブジェクトを破棄。
}
C++のクラスとは #1 超基本編
C++におけるクラスというものについてたまに混乱してしまうので、自分の覚え書きを残します。(間違えてたりしましたらご指摘ください。)
クラスとは、C++における新しい機能の一つ。
オブジェクトの性質・状態や、それに関わる機能をまとめながらプログラミングを作成する、所謂「オブジェクト指向プログラミング」のための概念。
ユーザー定義"型"のひとつである。
クラスにモノの性質や機能をまとめることを一般に、「クラスを宣言する」という。
宣言の方法は以下の通り。
class クラス名 {
アクセス指定子;
変数の宣言;
...
関数の宣言;
...
};
アクセス指定子とは、クラス内のメンバが外部からアクセスできるかどうかを指定する。
この機能の実装により、カプセル化(後述)を実装できる。
アクセス指定子には、「public」・「protected」・「private」の3種類があり、クラス内で指定しない場合は、全て「private」となる。
・public・・・クラスの外部からアクセスできる。
・protected・・・クラス内及び、派生先のクラスからのみアクセスできる
・private・・・クラス内からしかアクセスできない。
クラス内には、変数や関数をまとめて定義する。この変数や関数はメンバ(menber)と呼ばれている。
変数を「データメンバ」、関数を「メンバ関数」と呼ぶ。
クラス内ではメンバ関数の実際の処理についての定義がないので、外側で定義する。
戻り値の型 クラス名::メンバ関数名(引数リスト){
...
}
「::」はスコープ解決演算子(scope resolution operator)という。
これを使うことによって、メンバがどのクラスのメンバ関数であるのかを「::」前で指定する。
ex.
class Car {
public:
int num; //変数(データメンバ)numの宣言
double gas; //変数(データメンバ)gasの宣言
void show(); //関数(メンバ関数)showの宣言
};
//Carクラスメンバ関数の定義
void Car::show(){
cout << "車のメンバーは" << num << "です"。'\n';
}