Issue while extending Fisica Fjoint class
              in 
             Contributed Library Questions 
              •  
              1 month ago    
            
 
           
             Hi there,
            
             
            
            
             
            
            
             
              
             
             
              
             And this is the sketch  to see how it is instantiated :
            
            
             
            
            
             
            
            
             
            
             
            
            
             
            
            
             
             
           
 
            
           
             I would like to extend the Fjoint class of the Fisica library to make a new object I would call Flink.
            
            
             Actually I just want it to draw a line when the distance between the two Fbody involved is less than the value of the m_vision field.
            
            
             My problem is that nothing happens. It looks like the draw() method and the debugDraw method are not called.
            
            
             I've done a lot of exploration of the code of the library and based my class extension to the FDistanceJoint class but I still cannot have any result.
            
            
             The sketch work and there is no error or stack trace but I simply don't have my links !
            
            
             Here is the class, ( nearly a copy of FDistanceJoint ) :
            
            - import processing.core.*;
 - import java.util.ArrayList;
 - import org.jbox2d.common.*;
 - import org.jbox2d.collision.*;
 - import org.jbox2d.collision.shapes.*;
 - import org.jbox2d.dynamics.*;
 - import org.jbox2d.dynamics.joints.*;
 - /////////////////////////////////////////////////////
 - public class aeFlink extends FJoint {
 - protected FBody m_body1;
 - protected FBody m_body2;
 - protected Vec2 m_anchor1;
 - protected Vec2 m_anchor2;
 - protected float m_vision;
 - /////////////////////////////////////////////////////
 - public aeFlink (FBody body1, FBody body2) {
 - super() ;
 - m_body1 = body1;
 - m_body2 = body2;
 - m_anchor1 = new Vec2(0.0f, 0.0f);
 - m_anchor2 = new Vec2(0.0f, 0.0f);
 - m_vision = 150;
 - }
 - ////////////////////////////////////////////////////////////////
 - ////////////////////////////////////////////////////////////////
 - public void draw(PGraphics applet) {
 - preDraw(applet);
 - println("test"); //->nothing print...
 - if (getDistance() < m_vision) {
 - applet.line(getAnchor1X(), getAnchor1Y(), getAnchor2X(), getAnchor2Y());
 - } //nothing draw...
 - postDraw(applet);
 - }
 - ////////////////////////////////////////////////////////////////
 - public void drawDebug(PGraphics applet) {
 - preDrawDebug(applet);
 - applet.line(getAnchor1X(), getAnchor1Y(), getAnchor2X(), getAnchor2Y());
 - postDrawDebug(applet);
 - }
 - ////////////////////////////////////////////////////////////////
 - public float getDistance() {
 - float lengthX = ((m_body1.getX() + getAnchor1X()) - (m_body2.getX() + getAnchor2X()));
 - float lengthY = ((m_body1.getY() + getAnchor1Y()) - (m_body2.getY() + getAnchor2Y()));
 - float distance = (float)Math.sqrt(lengthX*lengthX + lengthY*lengthY);
 - return distance;
 - }
 - ////////////////////////////////////////////////////////////////
 - public float getAnchor1X() {
 - if (m_joint != null) {
 - return Fisica.worldToScreen(m_joint.getAnchor1()).x;
 - }
 - return Fisica.worldToScreen(m_anchor1.x);
 - }
 - ////////////////////////////////////////////////////////////////
 - public float getAnchor1Y() {
 - if (m_joint != null) {
 - return Fisica.worldToScreen(m_joint.getAnchor1()).y;
 - }
 - return Fisica.worldToScreen(m_anchor1.y);
 - }
 - ////////////////////////////////////////////////////////////////
 - public float getAnchor2X() {
 - if (m_joint != null) {
 - return Fisica.worldToScreen(m_joint.getAnchor2()).x;
 - }
 - return Fisica.worldToScreen(m_anchor2.x);
 - }
 - ////////////////////////////////////////////////////////////////
 - public float getAnchor2Y() {
 - if (m_joint != null) {
 - return Fisica.worldToScreen(m_joint.getAnchor2()).y;
 - }
 - return Fisica.worldToScreen(m_anchor2.y);
 - }
 - ////////////////////////////////////////////////////////////////
 - public void setAnchor2(float x, float y) {
 - if (m_joint != null) {
 - ((DistanceJoint)m_joint).getAnchor2().set(Fisica.screenToWorld(x), Fisica.screenToWorld(y));
 - }
 - m_anchor2 = Fisica.screenToWorld(x, y);
 - }
 - ////////////////////////////////////////////////////////////////
 - public void setAnchor1(float x, float y) {
 - if (m_joint != null) {
 - ((DistanceJoint)m_joint).getAnchor1().set(Fisica.screenToWorld(x), Fisica.screenToWorld(y));
 - }
 - m_anchor1 = Fisica.screenToWorld(x, y);
 - }
 - ////////////////////////////////////////////////////////////////
 - ////////////////////////////////////////////////////////////////
 - //end class aeFlink
 - }
 
- import fisica.*;
 - FWorld world;
 - FCircle[] balls;
 - aeFlink[] links;
 - int nombreDeBalles = 10;
 - float boundXL = 5;
 - float boundXR = 700-5;
 - float boundYT = 5;
 - float boundYB = 700-5;
 - color backColor = 40;
 - int radius = 22;
 - //////////////////////////////////////////////////////////
 - void setup() {
 - size(1000, 700);
 - smooth();
 - frameRate(60);
 - Fisica.init(this);
 - world = new FWorld();
 - world.setGravity(0, 0);
 - world.setEdges(boundXL, boundYT, boundXR, boundYB );
 - world.setEdgesRestitution(1);
 - world.setEdges(int(backColor));
 - balls = new FCircle[nombreDeBalles];
 - for (int i = 0; i<nombreDeBalles; i++) {
 - //int d = int(random (100, 200));
 - int d = 20;
 - balls[i] = new FCircle(radius);
 - balls[i].setPosition(random(100, 500), random(100, 500));
 - //balls[i].setVelocity(random(-200, 200), random(-200, 200));
 - balls[i].setDensity(1+d);
 - balls[i].setRestitution(1.0);
 - balls[i].setDamping(0.0001);
 - balls[i].setStroke(0);
 - balls[i].setStrokeWeight(1);
 - balls[i].setFill(235 - d);
 - //balls[i].setSensor(true);
 - balls[i].setFriction(0);
 - world.add(balls[i]);
 - }
 - links = new aeFlink[nombreDeBalles];
 - for (int i = 0; i<nombreDeBalles; i++) {
 - links[i] = new aeFlink(balls[i], balls[(i+1)%nombreDeBalles]);
 - links[i].setStroke(255);
 - links[i].setStrokeWeight(1);
 - links[i].setCollideConnected(true);
 - links[i].setDrawable(true);
 - world.add(links[i]);
 - }
 - //end setup
 - }
 - //////////////////////////////////////////////////////////
 - void draw() {
 - background(backColor);
 - world.draw();
 - world.step();
 - noFill();
 - stroke(255);
 - rect(boundXL+4, boundYT+4, boundXR-boundXL-8, boundXR-boundXL-8, 5);
 - //end draw
 - }
 
             So.... any idea ?
            
             
              
              1  
            
 
            