処理と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());
}
}
}