我在Shiffman教程中使用box2d进行处理。我想要做的就是改变我的盒子在某个x坐标时的位置。这并不容易,因为box类中的x坐标必须从box2D世界转换,在下面的函数wrap
中操作,然后再回到box2d世界。
我在下面创建了以下代码。我遇到的问题是如何应用返回的x坐标来改变盒子的位置,或者定义盒子的体。我试图提供MCVE,但是box2d会破坏代码。如果有人知道它,那么如果有一个地方可以发布完整的草图,那就太好了。
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;
}
答案 0 :(得分:0)
弄清楚窗口的世界范围。我的意思是,找到以下内容:
0,0
)时,它在世界的哪个位置?width,0
)时,它在世界的哪个位置?0,height
)时,它在世界的哪个位置?width,height
)时,它在世界上的哪个位置?如果您拥有这些值,那么您可以在世界空间中检查所有边界。
我应该注意到Box2D并不是专为新手设计的。在你真正为Box2D做好准备之前,你需要非常熟悉OOP和数据结构。 Daniel Shiffman是一位非常优秀的老师,但在尝试使用物理库之前,你可能想回去尝试一些更简单的东西。