2
\$\begingroup\$

I'm implementing a camera in my game. It worked for regular objects, but I began using Box2D and obviously things changed a bit. I have a Body object that I want to draw at the center of the screen. Basically what I'm doing is subtracting the viewportX and viewportY from the Body's position.

The relevant code:

public void paint(Graphics2D g, int viewportX, int viewportY) { Transform xf = new Transform(); // m_body is the Body object xf.set(m_body.getTransform()); // Here I attempt to take the transform and alter it by the viewportX and // Y, which are something like (-240, -150). It's negative because an // object at (500, 300) would be displayed at (160, 150) after the // subtraction. DrawUtils.toScale(), is just how I convert units from // JBox2D units to my units. Vec2 v = Transform.mulTrans(xf, new Vec2(DrawUtils.toScale(-viewportX), DrawUtils.toScale(-viewportY))); // Set the new transform to the new vector. Keep the old angle. xf.set(v, xf.q.getAngle()); g.setColor(Color.white); // I know the following method works correctly. It displays my object, // just doesn't follow it. for (Fixture f = m_body.getFixtureList(); f != null; f = f.getNext()) DrawUtils.drawShape(f, xf); } 

I don't want to alter the actual physics position of the object, just its graphical position such that it's displayed it in the center.

\$\endgroup\$
2
  • 2
    \$\begingroup\$ You shouldn't have your drawing logic tied to your physics data. The drawing data should simply pull positional data from Box2D but be able to render if Box2D didn't exist. Box2D is designed as a simulator and the further you get away from that (teleporting objects around and back to draw them) the more issues you are going to run into. Having both your objects and the Box2D ones are best with your objects simply pulling from the simulated ones Box2D is handling. \$\endgroup\$ Commented Jul 16, 2013 at 13:54
  • \$\begingroup\$ I'm not teleporting anything. Like I said, I'm just drawing it relative to the screen. This is a camera object. Nothing is being moved, the graphical representation is simply being adjusted so that it is in the middle of the screen. \$\endgroup\$ Commented Jul 16, 2013 at 21:59

1 Answer 1

1
\$\begingroup\$

Apparently my method wasn't too far off. Here is the adjustment:

Vec2 n = xf.p.sub(new Vec2(DrawUtils.toScale(-viewportX), DrawUtils .toScale(-viewportY))); xf.set(n, xf.q.getAngle()); 
\$\endgroup\$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.