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;
}
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. –
@SebastianZeki Machst du das nicht schon mit diesem Code? 'Vec2 pos = box2d.getBodyPixelCoord (Körper); if (pos.x> 590) {' –
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? –