oF覚書

デジタルクリエーターを目指し右も左も分からず奮闘する23歳の日記です。

ウインドウサイズの変更時の留意点

実行時にウインドウサイズを変更した際、表示が上手くいかない時。

 

・対象のオブジェクトを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';

}