News Mar 20: R.U.B.E v1.7 released. Instanciable objects!
Feb 21: Added RUBE sample loader for Cocos2d-X v3.4.
Feb 17: Funny Fists released in iOS App store and Google Play store. (YouTube video)
May 25: R.U.B.E v1.6 released. Samplers!
May 12: "On-the-fly" resource updating for Cocos2d-x
Apr 22: New blog post: Inverted pendulum control
Apr 7: On-screen logging class for Cocos2d-x
Mar 22: Downhill Supreme 2 released for iOS and Android
Jan 2: YouTube video: Making soft-body wheels in RUBE
Oct 6: Check out Supplyfront RTS, my 7dRTS entry continued.
Sep 26: R.U.B.E v1.5 released. Customizable item labels, snap-to-grid, export filtering, full-text help search.
Sep 18: Added RUBE sample loader for Cocos2d-X.
Sep 16: Updated RUBE sample loader for Cocos2d v2.
Aug 12: RUBE loader for Nape by Zeh Fernando
Aug 7: Added RUBE sample loader for SFML.
Jul 30: Try my MiniLD 7dRTS entry.
Jul 24: Added physics-driven particles tutorial.
Jul 20: New blog post: rendering solid ground (as in Downhill Supreme)
Jul 18: R.U.B.E v1.4 released. Command-line interface for batch jobs, hotkeys for scripts, better script management.
May 22: Downhill Supreme is out now! (iOS)
Apr 2: R.U.B.E v1.3 released. Collision bitplane editing, Cocos2d-iphone loader, usability improvements.
Mar 11: R.U.B.E v1.2 released. Now supports weld, friction, motor joints and automatic image reloading.
Mar 10: RUBE loader for libGDX by Tim Scott
Jan 28: New blog post: a functional combustion engine!
Jan 22: New blog post: wind tunnel
Jan 20: Added explosions tutorial.
Jan 16: Added buoyancy tutorial.
Jan 16: AndEngine sample project to load RUBE scene by Bart Hirst
Jan 14: R.U.B.E v1.1 released, now supports custom properties.
Jan 1: All basic tutorials are now available in Chinese at Huge thankyou to @OhCoder!
Dec 23: Discussion forums have been set up
Dec 4: R.U.B.E v1.0 is ready !
Dec 2: YouTube video: Box2D pendulum clock
Nov 26: New blog post: rocket platform thingy
Nov 25: Video of R.U.B.E scenes in Chipmunk.
Nov 23: A sample project to load R.U.B.E scenes into Chipmunk physics! Details here.
Nov 14: An XCode sample project to load R.U.B.E scenes on iOS is now available. Details here.
Nov 11: A Java version of b2dJson is now available, based on JBox2D.
Nov 6: A Javascript version of b2dJson based on box2dweb is now available. Demo here!
Nov 2: The full specification of the JSON format used by b2dJson can be found here: b2dJson file structure
Oct 28: YouTube video: 2-minute ragdoll in R.U.B.E Box2D editor
Sep 29: YouTube video: R.U.B.E Box2D editor usage example

Box2D C++ tutorials - Testbed structure

Last edited: July 14 2013

Chinese version -> 中文

Testbed structure

The testbed is set up in a way that allows a new test to be added efficiently. When a new test is defined, only the parts of the code which make it unique need to be written. Functions which are the same for all tests such as creating/destroying/resetting, and the control panel checkboxes and buttons, are handled by the main program code and never need to be changed.

Functions which are unique to each test - how the scene should be set up, what mouse/keyboard input should do, etc - can be specified as necessary. Before we add a test of our own, let's take a look at the life-cycle of a test.
Testbed structure
The parts in orange are where we will be adding or changing code to make our own test. To be more specific, we will create a subclass of the Test class which handles all the common features of a test, and override some functions in our subclass. Let's take a look at some virtual functions in the Test class to see what we can use.
  class Test ...{
      virtual void Step(Settings* settings);
      virtual void Keyboard(unsigned char key);
      virtual void MouseDown(const b2Vec2& p);
      virtual void MouseUp(const b2Vec2& p);
The first of these, Step() implements the stepping of the physics, and renders the scene. The other three, Keyboard(), MouseDown() and MouseUp() allow us to get some information about what the user is doing. There is no function to override to set up the scene, because this will be done in the constructor of the subclass.

Remember that the testbed has some user input defined by default, so if this default input (mouse dragging of objects etc) is enough, then you may not need to override the input functions at all. Likewise if you are not doing anything special for rendering or physics control, you don't need to override Step() either. In fact, some of the example tests in the testbed are nothing more than a constructor to set up the scene. I told you it was simple didn't I...?

There are also some class member variables accessible from the subclass that will come in handy. These variables which keep track of the main Box2D world object which all the other thingies live in, and a body which represents the ground, a very common requirement in many simulations! We'll look at what a world and a body are a little later.
      b2World* m_world;
      b2Body* m_groundBody;