0
votes

I'm using box2d for Processing from the Shiffman tutorials. All I want to do is change the position of my box when it gets to a certain x co-ordinate. This is not easy as the x co-ordinate in the box class has to be translated from the box2D world, manipulated in the function wrap below and then back to the box2d world.

I have created the following code below. The problem I have is how to apply the returned x co-ordinate to change the position of the box, or the body that defines the box. I've tried to provide a MCVE but box2d bloats the code. It would be great if there was a place to post a full sketch if anyone knows of it.

import controlP5.*;
import shiffman.box2d.*;
import org.jbox2d.collision.shapes.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.*;
import org.jbox2d.particle.*;
import org.jbox2d.pooling.*;
import javax.swing.*;
import java.awt.Frame;
import java.awt.MouseInfo;
import java.awt.Point;
//import org.jbox2d.p5.*;
PApplet s;
// A reference to our box2d world
Box2DProcessing box2d;
ControlP5 cp5;
Body tbb;
// A list we'll use to track fixed objects
ArrayList<Boundary> boundaries;
// A list for all of our rectangles
ArrayList<Box> boxes;
ArrayList<Box> boxes_Clone1;
ArrayList<Box> boxes_Clone2;
ArrayList<Box> boxes_Clone3;
ArrayList<Box> boxes_Clone4;
PFont f;
String str;
float num;


void setup() {
  size(840,860);
  f = createFont("Arial",16,true); // Arial, 16 point, anti-aliasing on

    cp5 = new ControlP5(this);

box2d = new Box2DProcessing(this);
  box2d.createWorld();
  // We are setting a custom gravity
  box2d.setGravity(0, + 0.1);
}

void draw() {
 box2d.step();

for (int i = boxes.size()-1; i >= 0; i--) {
    Box b = boxes.get(i);
    //b.scale(2);
    b.wrap();
    if (b.done()) {
      //boxes.remove(i);
    }
    //
  }

class Box {

  // We need to keep track of a Body and a width and height
  Body body;

  float w;
  float h;

  public color col;
  public float den;
  public float rest;
  public float fric;
public float linVecx;
public float linVecy;
  // Constructor
  Box(float x, float y,color col,float fric,float rest,float den,float linVecx,float linVecy) {
    this.w = 8;
    this.h = 8;
    this.col = col;
    this.fric=fric;
    this.rest=rest;
    this.den=den;
    this.linVecx=linVecx;
    this.linVecy=linVecy;

    // Add the box to the box2d world
    makeBody(new Vec2(x, y), w, h);
  }
void display() {
    // We look at each body and get its screen position
    Vec2 pos = box2d.getBodyPixelCoord(body);
    // Get its angle of rotation
    float a = body.getAngle();
    rectMode(CENTER);
    pushMatrix();
    translate(pos.x, pos.y);
    rotate(-a);
    fill(col);
    noStroke();
    //strokeWeight(2);
    ellipse(0, 0, w, h);
    popMatrix();
  }

  // This function adds the rectangle to the box2d world
  void makeBody(Vec2 center, float w_, float h_) {

    // Define a polygon (this is what we use for a rectangle)
    PolygonShape sd = new PolygonShape();
    float box2dW = box2d.scalarPixelsToWorld(w_/2);
    float box2dH = box2d.scalarPixelsToWorld(h_/2);
    sd.setAsBox(box2dW, box2dH);

    // Define a fixture
    FixtureDef fd = new FixtureDef();
    fd.shape = sd;
    // Parameters that affect physics
    fd.density = den;
    fd.friction = fric;
    fd.restitution = rest;

    // Define the body and make it from the shape
    BodyDef bd = new BodyDef();
    bd.type = BodyType.DYNAMIC;
    bd.linearDamping = 3.0f;
    bd.position.set(box2d.coordPixelsToWorld(center));

    body = box2d.createBody(bd);
    body.createFixture(fd);

    // Give it some initial random velocity
    body.setLinearVelocity(new Vec2(linVecx, linVecy));
    body.setAngularVelocity(random(-5, 5));

  }
  float wrap(){
  Vec2 pos = box2d.getBodyPixelCoord(body);
   if (pos.x > 590) {
      pos.x = 300;
       return box2d.scalarPixelsToWorld(pos.x);
      //bd.position = box2d.coordPixelsToWorld(pos.x,pos.y);

    }
    return 0;
}
1

1 Answers

0
votes

Figure out the world bounds of your window. By that I mean, find the following:

  • When an object is in the upper-left corner (position 0,0) in the window, where is it in the world?
  • When an object is in the upper-right corner (position width,0) in the window, where is it in the world?
  • When an object is in the lower-left corner (position 0,height) in the window, where is it in the world?
  • When an object is in the lower-right corner (position width,height) in the window, where is it in the world?

When you have those values, then you can do all of your bounds checking in world space.

I should note that Box2D wasn't really designed for novices. You need to be very familiar with OOP and data structures before you're really going to be ready for Box2D. Daniel Shiffman is a very good teacher, but you might want to go back and try something a little simpler before trying to use a physics library.