Yes, it's been way too long since anything was posted on the blog, but the amount of blog activity is generally inversely proportional to how intensely I'm working on the game!
I'm pleased to report that a closed alpha testing session is currently taking place, which should help iron out any system-related issues. Things are looking good so far for the main game engine being stable over a variety of hardware configurations.
After a few iterations of testing and improvement there will be a general alpha release posted on this blog, so watch this space!
This is the blog of Brainworm Software, which currently concentrates on the development of the indie game Juggernaut.
Sunday, 30 October 2011
Sunday, 14 August 2011
Back from holidays!
The last month has been a little slow on development as I've had a couple of weeks of holiday, leaving me feeling refreshed and possibly even a little tanned.
The most important recent update is that scripted animated objects are now up and running properly. This means that doors (and any other environment object) may be animated by script strings, meaning that proper game interaction is now possible to generate, such as the player's craft needing to move to a specific location within the world and activate an object (which then executes the script) in order to open the door. These scripted objects are properly integrated into the physics engine, such that they impart appropriate force to any dynamic objects they collide with during their animations.
Now, the primary focus is on further development of the AI algorithms for the swarm, such that they can spot the player's ship and attack appropriately, including chasing them through the environment and performing proper route-finding. The basic navigation node structure is already complete and searchable, the main weakness is the lowest-level control i.e. correctly navigating between nodes without going out of bounds and colliding with the world.
I'm currently holding off creating a new video for a while until there are enough visible differences to make the recent updates apparent. Also, I had it pointed out to me recently that in all the videos so far I've been playing the game really badly (purposefully), mainly to show off collision particle effects etc., but I'll make sure on the next one to actually fly around normally!
The most important recent update is that scripted animated objects are now up and running properly. This means that doors (and any other environment object) may be animated by script strings, meaning that proper game interaction is now possible to generate, such as the player's craft needing to move to a specific location within the world and activate an object (which then executes the script) in order to open the door. These scripted objects are properly integrated into the physics engine, such that they impart appropriate force to any dynamic objects they collide with during their animations.
Now, the primary focus is on further development of the AI algorithms for the swarm, such that they can spot the player's ship and attack appropriately, including chasing them through the environment and performing proper route-finding. The basic navigation node structure is already complete and searchable, the main weakness is the lowest-level control i.e. correctly navigating between nodes without going out of bounds and colliding with the world.
I'm currently holding off creating a new video for a while until there are enough visible differences to make the recent updates apparent. Also, I had it pointed out to me recently that in all the videos so far I've been playing the game really badly (purposefully), mainly to show off collision particle effects etc., but I'll make sure on the next one to actually fly around normally!
Sunday, 10 July 2011
Token post!
OK, I say I'll do more regular updates and then immediately fail to post anything for a week. Welcome to OppositeLand, population me.
Work is still ongoing, worry ye not, with the focus on improving the scripting system and I/O for the more complex objects within the world map. Also, within the main asset management system there's now an overall object dictionary that handles everything from physics objects to particle fountains, allowing them to be spawned easily in a unified way.
So yes, at the moment it's all core engine work, but this is all necessary (except for a few sidetracks) in order to achieve my current main goal of scriptable game objects.
Work is still ongoing, worry ye not, with the focus on improving the scripting system and I/O for the more complex objects within the world map. Also, within the main asset management system there's now an overall object dictionary that handles everything from physics objects to particle fountains, allowing them to be spawned easily in a unified way.
So yes, at the moment it's all core engine work, but this is all necessary (except for a few sidetracks) in order to achieve my current main goal of scriptable game objects.
Thursday, 30 June 2011
The start of a series of shorter updates.
Up until now I've tended to try and get out one decent-length blog post a week during development, but I think I may change that pattern to trying to post something short today to give a quick snapshot of what I'm working on at any given point.
The main thing I'm up to at the moment is working on the world scripting - my primary goal is to create an animated door that can open/close based on interaction with a world object. I've already gotten the main scripting up and running, such that interacting with a destroyed ship will update the amount of resources you have, give you a new ship component or start a given bit of narrative, but this push towards having a properly dynamic environment will make a lot of difference.
The custom scripting language and the asset management system are tightly integrated. Here's an example of the current scripting that is implemented and working:
"$Timer #3.0 $ZoneResource1 #OFF"
The $ prefix is used to reference an asset that exists in the global asset management framework, and the # is used to indicate a constant value. In this case, there is a special asset called 'Timer' that allows scripts to be called with a specific delay; the #3.0 indicates that the delay should be 3 seconds, and the rest of the parameters '$ZoneResource1 #OFF' are the script to execute once the timer period has completed. ZoneResource1 is another interaction zone, and the #OFF value indicates that it should be rendered inactive after the call. If the last two parameters were replaced by 'script:ExampleScript', the asset management system would check to see if the ExampleScript asset were already in memory and, if not, load it in from a specific default directory.
[Foreseeing potential questions on this issue]
Why didn't I use Python? Because BOLLOCKS, that's why.
Of course, any time you try to do X in development, you tend to find yourself doing Y, Z and occasionally α to support getting X to work, as well as tidying up other bits that you come across while doing Y and Z. As a result, the damage callback system has been given a bit of an overhaul in the last day or so.
Right now, I'm working on an object factory so that a wide variety of different object types may be simply loaded, allowing enemy spawners, physics objects, debris, animated objects etc. to be loaded by the same framework. This will then mean that dynamic components (such as the opening/closing door) will be automatically created and assigned to the right list, and then may be scripted (after a wee bit of work on animation).
[Edit: OK, so that didn't turn out to be so short].
The main thing I'm up to at the moment is working on the world scripting - my primary goal is to create an animated door that can open/close based on interaction with a world object. I've already gotten the main scripting up and running, such that interacting with a destroyed ship will update the amount of resources you have, give you a new ship component or start a given bit of narrative, but this push towards having a properly dynamic environment will make a lot of difference.
The custom scripting language and the asset management system are tightly integrated. Here's an example of the current scripting that is implemented and working:
"$Timer #3.0 $ZoneResource1 #OFF"
The $ prefix is used to reference an asset that exists in the global asset management framework, and the # is used to indicate a constant value. In this case, there is a special asset called 'Timer' that allows scripts to be called with a specific delay; the #3.0 indicates that the delay should be 3 seconds, and the rest of the parameters '$ZoneResource1 #OFF' are the script to execute once the timer period has completed. ZoneResource1 is another interaction zone, and the #OFF value indicates that it should be rendered inactive after the call. If the last two parameters were replaced by 'script:ExampleScript', the asset management system would check to see if the ExampleScript asset were already in memory and, if not, load it in from a specific default directory.
[Foreseeing potential questions on this issue]
Why didn't I use Python? Because BOLLOCKS, that's why.
Of course, any time you try to do X in development, you tend to find yourself doing Y, Z and occasionally α to support getting X to work, as well as tidying up other bits that you come across while doing Y and Z. As a result, the damage callback system has been given a bit of an overhaul in the last day or so.
Right now, I'm working on an object factory so that a wide variety of different object types may be simply loaded, allowing enemy spawners, physics objects, debris, animated objects etc. to be loaded by the same framework. This will then mean that dynamic components (such as the opening/closing door) will be automatically created and assigned to the right list, and then may be scripted (after a wee bit of work on animation).
[Edit: OK, so that didn't turn out to be so short].
Tuesday, 14 June 2011
Because banging can be fun, can't it?
OK, the title is a reference to this video (RIP Roy Skelton), which is marginally justified due to this post including physical collisions between convex objects.
Since the last post quite a few significant updates have been made, which are best expressed through the medium of bullet points.
Since the last post quite a few significant updates have been made, which are best expressed through the medium of bullet points.
- The convex object collision detection/physics is working well (huzzah!)
- Springs (currently massless) have been implemented in the physics engine, which will form the basis of the tractor beam with Juggernaut.
- The damage and destruction framework has been significantly upgraded to include penetration levels for both laser and projectile weapons. For example, in the video you will see that the laser weapon immediately terminates upon hitting the debris, but passes through several Scourge enemies before terminating. A larger penetration factor for a weapon will improve its effectiveness against multiple enemies, but not against single tougher enemies.
- Each object can now have a convex collision shape associated with it that will be intersected with by laser + arc weaponry. This replaces the bounding-circle based object/object collision.
- Upgrades the asset management framework that allows resource files containing multiple asset types to be loaded in transparently. Dull, but very handy ;)
Sunday, 5 June 2011
Environmental decoration: instanced cilia
As well as all the ongoing work on the physics engine (the convex polygon routines now work except in a couple of extreme cases that I'm fixing), I've taken a little time out to make things more pretty. In this case, I've added some animated 'cilia' that will be used to add dynamic motion to some of the infested areas. The initial version of this is shown in the video below, although I've already updated the actual graphics to add a small bright tip to each strand, stopping it from just looking like grass.
Although there may be thousands of cilia on-screen at any one time, all the work is done by the GPU using immutable buffers. A specialised vertex shader adds the sinusoidal animation based on a time value supplied via a shader variable, as well as adding a small size variation. Also, rather than manually defining the position/angle of each cilia in a level (which would be quite memory-hungry), areas of cilia are just defined by a straight line with a normal.
To further improve the effect, cilia further away from the camera have their colour dimmed in order to provide a depth cue.
Although there may be thousands of cilia on-screen at any one time, all the work is done by the GPU using immutable buffers. A specialised vertex shader adds the sinusoidal animation based on a time value supplied via a shader variable, as well as adding a small size variation. Also, rather than manually defining the position/angle of each cilia in a level (which would be quite memory-hungry), areas of cilia are just defined by a straight line with a normal.
To further improve the effect, cilia further away from the camera have their colour dimmed in order to provide a depth cue.
Sunday, 29 May 2011
Stable 2D Contact Points between Convex Objects
The purpose of this post is to describe a bit about how the 2D collision detection works in Juggernaut. Some of it may be overly basic, and some bits may skip massively over other aspects, but it does cover a few points (particularly on convex object collision detection) that I didn't find directly anywhere else on the web, and should at least provide a good overview.
In order to integrate a shape into the physics engine, you need to be able to detection intersections between that shape and the others supported by the collision detection engine.
A contact point is defined by the intersection point between the two objects, the collision normal, and the penetration depth. The circle/circle case is the simplest, as you just take the vector between the two circle centres and compare the magnitude to the sum of the radii.
For the line/circle case you need to create the function closestPointOnLine( Point A, Line B ), which will determine the closest point on the line segment B to the point A, which may either be a point along B or one of the endpoints of B. Intersection/non-intersection may then be determined by comparison of the distance of the circle centre to the closest point on B with the radius of the circle.
For a more in-depth look (including the actual maths) this site is a very useful resource.
The key concepts and algorithms required in order to solve this problem are:
- The Minkowski difference (see here).
- The Gilbert–Johnson–Keerthi distance algorithm (or just GJK algorithm)
- Alternatively to GJK, a Separating Axis Theorem-based approach such as the Lin-Canny algorithm.
- The Expanding Polytope Algorithm, which may be used in conjunction with GJK in order to improve performance on deep penetrations.
The Juggernaut convex shape handler is based around GJK, and I'll mention a couple of things that I've found about it.
So, the solution that I've come up with is as follows: for the shape where only one vertex is returned by GJK, check both edges that are connected to it for contact points. This is almost certainly not the only solution to this problem, but it's the only one I've found that produces stable results thus far. This is demonstrated in the diagram below:
In order to integrate a shape into the physics engine, you need to be able to detection intersections between that shape and the others supported by the collision detection engine.
Simple Primitive Intersection
Up until now, Juggernaut has only properly supported circle/circle and circle/line interactions: the main world brush is defined by a series of straight lines (organised into a hierarchical tree structure for efficient collision), and the objects themselves are defined by a series of bounding circles. These are the simplest types of collision, as there is only ever one possible contact point between the primitives (to clarify, circles can have two actual intersections with a line/other circle, but only a single contact point is required to resolve them).![]() |
| A very rough image showing example contact points/normals for circle/line and circle/circle collision detection. By convention, the normals are defined as pointing into object A. |
For the line/circle case you need to create the function closestPointOnLine( Point A, Line B ), which will determine the closest point on the line segment B to the point A, which may either be a point along B or one of the endpoints of B. Intersection/non-intersection may then be determined by comparison of the distance of the circle centre to the closest point on B with the radius of the circle.
For a more in-depth look (including the actual maths) this site is a very useful resource.
Convex Primitive Intersection
So, for the simple primitive case, the contact point information can be calculated directly. However, what if we want to have a more complex shape, such as an arbitrary convex polygon? Convex polygons are selected as dealing directly with non-convex polygons is much more difficult, and it is always possible to decompose non-convex polygons into multiple convex polygons. In this case, working out whether the objects intersect is much more difficult, and a naive approach would probably involve comparing every edge in shape A with every edge in shape B. Luckily, this is not necessary!The key concepts and algorithms required in order to solve this problem are:
- The Minkowski difference (see here).
- The Gilbert–Johnson–Keerthi distance algorithm (or just GJK algorithm)
- Alternatively to GJK, a Separating Axis Theorem-based approach such as the Lin-Canny algorithm.
- The Expanding Polytope Algorithm, which may be used in conjunction with GJK in order to improve performance on deep penetrations.
The Juggernaut convex shape handler is based around GJK, and I'll mention a couple of things that I've found about it.
- It works absolutely amazingly for determining whether objects intersect or not.
- If the objects *do* intersect, the raw GJK results can be unreliable, as the closest simplex edge won't necessarily correspond to an edge on the convex hull of the Minkowski difference. To ensure that this always happens, you'll need to use the Expanding Polytope Algorithm in these cases for robust behaviour.
- Both Shape A vertices are identical and the Shape B vertices define an outside edge of B.
- Both Shape B vertices are identical and the Shape A vertices define an outside edge of A.
- Both the Shape A and Shape B vertices define outside edges of A and B, respectively. This will only really occur when the edges are very close to parallel, and can also be associated with a triangular simplex of zero are. Also, this may or may not occur in exactly the same situation depending on the initially selected simplex point.
- The vertices do something else and define non-external edges of A and/or B (may happen with raw GJK, but not GJK+EPA).
So, the solution that I've come up with is as follows: for the shape where only one vertex is returned by GJK, check both edges that are connected to it for contact points. This is almost certainly not the only solution to this problem, but it's the only one I've found that produces stable results thus far. This is demonstrated in the diagram below:
Monday, 23 May 2011
Sunday, 22 May 2011
More dynamic world environments.
As part of the upgraded environment there will be free-floating debris found in areas, which can either be destroyed or, coupled with the tractor beam, employed as a weapon.
This video shows the prototype implementation, where each piece of debris is circular and coloured a dreadful orange. However, they do properly collide with each other in a realistic way using the physics engine. Prior to this point, the complexity of the physics engine was a little unnecessary when only interacting a single object with a set of immovable objects.
The next step is to upgrade these large debris pieces such that they are an arbitrary polygon, rather than just circular. Also, improving their graphics wouldn't go amiss, either! I must confess to being tempted to texturemap a space hopper face onto them, though :)
This video shows the prototype implementation, where each piece of debris is circular and coloured a dreadful orange. However, they do properly collide with each other in a realistic way using the physics engine. Prior to this point, the complexity of the physics engine was a little unnecessary when only interacting a single object with a set of immovable objects.
The next step is to upgrade these large debris pieces such that they are an arbitrary polygon, rather than just circular. Also, improving their graphics wouldn't go amiss, either! I must confess to being tempted to texturemap a space hopper face onto them, though :)
Saturday, 21 May 2011
Moar better collision detection.
Up until now, the only collision detection between the player's ship and the environment had been with the main outline of the world generated by the initial brush carving, which is a relatively simple shape. However, for a properly completed environment there will also be a lot flair (decorative) objects adorning the environment, and it's also important to be able to collide with them.
In addition, the laser impact effects have also been updated, with the impact explosion orientation now being determined by the normal of the impacted surface. It also kicks up some debris particle effects, although these are currently the same regardless of the surface type being hit, and thus look odd for some of the alien flora.
The first part is, for a given 2D (or basic 3D) mesh, generating a 2D vector brush of the outline. This abridged version is as follows:
In addition, the laser impact effects have also been updated, with the impact explosion orientation now being determined by the normal of the impacted surface. It also kicks up some debris particle effects, although these are currently the same regardless of the surface type being hit, and thus look odd for some of the alien flora.
Flair intersection
There were two parts to getting this to work, both of which drew heavily on my existing codebase for creating and merging vector brushes (which has held up surprisingly well, given that there are a few bits that could really do with improving).The first part is, for a given 2D (or basic 3D) mesh, generating a 2D vector brush of the outline. This abridged version is as follows:
- Identify all edges within the mesh. This is something that needs calculating, as by default meshes are stored in terms of vertices/triangles.
- Identify the set of triangles that use each edge (the set must at least of size 1, else where the hell did the edge come from?)
- Determine whether each edge is potentially part of the outline. If an edge has only one triangle associated with it, then it's always an outline edge. For multiple triangles, it is an outline edge if the third point of each triangle (i.e. that not part of the edge) all lie on the same side of the line.
- Throw out all the non-outline-edge edges.
- Starting on any outline edge, following connected edges around until you come back to the original edge in a loop. In normal situations (apart from some awkward 3D configurations) there will never be any branching to worry about that. Add that as a vector path.
- Repeat 5. for any currently unused outline edges until all are accounted for.
- Merge the set of vector paths together to form the final outline (which is a whole different bunch of algorithms).
Friday, 20 May 2011
Rapture Investment Opportunity!
So, if there's anyone out there who believes that the Rapture is going to occur tomorrow, I'd like to offer the last minute opportunity to divest yourself of some wealth and give it to a cheerful heathen. Not only will it aid indie game development, but by reducing your level of wealth you may help avoid the camel/eye of a needle/Heaven problem*.
*Warning: money not returned in the unlikely event that Rapture does not occur.
*Warning: money not returned in the unlikely event that Rapture does not occur.
Sunday, 15 May 2011
Progress Update
Oops, it's been over a week since the last update! Time really does fly when you're coding away.
OK, the main things I've been working on over the last week or so are as follows:
There's still some tidying up and improvement to do on this aspect, but it's sufficient for now. Have a peek:
Anyway, something that's been niggling at me since I upgraded to using the physics engine is the old hierarchical collision detection, which used a binary tree in order to calculate collisions with each triangle in the world mesh.
However, in reality, using all the triangles was quite wasteful and pointless, as the only important bits are the lines that form the outline of the world itself, and the corresponding bounding circles/bounding boxes were much larger than they needed to be. Since the world is carved from an overall vector brush, though, this outline is directly available, and thus I've refactored the code to produce a collision tree from a set of lines rather than triangles, leading to an overall improvement in efficiency and niceness. This is one of those things that won't have any directly visible effect, but makes further development easier.
OK, the main things I've been working on over the last week or so are as follows:
Player/World collision
This is now basically done, along with player ship damage and particle effects at collision points. The particle effects are a mixture of sparks and rock being disturbed from the walls, which looks quite nice when scraping along the side. It also need a good corresponding sound effect!There's still some tidying up and improvement to do on this aspect, but it's sufficient for now. Have a peek:
Scripting zones
In order to make a game with an interesting and interactive world, there need to be scriptable zones within the world that can do a variety of things, from bringing up a certain story conversation, spawning some enemies, changing world states (e.g. opening/closing doors) and a lot of other things. The basic scripting capability now exists, and is embedded within the main global asset management system. At the moment its capabilities are pretty limited, but these will rapidly expand as I add more scripting interfaces.Upgraded collision detection
For anyone unfamiliar with collision detection, the basic problem is one of testing your game object's bounding shape (a circle, in the simple case) against all the objects in the world. Now, if you have 10000 primitives (e.g. lines/triangles) in your world, the easiest way is just to test directly against each of the 10000 objects, leading to 10000 geometry tests per object. However, using a hierarchical (tree-based) model you can achieve this in around Log2(10000) = 13 tests, allowing much greater efficiency. Even better, if you increase the number of primitives by a factor of 2, you'll only need one more test. This scaling allows testing against very complex world geometry in an efficient fashion.Anyway, something that's been niggling at me since I upgraded to using the physics engine is the old hierarchical collision detection, which used a binary tree in order to calculate collisions with each triangle in the world mesh.
However, in reality, using all the triangles was quite wasteful and pointless, as the only important bits are the lines that form the outline of the world itself, and the corresponding bounding circles/bounding boxes were much larger than they needed to be. Since the world is carved from an overall vector brush, though, this outline is directly available, and thus I've refactored the code to produce a collision tree from a set of lines rather than triangles, leading to an overall improvement in efficiency and niceness. This is one of those things that won't have any directly visible effect, but makes further development easier.
Tuesday, 3 May 2011
Collision Physics Mk. 1
OK, the basic version of the world collision physics is now up and running. This takes the overall bounding circle of the player's ship and uses that as a collision object, as shown in the video below.
However, there's still work to do in order to:
- Perform physics collisions with each ship component.
- Apply damage to the components based upon the collision energy.
- Add visual effects, such as a spark stream if the ship is scraping along the side of a wall.
Basic Environment Collision Physics from Darren Myatt on Vimeo.
However, there's still work to do in order to:
- Perform physics collisions with each ship component.
- Apply damage to the components based upon the collision energy.
- Add visual effects, such as a spark stream if the ship is scraping along the side of a wall.
Basic Environment Collision Physics from Darren Myatt on Vimeo.
Monday, 2 May 2011
The ship editor in action:
This video demonstrates the initial drag/drop ship editor interface in action. It shows that each ship component has a number of slots that can be used to attach either other structural components or weapons.
This video starts after the two wing elements and one of the engines have already been added (due to FRAPS time restrictions) - you then see the addition of a couple of power generators, which provide increased power recharge rate and power maximum (which is consumed by firing weapons), a missile launcher and a couple of standard energy cannons.
The angle of any of these components may be changed by dragging with the right mouse button, so you can create rear-facing/side facing weaponry as desired. As development progresses, there will also be computer-controlled turrets that will auto-target enemies.
This video starts after the two wing elements and one of the engines have already been added (due to FRAPS time restrictions) - you then see the addition of a couple of power generators, which provide increased power recharge rate and power maximum (which is consumed by firing weapons), a missile launcher and a couple of standard energy cannons.
The angle of any of these components may be changed by dragging with the right mouse button, so you can create rear-facing/side facing weaponry as desired. As development progresses, there will also be computer-controlled turrets that will auto-target enemies.
Juggernaut Ship Editor Demo Video from Darren Myatt on Vimeo.
Sunday, 1 May 2011
Time for reflection...
OK, while I'm putting off a bit of particularly annoying refactoring, I thought it may be a good time to post a quick reflection on how far Juggernaut (and I) have come so far.
I quit my previous job (as a technical consultant at a defence subcontractor) on the very first day back this year, because I simply couldn't do it any more. Monetarily it was a pretty good job, which is how I can now afford to do this, but I got no satisfaction from it and the pressure nearly drove me crazy.
I'd been working on the code that became the Juggernaut engine for about a year in my spare time (including long periods of nothing) before then: it initially started out as the engine for a 3D game named Super Robot Harpsichord which, who knows, may one day still get made. However, it quickly became clear that attempting to create a full 3D game on my own was completely infeasible in terms of art assets, at which point I came up with the basic idea for Juggernaut, although it has evolved a lot since the initial conception.
MrMacguffin), but I am trying to keep to deadlines, and progress has been rapid.
My original plan was to make a first demo in May, and I think I'm still reasonably on target for that, although it's now going to be the end of May. It's certainly going to be an alpha release rather than a beta, but hopefully it should demonstrate enough of the concepts of the full game to get people interested.
I quit my previous job (as a technical consultant at a defence subcontractor) on the very first day back this year, because I simply couldn't do it any more. Monetarily it was a pretty good job, which is how I can now afford to do this, but I got no satisfaction from it and the pressure nearly drove me crazy.
I'd been working on the code that became the Juggernaut engine for about a year in my spare time (including long periods of nothing) before then: it initially started out as the engine for a 3D game named Super Robot Harpsichord which, who knows, may one day still get made. However, it quickly became clear that attempting to create a full 3D game on my own was completely infeasible in terms of art assets, at which point I came up with the basic idea for Juggernaut, although it has evolved a lot since the initial conception.
MrMacguffin), but I am trying to keep to deadlines, and progress has been rapid.
My original plan was to make a first demo in May, and I think I'm still reasonably on target for that, although it's now going to be the end of May. It's certainly going to be an alpha release rather than a beta, but hopefully it should demonstrate enough of the concepts of the full game to get people interested.
The first high quality Alpha video!
Yes, it's finally here, I've managed to make a video that doesn't look like arse! Alas, the free version of FRAPS only allows clips of 30 seconds, and this video doesn't necessarily show off anything to the best effect, and the sound is knackered, but it's at least a start. Now that I'm confident it produces good results, I'll upgrade so that I can record full videos.
The video demonstrates the laser weapons and the force-applying missiles with space-warping effect. There's also going to be a graphical explosion effect for the missiles, but that hasn't been implemented yet.
Also, note that the Scourge aren't bothering to attack the player in this video as the AI is just set to do a patrol loop. In the actual game they'll turn and start following/attacking the player once spotted.
Juggernaut Alpha Demo 1 from Darren Myatt on Vimeo.
The video demonstrates the laser weapons and the force-applying missiles with space-warping effect. There's also going to be a graphical explosion effect for the missiles, but that hasn't been implemented yet.
Also, note that the Scourge aren't bothering to attack the player in this video as the AI is just set to do a patrol loop. In the actual game they'll turn and start following/attacking the player once spotted.
Juggernaut Alpha Demo 1 from Darren Myatt on Vimeo.
FRAPS vs CamStudio - Fight!
Up until now I've been using CamStudio in order to produce videos, as I'd used it before on my Neuromantic post-doctoral project to produce tutorial videos. However, as you've seen, the results thus far have not been so great.
Luckily, my friend Mark reminded me of the existence of FRAPS recently, and having downloaded it and done a quick test I can confirm that FRAPS is much, *much* better, and can easily handle 30FPS capture without slowing the game down.
So, you can all expect some much higher quality Alpha videos soon! Huzzah!
Luckily, my friend Mark reminded me of the existence of FRAPS recently, and having downloaded it and done a quick test I can confirm that FRAPS is much, *much* better, and can easily handle 30FPS capture without slowing the game down.
So, you can all expect some much higher quality Alpha videos soon! Huzzah!
Saturday, 30 April 2011
Juggernaut Development Update.
My new keyboard arrived today that should help streamline the development of Juggernaut:
It'll be so much easier having the 1 key to the right of the 0, unlike standard keyboards. Also, the air-cooling will definitely reduce the level of key-melting that I usually experience.
It'll be so much easier having the 1 key to the right of the 0, unlike standard keyboards. Also, the air-cooling will definitely reduce the level of key-melting that I usually experience.
Post-Easter update
Since the 15th I have been exploring the vast and desolate wastelands of the North of England (while visiting my family over Easter), and only returned to Guildford a couple of days ago. Now, after going to the Reading Beer Festival yesterday I'm ready to start work properly again.
This is not to say that I haven't been working over the couple of weeks: things have actually come quite far. Before now, the main thing missing from the Juggernaut engine is any proper collision physics: rather than the player's ship bouncing off walls and taking damage (as you'd expect), damage was just applied while the ship was colliding with the main environment. This was just a temporary, but obviously incomplete, solution.
However, the advantage of being back in the North was that I only had my laptop with me, which lacks DirectX 10 hardware, and as a result there was no way that I could work on the main game engine. This forced me to do the necessary research in order to be able to implement a decent rigid body physics engine, which means that not only will the ship react well when colliding with walls, but it leaves a lot of room for interesting physics-based challenges, including pulling things around using a tractor beam. I'm currently just doing the refactoring necessary to integrate the physics engine with the main game engine, but in a few days I'm confident that this last major aspect of the game will be working well.
After that, it will be full steam ahead towards the creation of the first demo!
This is not to say that I haven't been working over the couple of weeks: things have actually come quite far. Before now, the main thing missing from the Juggernaut engine is any proper collision physics: rather than the player's ship bouncing off walls and taking damage (as you'd expect), damage was just applied while the ship was colliding with the main environment. This was just a temporary, but obviously incomplete, solution.
However, the advantage of being back in the North was that I only had my laptop with me, which lacks DirectX 10 hardware, and as a result there was no way that I could work on the main game engine. This forced me to do the necessary research in order to be able to implement a decent rigid body physics engine, which means that not only will the ship react well when colliding with walls, but it leaves a lot of room for interesting physics-based challenges, including pulling things around using a tractor beam. I'm currently just doing the refactoring necessary to integrate the physics engine with the main game engine, but in a few days I'm confident that this last major aspect of the game will be working well.
After that, it will be full steam ahead towards the creation of the first demo!
Wednesday, 13 April 2011
Refactoring!
Sometimes, there's just something in your code that niggles away at you, making your life more awkward until one day you decide you've had enough, reach for the refactoring chainsaw and refactor the buggery out of it. Today, I reached that point.
In this case, it was a couple of aspects of the main game object class structures that, although sensibly designed at the beginning of development, has since grown into a significant bugbear (as shown in Figure 1). Basically, I'd shoved a templated structure too high up in the hierarchy, meaning that I was having to do a lot of dynamic casting between different interfaces as it wasn't really possible to have a single interface that had access to all the important bits (in this case the object's activity state, pose, dynamics, collision properties and damage interface) due to this templated bit sitting in the middle (which was a subobject list, in case anyone cares).
To simplify development, I shifted this templated element down to the bottom of the hierarchy. Of course, this involved screwing with a lot of the core code and, as you'd expect, it's taken a fair amount of time to get everything back up and running again. There's still some additional validation to do, but it's generally all looking promising and should make my life easier in future.
In general news, the ship missiles are now coupled with one of the space-warping effects, making them look quite sexy (should make a video), although I still need to create a larger explosion graphic to go with it.
I'm heading back up to the North of the UK for a week soon to see my folks and, unfortunately, my laptop doesn't have DirectX 10 hardware, making working on Juggernaut more tricksy. However, I do have a fair amount of work to do on improving the collision physics that doesn't really need pretty graphics, so this seems like a good time to do it.
In this case, it was a couple of aspects of the main game object class structures that, although sensibly designed at the beginning of development, has since grown into a significant bugbear (as shown in Figure 1). Basically, I'd shoved a templated structure too high up in the hierarchy, meaning that I was having to do a lot of dynamic casting between different interfaces as it wasn't really possible to have a single interface that had access to all the important bits (in this case the object's activity state, pose, dynamics, collision properties and damage interface) due to this templated bit sitting in the middle (which was a subobject list, in case anyone cares).
![]() |
| Figure 1: Artist's depiction of a bugbear. |
In general news, the ship missiles are now coupled with one of the space-warping effects, making them look quite sexy (should make a video), although I still need to create a larger explosion graphic to go with it.
I'm heading back up to the North of the UK for a week soon to see my folks and, unfortunately, my laptop doesn't have DirectX 10 hardware, making working on Juggernaut more tricksy. However, I do have a fair amount of work to do on improving the collision physics that doesn't really need pretty graphics, so this seems like a good time to do it.
Subscribe to:
Posts (Atom)





