2016-03-22 8 views
0

Ich benutze box2d für die Verarbeitung von den Shiffman-Tutorials. Alles, was ich tun möchte, ist die Position meiner Box zu ändern, wenn es zu einer bestimmten x-Koordinate kommt. Dies ist nicht einfach, da die x-Koordinate in der Box-Klasse aus der box2D-Welt übersetzt werden muss, in der Funktion wrap unten manipuliert und dann zurück in die box2d-Welt.Wie ändere ich die Position einer box2d Form Verarbeitung

Ich habe den folgenden Code unten erstellt. Das Problem, das ich habe, ist, wie man die zurückgegebene x-Koordinate anwendet, um die Position der Box oder des Körpers zu ändern, der die Box definiert. Ich habe versucht, einen MCVE bereitzustellen, aber box2d bläht den Code auf. Es wäre toll, wenn es einen Platz geben würde, um eine vollständige Skizze zu veröffentlichen, wenn jemand davon weiß.

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; 
} 

Antwort

0

Figur aus der Welt Grenzen des Fensters. Damit meine ich, findet die folgende:

  • Wenn ein Objekt in der oberen linken Ecke (Position 0,0) im Fenster, wo es in der Welt?
  • Wenn ein Objekt in der oberen rechten Ecke (Position width,0) im Fenster ist, wo ist es in der Welt?
  • Wenn ein Objekt in der unteren linken Ecke (Position 0,height) im Fenster ist, wo ist es in der Welt?
  • Wenn ein Objekt in der unteren rechten Ecke (Position width,height) im Fenster ist, wo ist es in der Welt?

Wenn Sie diese Werte haben, können Sie alle Ihre Grenzen in den Weltbereich einchecken.

Ich sollte beachten, dass Box2D nicht wirklich für Anfänger konzipiert war. Sie müssen mit OOP und Datenstrukturen vertraut sein, bevor Sie wirklich für Box2D bereit sind. Daniel Shiffman ist ein sehr guter Lehrer, aber Sie möchten vielleicht etwas einfacheres ausprobieren, bevor Sie versuchen, eine Physikbibliothek zu benutzen.

+0

Hallo Kevin. Mir ist klar, dass es darum geht zu überprüfen, wo mein Objekt in Bezug zur Welt steht. Das habe ich nicht gefragt. Ich fragte, wie man die X-Koordinaten der Box bekommen könnte. –

+0

@SebastianZeki Machst du das nicht schon mit diesem Code? 'Vec2 pos = box2d.getBodyPixelCoord (Körper); if (pos.x> 590) {' –

+0

Nein, das ist die x-Koordinate des Körpers. Ja, das definiert, wo die Box ist, aber wie konvertiere ich dann die pos.x in die Position der Box? –

Verwandte Themen