我正在使用Processing和Box2d制作2D游戏。在我的游戏中,我有一个对象targetBox,它是Box的实例。在游戏开始时,出现targetBox并停留在跷跷板上。游戏的目标是使用吊索射击在跷跷板上击打其他盒子,并将targetBox发射到壁架上。如果玩家错过壁架,则该框将落在某个区域上,那在99%的时间中将不会成为跷跷板。

我正在尝试实现允许玩家通过按“ r”或“ R”将盒子重置到其原始位置(在跷跷板上)的功能。

targetBox最初通过draw()功能添加到box2d世界:targetBox.display(true);

如果按'r'或'R'...

if(key == 'R' || key == 'r')
{
    targetBox.reset();
}


... Box类的调用重置功能:

public void reset()
{
    body.setTransform(new Vec2(width/2+75, height-70), body.getAngle());
    // width and height are same as values given to targetBox when it's created
}


在游戏中,当按“ r”或“ R”时,targetBox会消失并且不会设置为原始位置。我对处理或box2d不太熟悉。有人知道为什么会这样吗?帮助表示赞赏。

编辑-添加了更多代码:

public class Main extends PApplet
{

public static void main(String[] args)
{
    PApplet.main(new String[] { "Main" });
}

PBox2D box2d;
Box targetBox;

public void setup()
{
    size(800, 600);
    smooth();
    // initialize box2d and world
    box2d = new PBox2D(this);
    box2d.createWorld();
    // targetBox to get on ledges
    targetBox = new Box(width/2+75, height-70);
}

public void draw()
{
    background(255);
    // always step through time
    box2d.step();
    // draw the targetBox
    targetBox.display(true);
}

public void keyPressed()
{
    if(key == 'R' || key == 'r')
    {
        targetBox.reset();
    }
}

// a class that represents a box
class Box
{
    // We need to keep track of a Body and a width and height
    Body body;
    FixtureDef fd;
    float w;
    float h;

    // Constructor
    Box(float X, float Y)
    {
        float x = X;
        float y = Y;
        w = 24;
        h = 24;
        // Add the box to the box2d world
        makeBody(new Vec2(x,y),w,h);
    }

    // This function removes the particle from the box2d world
    public void killBody()
    {
        box2d.destroyBody(body);
    }

    boolean contains(float x, float y)
    {
        Vec2 worldPoint = box2d.coordPixelsToWorld(x, y);
        Fixture f = body.getFixtureList();
        boolean inside = f.testPoint(worldPoint);
        return inside;
    }

    // Drawing the box
    public void display(boolean isFirst)
    {
        // We look at each body and get its screen position
        Vec2 pos = box2d.getBodyPixelCoord(body);
        // Get its angle of rotation
        float a = body.getAngle();

        if(isFirst == true)
        {
            rectMode(PConstants.CENTER);
            pushMatrix();
            translate(pos.x,pos.y);
            rotate(a);
            fill(255,0,0);
            stroke(0);
            rect(0,0,w,h);
            popMatrix();
        }
        else
        {
            rectMode(PConstants.CENTER);
            pushMatrix();
            translate(pos.x,pos.y);
            rotate(a);
            fill(175);
            stroke(0);
            rect(0,0,w,h);
            popMatrix();
        }
    }

    // This function adds the rectangle to the box2d world
    public void makeBody(Vec2 center, float w_, float h_)
    {
        // Define and create the body
        BodyDef bd = new BodyDef();
        bd.type = BodyType.DYNAMIC;
        bd.position.set(box2d.coordPixelsToWorld(center));
        body = box2d.createBody(bd);

        // 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
        fd = new FixtureDef();
        fd.shape = sd;
        // Parameters that affect physics
        fd.density = 2.5f;
        fd.friction = 2f;
        fd.restitution = 0.2f;

        body.createFixture(fd);
        //body.setMassFromShapes();

        // Give it some initial random velocity
        body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5)));
        body.setAngularVelocity(random(-5, 5));
    }

    // reset box to initial position
    public void reset()
    {
        body.setTransform(new Vec2(width/2+75, height-70), body.getAngle());
    }
}
}

最佳答案

我研究了此函数,它以世界空间形式获取坐标。这意味着,如果您使用屏幕表格坐标,则不会出现错误,但是它将在box2d世界中的坐标处传送它。您必须将其以屏幕形式转换为空间坐标,如下所示:

    body.setTransform(box2d.coordPixelsToWorld(x,y),0);

10-04 13:26