OFでつまづいたのでメモ【 Beyond Interaction 3-4-a ofxBox2d 】
26.01.14
こんにちわFLIGHTGRAFです。
OFを始めていきなりつまづいたのでメモ。
おそらく書籍購入者相当数の人がここでつまづいてるんじゃないかと思って、ここに書いときます。
田所氏著の「Beyond Interaction-2版」で、【3−4−a】アドオンの利用において、この書籍が出てしばらくというか、一年もたってないうちにいろんな環境が変わってしまった様で、「ofxBox2d」が参考コードでは利用できなくなっていたのでつまづきました。
自分は以下環境+コードで利用できるようになったので参考にしてください。
Xcode5.0.2/ofxbox2d(2014現在)/OFv8.0.2(書籍ではv0.7.4ですが、これだとofxbox2dが動かない。他のサイトにあるようなエラーは無く、いろいろ調べたら既に8.0に最適化されてる模様)
ofxBox2dをダウンロードし、「ofxBox2d-master」が展開されるので、フォルダを「ofxBox2d」にrenameしてaddonの中に入れます。
書籍を参考にprojectorGeneratorで新規プロジェクトを生成し、”testApp.h”から書いていきます”
testApp.h
#pragma once #include "ofMain.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 <ofPtr<ofxBox2dCircle> > circles; //beyondでは vector <ofxBox2dCircle> > circles; };
testApp.cpp
#include "testApp.h" //-------------------------------------------------------------- void testApp::setup(){ ofSetFrameRate(60); ofSetVerticalSync(true); ofBackground(0, 0, 0); box2d.init(); box2d.setGravity(0, 5); box2d.createBounds(0,0,ofGetWidth(),ofGetHeight()); box2d.setFPS(30); //Beyondには無い宣言 box2d.registerGrabbing(); //ofSetLogLevel(OF_LOG_NOTICE);//無くてもいい } //-------------------------------------------------------------- void testApp::update(){ box2d.update(); } //-------------------------------------------------------------- void testApp::draw(){ for (int i=0; i<circles.size(); i++) { ofFill(); ofSetColor(0, 127, 255); //circles[i].draw();//Beyondではこう宣言している circles[i].get()->draw(); } box2d.drawGround();//宣言しなくてもいい(一応) } //-------------------------------------------------------------- void testApp::keyPressed(int key){ } //-------------------------------------------------------------- void testApp::keyReleased(int key){ } //-------------------------------------------------------------- void testApp::mouseMoved(int x, int y ){ } //-------------------------------------------------------------- void testApp::mouseDragged(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::mousePressed(int x, int y, int button){ float r =ofRandom(10,40); //ofxBox2dCircle circle;//Beyondではインスタンスを生成しているが、そうするとうまくいかなかった。なので下記に変更 circles.push_back(ofPtr(new ofxBox2dCircle));//push_backは始めにに宣言しないと以下のものが動かない circles.back().get()->setPhysics(1.0, 0.8, 0.5); circles.back().get()->setup(box2d.getWorld(), mouseX, mouseY, r); } //-------------------------------------------------------------- void testApp::mouseReleased(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::windowResized(int w, int h){ } //-------------------------------------------------------------- void testApp::gotMessage(ofMessage msg){ } //-------------------------------------------------------------- void testApp::dragEvent(ofDragInfo dragInfo){ }
こうするとうまく動くようになりました。