New here? What’s IwGame? IwGame is an open source free to use cross platform game engine for iPhone, iPad, Android, Bada, Playbook, Symbian, Windows Mobile, LG-TV, Windows and Mac, built on top of the Marmalade SDK. You can find out more and download the SDK from our IwGame Engine page.
Its been a tough week, my Apple Mac blew a gasket and refused to boot. Didn’t know this until I had spent 4 hours trying to make the Mac boot from Snow Leopard, but you cannot boot a Mac Mini from any version of the OS other than the original version that came with the Mac! Arrrgggghhhhh, insanity! In the end I turned my office and house upside down to find the original Mac disk.
Finally got cOnnecticOns cleaned up and submitted to the app stores. I also added 10 more levels and a game editor that allows players to create up to 20 of their own levels on-device and play them. I plan to allow sharing of these custom levels in a future version. We also added Facebook posting to IwGame and therefore has now been added to cOnnecticOns. You can find our more info about the game at http://appliter.com/apps/connecticons/connecticons.aspx
Ok, onto the update. IwGame v0.31 is kind of a special release because it contains the FULL source and assets of the game that you will see on Android Market and very soon Blackberry App World, Apple iTunes and SamsungApps for Bada.
Here’s the full list of changes for 0.31:
IwGame 0.31 Changes:
- cOnnecticOns full commercial game with source and assets provided as an example of engine usage
- CIwGameFacebook added – Currently provides login and wall posting access
- New AddVariable action added which allows you to add a positive or negative value to a XOML variable with limits
- New EnterValue action added that brings up the devices keyboard allowing the user to enter a value into a XOML variable
- New UpdateText action added will update a text actor with the value of a variable
- New Exit action added that allows the user to exit the game
- 3rd paramater added to XOML actions
- DoSleep added to CIwGameBox2dWorld to enable / disable object sleeping, also added to scene XOM
- IIwGameXomlResource now has an actual type, allowing type checking for exact object types
- OnKeyBack and OnKeyMenu events added to scene and XOML. These fire when back and menu keys are pressed
- BUG FIX: CIwGameSprite position and origin now 32 bit vectors, which helps prevent positions overflowing
- BUG FIX: When a scene is destroyed and it has touch focus it was causing a crash
- BUG FIX: If a scene becomes inactive or invisible it now loses touch focus
- BUG FIX: Velocity / angular velocity now applied when actors have no physics attached
- BUG FIX: JPEG image data is now correctly converted from BGR to RGB
- BUG FIX: CIwGameString, find index now properly reset
As well as the release of the full source for cOnnecticOns, we also snook a few extra col bits and bobs in there.
New CIwGameFacebook Class
The main purpose of this class is to allow the user to log into facebook and interact with it. Right know, only logging in and wall posting functionality is provided using the following method:
bool PostWall(const char* message, const char* link_uri, const char* image_uri, const char* name, const char* description);
- message – Message to display to the users wall visitors
- link_uri – URL that the user will visit when clicking on the wall post link
- image_uri – URL of an image that you would like to be displayed along with the post
- name – The title of the post
- description – Description of the post (displayed in weaker font beneath title)
A Facebook wall post will look something like this:
New XOML Actions
It is now possible to add a value onto an existing XOML variable using the new AddVariable action. You can also update a text actor with the value of a variable in XOML. Here’s an example showing how the editor in cOnnecticOns uses both actions together to create an up / down UI element that the player can use to change the number of cOnnecticOns available in the level:
<!-- Create change connecticons buttons --> <InertActor Name="ConnectButton2" Position="0, -200" Size="81, 84" SrcRect="555, 482, 81, 84" Image="sprites1"> <ActorText Name="ConnectButton" Depth="0" Font="trebuchet_12" Rect="-100, -50, 200, 100" Colour="0, 0, 0, 255" Text="2" /> <InertActor Name="DownButton" Position="-60, 0" Angle="-90" Size="48, 51" SrcRect="868, 299, 48, 51" Image="sprites1" Depth="0" OnBeginTouch="DownBeginTouch" OnEndTouch="DownEndTouch" OnTapped="DownTapped"> <Actions Name="DownBeginTouch"> <Action Method="SetTimeline" Param1="buttonin4_anim" /> <Action Method="PlaySound" Param1="ui_tap" /> </Actions> <Actions Name="DownEndTouch"> <Action Method="SetTimeline" Param1="buttonout4_anim" /> </Actions> <Actions Name="DownTapped"> <Action Method="AddVar" Param1="EditorConnecticons" Param2="-1" Param3="0" /> <Action Method="UpdateText" Param1="ConnectButton" Param2="EditorConnecticons" /> </Actions> </InertActor> <InertActor Name="UpButton" Position="60, 0" Angle="90" Size="48, 51" SrcRect="868, 299, 48, 51" Image="sprites1" Depth="0" OnBeginTouch="UpBeginTouch" OnEndTouch="UpEndTouch" OnTapped="UpTapped"> <Actions Name="UpBeginTouch"> <Action Method="SetTimeline" Param1="buttonin5_anim" /> <Action Method="PlaySound" Param1="ui_tap" /> </Actions> <Actions Name="UpEndTouch"> <Action Method="SetTimeline" Param1="buttonout5_anim" /> </Actions> <Actions Name="UpTapped"> <Action Method="AddVar" Param1="EditorConnecticons" Param2="1" Param3="10" /> <Action Method="UpdateText" Param1="ConnectButton" Param2="EditorConnecticons" /> </Actions> </InertActor> </InertActor>
The mark-up marked in red show the new AddVar and UpdateText XOML actions.
Basically when the user taps the DownButton actor the OnTapped event fires which calls the DownBeginTouch actions list. This actions list contains two actions:
AddVar – This adds -1 onto the EditorConnecticons variable and limits it to 0, so it does not go below 0.
UpdateText – The next action copies the value of the EditorConnecticons variable into the ConnectButton text actor, which updates the number of connecticons on screen.
Support for Android Back and Menu Buttons in XOML
It is now possible to attach actions in XOML to the menu and back button events in a scene by handling the OnKeyBack and OnKeyMenu events. Note that only the current scene will handle button events.
Text Input via XOML
Using the new EnterValue XOML tag you can bring up the device keyboard and allow the user to input some text into a XOML variable.
As previously mentioned the full source to cOnnecticOns has been provided to enable developers to see a real working commercial game utilising IwGame. The first thing you will notice when looking at the code base is just how little code is actually there. This is because much of the mundane functionality such as creating layouts, handling events, creating animations, scenes etc.. are all handled by XOML. Please note that the supplied XOML is not optimised in way shape or form, in fact I have done many things long hand so as not to make the scripts convoluted and difficult to understand. When creating your own XOML you should probably focus more on re-use with templates, styles and global actions / animations etc..
Here is a brief overview of the provided XOML scripts:
- Actors – This file contains physics materials, shapes and game object templates
- Common – Contains common styles, animations and actions that are used across many scenes
- ConfirmDialog – This is the dialog box scene for the rest scores action, it is displayed to the user when they attempt to reset their records
- EditLevelSelect – Level selection screen that allows the user to select a custom level to edit
- Editor – The level editor scenes
- GameComplete – Shown to the player when they complete all zones and all rounds
- Help – The basic help dialog that is accessible from the main menu
- HUD – The in-game HUD that displays the scores and game buttons
- Intro – The IwGame intro that is displayed at game boot
- LevelCleared – The end of level score dialog that is displayed when the user completed or fails a round
- LevelSelect – Level selection screen that allows the user to select a level to play
- LevelSelect2 – Level selection screen that allows the user to play a custom level to play
- Menu – The main front-end menu scenes
- PauseMenu – The in-game pause men scene
- ZoneLocked – Dialog scene that is displayed when the player finishes round 10 but has not unlocked all levels in the zone
- ZoneSelect – Zone selection scene
- Scenes 1 to 30 – Game level scenes
- Scenes 101-120 – Custom blank level scenes
Note that some files contain more than one scene. For example, each game level file contains the pause menu, the main game level scene as well as the in-game HUD. The pause menu and HUD exist as separate XOML files so they can be re-used across all levels.
The code base contains implementations of the following custom scenes:
- EditScene – Level editor scene, contains level editor logic
- GameScene – A game level scene, contains game logic
- LevelSelectScene – Custom scene for level select that handles updating of the scores in the level screen
- ZoneSelectScene – Custom scene for zone select that handles updating of the lock / unlocked status of each zone
The following custom actors are also used:
- ConnectActor – An actor that connect two bugs together with minimal logic
- CounterActor – This is the main bug actor (originally called counters), handles all bug logic / collision etc
- FloaterActor – Handles floating / fading text
- GravityPlacerActor – Special actor that can be modified to change gravity within the editor
- InertActor – Basically an actor that doesn’t much other than display itself
- PlacerActor – A basic placeable object, used to position actors in the editor
- SelectorActor – A basic selector actor used by the editor object selection screen to select which object to place
The rest of the code is pretty bog standard stuff. Game is the implementation of CIwGame and contains initialisation and shut down. Probably the most interesting part is where the custom XOML classes and events are added using the following code:
// Add custom classes to XOML system IW_GAME_XOML->addClass(new InertActorCreator()); IW_GAME_XOML->addClass(new GameSceneCreator()); IW_GAME_XOML->addClass(new LevelSelectSceneCreator()); IW_GAME_XOML->addClass(new ZoneSelectSceneCreator()); IW_GAME_XOML->addClass(new CounterActorCreator()); IW_GAME_XOML->addClass(new PlacerActorCreator()); IW_GAME_XOML->addClass(new GravityPlacerActorCreator()); IW_GAME_XOML->addClass(new SelectorActorCreator()); IW_GAME_XOML->addClass(new EditSceneCreator()); // Add custom game actions to XOML system for (int t = 0; t < CIwGameXomlAction_Global::Action_Max; t++) IW_GAME_XOML->addAction(new GameXomlAction_Global((GameXomlAction_Global::ActionType)t));
These custom actions and events allow us to tie our game logic much closer to our XOML code.
Well that’s it for this update. We were aiming to get conditional XOML actions in for 0.31, but unfortunately it didn’t make it, but should do for 0.32.