2016-03-22 41 views
0

我使用box2d从Shiffman教程进行处理。我想要做的就是当我的盒子到达某个x坐标时改变它的位置。这并不容易,因为box类中的x坐标必须从box2D世界转换,在下面的函数wrap中操作,然后返回到box2d世界。如何更改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),它在世界上哪里?
  • 当窗口中的物体位于右上角(位置width,0)时,它在世界上哪里?
  • 当窗口中的物体位于左下角(位置为0,height)时,它在世界的哪个位置?
  • 当窗口中的物体位于右下角(位置width,height)时,它在世界上哪里?

当你有这些值,那么你可以做世界上所有的边界检查。

我应该注意到Box2D并不是真正为新手设计的。在您准备好迎接Box2D之前,您需要非常熟悉OOP和数据结构。丹尼尔Shiffman是一个非常好的老师,但你可能想回去尝试一些简单的事情,然后尝试使用物理库。

+0

嗨凯文。我意识到这是关于检查我的对象与世界的关系。这不是我所问的。我在问如何获得盒子的x坐标。 –

+0

@SebastianZeki你不是已经用这个代码做了吗? 'Vec2 pos = box2d.getBodyPixelCoord(body); if(pos.x> 590){' –

+0

没有那是身体的x坐标。是的,它定义了框的位置,但是如何将pos.x转换为框的位置? –