openFrameworks + ofxBox2dでハマったのでメモ
OFことopenFrameworksに興味が出たので、田所淳氏のサイトhttp://yoppa.org/で
公開している"Beyond Interaction"を参考に色々触っていたら、addon(ofxBox2d)の導入でビルドエラーが出てつまづいた。
ググってみるとofxBox2dのサンプルビルドで躓いている人が多数なようなので、
簡易メモとして残す事に。
環境は64bit Ubuntu 12.04LTS & OF 0.7.4 (-> 0.8.1に入れ替え)
結論としては、openFrameworksとofxBox2dのバージョンが
合っていなかった事が原因。
* ofxBox2dの入手
git clone git://github.com/vanderlin/ofxBox2d.git
* README.md
Compatibilityの項より、使ってるOFのバージョンに合わせてcheckoutせよ、
と書いてあるものの、branchもtagも切っていない模様?
何故???
とりあえずこれをgit cloneし、OF 0.7.4で使用していたため、
Beyond Interactionに掲載のソースをビルドした際にコンパイル時にエラーが多発。
OF0.8.1に入れ替え、コードを数ヶ所書き換えたら動作しました。
* testApp.h (OF 0.8.1ではofApp.hにrename)
#ifndef _TEST_APP #define _TEST_APP #pragma once #include "ofMain.h" /* #include "ofxVectorMath.h" */ #include "ofxBox2d.h" class testApp : public ofBaseApp{ public: 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); ofxBox2d box2d; /* vector <ofxBox2dCircle> circles; */ vector <ofPtr<ofxBox2dCircle> > circles; }; #endif
* testApp.cpp (OF 0.8.1ではofApp.cppにrename)
#include "ofApp.h" //-------------------------------------------------------------- void ofApp::setup(){ ofSetVerticalSync(true); ofBackground(0, 0, 0); box2d.init(); box2d.setGravity(0, 5); box2d.createBounds(0, 0, ofGetWidth(), ofGetHeight()); box2d.setFPS(30); } //-------------------------------------------------------------- void ofApp::update(){ box2d.update(); } //-------------------------------------------------------------- void ofApp::draw(){ for (int i = 0; i < circles.size(); i++){ circles[i].get()->draw(); // circles[i].draw(); } box2d.draw(); } //-------------------------------------------------------------- void ofApp::keyPressed(int key){ } //-------------------------------------------------------------- void ofApp::keyReleased(int key){ } //-------------------------------------------------------------- void ofApp::mouseMoved(int x, int y ){ } //-------------------------------------------------------------- void ofApp::mouseDragged(int x, int y, int button){ } //-------------------------------------------------------------- void ofApp::mousePressed(int x, int y, int button){ float r = ofRandom(10, 40); // ofxBox2dCircle circle; // circles.setPhysics(1.0, 0.8, 0.5); // circles.setup(box2d.getWorld(), mouseX, mouseY, r); ofPtr<ofxBox2dCircle> circle = ofPtr<ofxBox2dCircle>(new ofxBox2dCircle); circle.get()->setPhysics(1.0, 0.8, 0.5); circle.get()->setup(box2d.getWorld(), mouseX, mouseY, r); circles.push_back(circle); } //-------------------------------------------------------------- void ofApp::mouseReleased(int x, int y, int button){ } //-------------------------------------------------------------- void ofApp::windowResized(int w, int h){ } //-------------------------------------------------------------- void ofApp::gotMessage(ofMessage msg){ } //-------------------------------------------------------------- void ofApp::dragEvent(ofDragInfo dragInfo){ }
上記のようにソースコードを変更後、makeを実行する事でビルドが成功。
以上、メモ書きまで。