Quantcast
Channel: beginners - openFrameworks
Viewing all articles
Browse latest Browse all 4929

Draw ofxBox2d Edge stored in vector?

$
0
0

@MaximilianUAL2020 wrote:

Hey everyone,

I am trying to create a sketch, using the ofxBox2d addon, in which I can draw static lines (ofxBox2dEdge) across the screen which cause an ofxBox2dCircle to repel from them. After drawing the lines, I want to store them into an array and access them in draw() so that they remain on the screen, which is the part of the code I am struggling with. I managed to successfully store the previously drawn edges in a vector. However, I get an error message (“Need to update shape first”) when trying to loop through the vector in draw(). I have tried multiple ways to work around this, although nothing has worked.
If anyone could point me in a better direction or offer any advice, I would appreciate it.
Thank you in advance!

App.h

#pragma once
#include "ofMain.h"
#include "ofxBox2d.h"

// -------------------------------------------------
class ofApp : public ofBaseApp {
    
public:
    
    void setup();
    void update();
    void draw();
    
    void keyPressed(int key);
    void mouseDragged(int x, int y, int button);
    void mousePressed(int x, int y, int button);
    void mouseReleased(int x, int y, int button);
        
    ofxBox2d box2d;
    ofPolyline line;
    ofxBox2dEdge edge;
    vector <ofxBox2dEdge> savedEdges;
    vector <shared_ptr<ofxBox2dCircle>> circles;
};

App.cpp

Setup()

void ofApp::setup() {
    ofSetVerticalSync(true);
    ofSetLogLevel(OF_LOG_NOTICE);
        
    box2d.init();
    box2d.setGravity(0, 10);
    box2d.createGround();
    box2d.setFPS(60.0);
}

Update()

void ofApp::update() {
    box2d.update();
    
    ofRemove(circles, ofxBox2dBaseShape::shouldRemoveOffScreen);
    cout << savedEdges.size() << endl;
}

Draw()
This is where I am trying to access the vector and loop through the previous edges.

void ofApp::draw() {
    ofSetColor(ofColor::black);

    for(auto &circle:circles) {
        ofFill();
        circle->update();
        circle->draw();
    }
    
    for(auto savedEdges:savedEdges){
        savedEdges.draw();
    }
    
    edge.draw();
    line.draw();
}

keyPressed()

void ofApp::keyPressed(int key) {
    if(key == ' ') {
        auto circle = make_shared<ofxBox2dCircle>();
        circle->setPhysics(3.0, 0.53, 0.1);
        circle->setup(box2d.getWorld(), ofRandom(400,600), 100, 20);
        circles.push_back(circle);
    }
}

mousePressed()

void ofApp::mousePressed(int x, int y, int button) {
    if(edge.isBody()){
        line.clear();
        edge.destroy();
    }
}

mouseDragged()

void ofApp::mouseDragged(int x, int y, int button) {
    line.addVertex(x, y);
}

mouseReleased()
This is where I convert the polyline to an edge before pushing it into the vector, which I want to access in draw().

void ofApp::mouseReleased(int x, int y, int button) {
    line.simplify();
    edge.addVertexes(line);
    edge.setPhysics(0.0, 0.5, 0.5);
    edge.create(box2d.getWorld());
    savedEdges.push_back(edge);
}

Posts: 1

Participants: 1

Read full topic


Viewing all articles
Browse latest Browse all 4929