[work 27] Box2d study – Burst –
Movie
Source code
about
- 円状のエッジを用意して、その内部に大量のパーティクルを放出する
- 一定時間後エッジを破棄する
file
- 上部にあるファイル名が表示されているボタンを押すと、表示されるファイルが切り替わります
- 別ウィンドウ表示したい時や行番号などが無いRawMode表示したい時は、コード内右上のボタンを押してください(ボタンはマウスオーバーすると表示されます)
#include "ofMain.h" #include "ofApp.h" //================================ int main( ){ // 4K:4096x2160 // 2K:2048x1080 // FullHD:1920x1080 // HD:1440x1080 // HD720p:1280x720 // DVD:720x480 // setup the GL context ofSetupOpenGL(1280,720, OF_WINDOW); // this kicks off the running of my app // can be OF_WINDOW or OF_FULLSCREEN // pass in width and height too: ofRunApp( new ofApp()); }
#pragma once #include "ofMain.h" #include "Box.hpp" #include "ofxBox2d.h" class ofApp : public ofBaseApp{ public: ofApp(); ~ofApp(); 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 mouseEntered(int x, int y); void mouseExited(int x, int y); void windowResized(int w, int h); void dragEvent(ofDragInfo dragInfo); void gotMessage(ofMessage msg); private: ofFbo fb; ofxBox2d box2d; std::vector<std::shared_ptr<Box>> boxes; std::shared_ptr<ofxBox2dEdge> edge; };
#include "ofApp.h" ofApp::ofApp(){ } ofApp::~ofApp(){ } //-------------------------------------------------------------- void ofApp::setup(){ double fps = 30; ofSetFrameRate(fps); ofBackground(0); ofSetBackgroundAuto(true); box2d.init(); box2d.setGravity(0, 0); box2d.createGround(); // create wall around window box2d.setFPS(30.0); box2d.registerGrabbing(); // grab object fb.allocate(ofGetWidth(), ofGetHeight()); float angle = 0; float time = 0; edge = std::make_shared<ofxBox2dEdge>(); for (int x = 0; x < 360; x++) { float rad = PI * ((float)x / 180); ofVec2f p; p.x = ofGetWidth() / 2 + std::cos(rad) * 150; p.y = ofGetHeight() / 2 + std::sin(rad) * 150; edge.get()->addVertex(p.x, p.y); } edge.get()->create(box2d.getWorld()); } //-------------------------------------------------------------- void ofApp::update(){ for (int i = 0; i < 20; i++) { boxes.push_back(std::shared_ptr<Box>(new Box())); boxes.back().get()->setPhysics(ofRandom(0.1, 0.4), ofRandom(0.1, 0.5), ofRandom(0.1, 0.3)); boxes.back().get()->setup(box2d.getWorld(), ofRectangle(ofGetWidth() / 2, ofGetHeight() / 2, 2, 2)); boxes.back().get()->setVelocity(ofVec2f(ofRandom(5, 10), ofRandom(5, 10))); } box2d.update(); ofRemove(boxes, ofxBox2dBaseShape::shouldRemoveOffScreen); if (ofGetFrameNum() == 30 * 15) { edge.get()->destroy(); } fb.begin(); ofClear(0); ofSetColor(255); edge.get()->draw(); for (std::shared_ptr<Box> &b : boxes) { b->display(); } fb.end(); } //-------------------------------------------------------------- void ofApp::draw(){ fb.draw(0,0); }
#ifndef Box_hpp #define Box_hpp #include <stdio.h> #include "ofMain.h" #include "ofxBox2d.h" class Box : public ofxBox2dRect{ public: Box(); ~Box(); void display(); private: ofColor color; }; #endif /* Box_hpp */
#include "Box.hpp" Box::Box() { color = ofColor(ofRandom(255), ofRandom(255), ofRandom(255)); } Box::~Box() { } void Box::display() { float w = getWidth(); float h = getHeight(); float a = getRotation(); // deg glPushMatrix(); glTranslatef(getPosition().x, getPosition().y, 0); glRotatef(a, 0, 0, 1); ofFill(); ofSetColor(color); ofSetRectMode(OF_RECTMODE_CENTER); ofDrawRectangle(0, 0, w, h); glPopMatrix(); }
Link to the reference page
ソースコードで使用したAPIの中から要点になりそうなものをいくつか選んでリストアップしました。
category | API/Lib |
openframeworks | ofFbo |
openframeworks | ofxBox2d |
Development environment
- openframeworks 0.10.1
- c++
- macOS
- Xcode