1

処理とbox2dを使って2Dゲームを作っています。私のゲームにtargetBoxは、のインスタンスであるオブジェクトがありますBox。ゲームの開始時targetBoxに表示され、シーソーで休みます。ゲームの目的は、スリング ショットを使用して、シーソーで他のボックスを発射targetBoxし、棚に発射することです。プレイヤーが棚を逃した場合、ボックスはエリアに着陸しますが、99% の確率でシーソーにはなりません。

「r」または「R」を押すことで、プレーヤーがボックスを元の場所 (シーソー上) にリセットできるようにする機能を実装しようとしています。

targetBox最初に関数内の box2d ワールドに追加されますdraw()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());
    }
}
}
4

1 に答える 1

2

この関数を調べたところ、ワールド空間形式の座標をとります。これは、スクリーン フォーム座標を使用する場合、エラーが発生しないことを意味しますが、座標が box2d ワールド内のどこにあるかにテレポートします。次のように、画面形式の目的の座標を空間座標に変換する必要があります。

    body.setTransform(box2d.coordPixelsToWorld(x,y),0);
于 2016-12-01T17:04:53.017 に答える