Just a quick and short update this time. After implementing the interfaces
required to create and populate the first planet of the game, I went ahead and
implemented step
methods to K14Planet
and K14Entity
, the former of which
will be responsible for updating the Box2D physics simulation, and calling the
step
methods of all active entities. The step
methods on K14Entity
are
intended to be overridden by entity subclasses, and will contain
entity-specific game logic such as handling collisions coming from Box2D
callbacks, reacting to inputs, entity ‘AI’ such as deciding where and when
to shoot, etc.
With the step
methods in place, it felt like a good time to introduce a view
controller to drive the game loop, and an associated view to render to. From an
earlier OpenGL-based iOS side project I worked on long ago (iOS 3 era) I
remembered having to mess around with custom view controllers, display links,
custom Core Animation OpenGL layers, and lots of manual OpenGL initialization
to even get just a working drawable surface, so I fully expected a long and
frustrating time-to-first-triangle. Luckily, after some initial research, I
found out Apple added a new framework called GLKit in iOS 5, which
contains a view controller and view (GLKViewController
and GLKView
) that
make it dead easy to create and initialize an OpenGL view with a delegate that
implements a callback fired at regular intervals by the view controller. There
really wasn’t anything more to it that subclassing GLKViewController
and
setting it as the the application window root view controller, and adding
a renderer class that implements the GLKViewDelegate
protocol.
The GLKViewController
schedules a callback update
that is called at a
regular interval, which is intended to update game state. After this callback,
its view delegate glkView:drawInRect
selector is called, which is where all
the OpenGL rendering code should go. I added a simple glClear
with a random
color to the view delegate render selector, some debug logging to the
K14Entity step
selectors to output their positions, and hooked up the
K14Planet step
method to the view controller by calling it from its update
selector. The view controller was configured to update at a 1 second interval.
Running the application in the simulator now produced a screen flashing random
colors, and the following in the debug console:
2014-02-21 16:13:03.278 2k14: The Game[3401:70b] Planet update: 0.00 seconds
2014-02-21 16:13:03.280 2k14: The Game[3401:70b] Entity update: 4, (-4.08, 1.42)
2014-02-21 16:13:03.280 2k14: The Game[3401:70b] Entity update: 3, (4.00, 4.25)
2014-02-21 16:13:03.280 2k14: The Game[3401:70b] Entity update: 1, (-9.00, 10.00)
2014-02-21 16:13:03.281 2k14: The Game[3401:70b] Entity update: 2, (-9.00, 2.50)
2014-02-21 16:13:04.320 2k14: The Game[3401:70b] Planet update: 1.04 seconds
2014-02-21 16:13:04.321 2k14: The Game[3401:70b] Entity update: 4, (-4.08, 1.42)
2014-02-21 16:13:04.321 2k14: The Game[3401:70b] Entity update: 3, (4.00, 4.25)
2014-02-21 16:13:04.321 2k14: The Game[3401:70b] Entity update: 1, (-9.00, 8.00)
2014-02-21 16:13:04.322 2k14: The Game[3401:70b] Entity update: 2, (-9.00, 2.50)
2014-02-21 16:13:05.320 2k14: The Game[3401:70b] Planet update: 1.00 seconds
2014-02-21 16:13:05.321 2k14: The Game[3401:70b] Entity update: 4, (-4.08, 1.42)
2014-02-21 16:13:05.321 2k14: The Game[3401:70b] Entity update: 3, (4.00, 4.25)
2014-02-21 16:13:05.322 2k14: The Game[3401:70b] Entity update: 1, (-9.00, 6.00)
2014-02-21 16:13:05.322 2k14: The Game[3401:70b] Entity update: 2, (-9.00, 2.50)
2014-02-21 16:13:06.321 2k14: The Game[3401:70b] Planet update: 1.00 seconds
2014-02-21 16:13:06.322 2k14: The Game[3401:70b] Entity update: 4, (-4.08, 1.42)
2014-02-21 16:13:06.322 2k14: The Game[3401:70b] Entity update: 3, (4.00, 4.25)
2014-02-21 16:13:06.322 2k14: The Game[3401:70b] Entity update: 1, (-9.00, 4.00)
2014-02-21 16:13:06.323 2k14: The Game[3401:70b] Entity update: 2, (-9.00, 2.50)
2014-02-21 16:13:07.321 2k14: The Game[3401:70b] Planet update: 1.00 seconds
2014-02-21 16:13:07.322 2k14: The Game[3401:70b] Entity update: 4, (-4.08, 1.42)
2014-02-21 16:13:07.322 2k14: The Game[3401:70b] Entity update: 3, (4.00, 4.25)
2014-02-21 16:13:07.322 2k14: The Game[3401:70b] Entity update: 1, (-9.00, 3.76)
2014-02-21 16:13:07.323 2k14: The Game[3401:70b] Entity update: 2, (-9.00, 2.50)
2014-02-21 16:13:08.322 2k14: The Game[3401:70b] Planet update: 1.00 seconds
2014-02-21 16:13:08.323 2k14: The Game[3401:70b] Entity update: 4, (-4.08, 1.42)
2014-02-21 16:13:08.323 2k14: The Game[3401:70b] Entity update: 3, (4.00, 4.25)
2014-02-21 16:13:08.323 2k14: The Game[3401:70b] Entity update: 1, (-9.00, 3.76)
2014-02-21 16:13:08.324 2k14: The Game[3401:70b] Entity update: 2, (-9.00, 2.50)
2014-02-21 16:13:09.322 2k14: The Game[3401:70b] Planet update: 1.00 seconds
You can see the entity step
selectors being called and updating and logging
their positions. Entity number 1 is the player spaceship, which is initially
positioned at some distance above the planet surface, and starts to fall until
it hits the ground, which you can see from the decreasing y-coordinate. All
other entities are static, so they don’t change.
Now that we have a view controller plus OpenGL view, a game loop, a planet surface, some entities and step methods tied to the game loop, the next step will be implementing a very simple initial renderer to see the game world on-screen in the simulator, instead of as a debug log. This is what I’ll be working on the coming week.
Development scoreboard
Most of the time spent since the last post went into reading up on GLKit, to
actually add the step
methods and the GLKViewController
only took about
2 hours, which brings the total development time to approximately 8 hours. The
SLOC count (source lines excluding comments and whitespace) comes in at about
300 lines.