あそびばLinux

Linux関連を中心に

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を実行する事でビルドが成功。
以上、メモ書きまで。