如何更改box2d形状处理的位置

时间:2016-03-22 11:20:26

标签: processing box2d jbox2d

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

1 个答案:

答案 0 :(得分:0)

弄清楚窗口的世界范围。我的意思是,找到以下内容:

  • 当一个物体位于窗口的左上角(位置0,0)时,它在世界的哪个位置?
  • 当一个物体位于窗口的右上角(位置width,0)时,它在世界的哪个位置?
  • 当一个物体位于窗口的左下角(位置0,height)时,它在世界的哪个位置?
  • 当一个物体位于窗口的右下角(位置width,height)时,它在世界上的哪个位置?

如果您拥有这些值,那么您可以在世界空间中检查所有边界。

我应该注意到Box2D并不是专为新手设计的。在你真正为Box2D做好准备之前,你需要非常熟悉OOP和数据结构。 Daniel Shiffman是一位非常优秀的老师,但在尝试使用物理库之前,你可能想回去尝试一些更简单的东西。