Tuesday, April 14, 2009

 

Gaming helper Mini-Framework

       I’ve been programming games for quite some time now. Every time I build a new game, there are many elements that keeps repeating … character behaviors like movement, jumping, ducking, chasing target etc. I know there are many game development suite that comes with many built in features & defining a character & behavior is rather very easy there … But (and its an important But! ) they come at a very high price, and there’s other problem of integrating with your code.  So, I decided to build a mini-framework that would help me out with the mundane tasks (not to mention that I really got the kick out of this :) ).  Here’s a simplistic view of the design approach (not all classes are included):  

MiniGamingFramework
Next, I implemented XML serialization/de-serialization of above model. Here’s a Mario Character definition that worked for me:
Example 1: Mario

<?xml version="1.0" encoding="utf-8"?>
<SpriteXMLParser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/XMLSchema.xsd">
  <Identity>
    <Name>Mario</Name>
    <Group>Ram.Test</Group>
    <Version>0.0.0.1</Version>
    <Author>Ram Adhikari</Author>
    <DateOfCreation>2009-04-28</DateOfCreation>
  </Identity>
  <States startState="NORMAL">
    <State id="NORMAL">
      <!-- NOTE: State ids are case sensitive,
      Omitted other attributes because of lack of space -->

      <Draw contentPath="mario-standingImage" />
    </State>
    <State id="STANDING">
      <Draw contentPath="mario-standingImage" />
    </State>
    <State id="DUCK">
      <Draw contentPath="mario-duckImage" />
    </State>
    <State id="RAISE-HAND">
      <Draw contentPath="mario-raise-handImage" />
    </State>
    <State id="RUN1">
      <Draw contentPath="mario-running-1Image" />
    </State>
    <State id="RUN2">
      <Draw contentPath="mario-running-2Image" />
    </State>
    <State id="LEFT_RUN1">
      <Draw contentPath="mario-running-1Image" />
    </State>
    <State id="LEFT_RUN2">
      <Draw contentPath="mario-running-2Image" />
    </State>
    <State id="INVISIBLE" />
  </States>
  <Transitions>

    <Transition fromStateId="NORMAL" toStateId="STANDING" onInput="mouse.in-click" />
    <Transition fromStateId="STANDING" toStateId="NORMAL" onInput="mouse.out-click" />
    <Transition fromStateId="STANDING" toStateId="INVISIBLE" onInput="keys.Escape" />
    <Transition fromStateId="STANDING" toStateId="RUN1" onInput="keys.Right" />
    <Transition fromStateId="STANDING" toStateId="LEFT_RUN1" onInput="keys.Left" />
    <Transition fromStateId="STANDING" toStateId="DUCK" onInput="keys.Down" />
    <Transition fromStateId="STANDING" toStateId="RAISE-HAND" onInput="keys.Up" />

    <Transition fromStateId="INVISIBLE" toStateId="STANDING" onInput="keys.S" />
    <Transition fromStateId="RUN1" toStateId="NORMAL" onInput="mouse.out-click" />
    <Transition fromStateId="RUN1" toStateId="RUN2" onInput="keys.Right" />
    <Transition fromStateId="RUN1" toStateId="STANDING" onInput="keys.Left" />

    <Transition fromStateId="RUN2" toStateId="NORMAL" onInput="mouse.out-click" />
    <Transition fromStateId="RUN2" toStateId="RUN1" onInput="keys.Right" />
    <Transition fromStateId="RUN2" toStateId="STANDING" onInput="keys.Left" />

    <Transition fromStateId="LEFT_RUN1" toStateId="NORMAL" onInput="mouse.out-click" />
    <Transition fromStateId="LEFT_RUN1" toStateId="LEFT_RUN2" onInput="keys.Left" />
    <Transition fromStateId="LEFT_RUN1" toStateId="STANDING" onInput="keys.Right" />

    <Transition fromStateId="LEFT_RUN2" toStateId="NORMAL" onInput="mouse.out-click" />
    <Transition fromStateId="LEFT_RUN2" toStateId="LEFT_RUN1" onInput="keys.Left" />
    <Transition fromStateId="RUN2" toStateId="STANDING" onInput="keys.Right" />

    <Transition fromStateId="DUCK" toStateId="NORMAL" onInput="mouse.out-click" />
    <Transition fromStateId="DUCK" toStateId="STANDING" onInput="keys.Up" />

    <Transition fromStateId="RAISE-HAND" toStateId="NORMAL" onInput="mouse.out-click" />
    <Transition fromStateId="RAISE-HAND" toStateId="STANDING" onInput="keys.Down" />

  </Transitions>
</SpriteXMLParser>


Now, it will be foolish to assume that such a simple model will work for every game character definition. So, what I do is to generate the class definition of a character from the XML (this reduces a lot of effort) & do the customization. It generate the boiler code for handling input (specific to the character) & state management.


Sunday, April 12, 2009

 

On gardening and programming...

I keep trying my hands on roof gardening ... and so far i had more failures than success.
Well, there's plenty of sun shine & i water them regularly .... even giving regular does of nitrogen / manure .... but alas it never grows the way i see them in my dreams :(.

Apparently the problem is not of sun-shine or fertilizers, my garden pots suffer from weeds and grass mania !!!

No matter how much i wipe them off, put insecticides, "weedi-sites" (!!!)...grass (lots of it) and weeds keep coming back again and again. And i wonder WHAT DOES IT TAKE TO REALIZE WHAT YOU DREAM OF ??? yes, the entropy of any system can only increase .... but what about all the intervention to bring order and harmony, there should be some reward to that end.

I see similar patterns in Software - what percentage of all the programs written become useful to end consumers ? There's just too many grass and weeds that surrounds our program .... and they grow really very fast.

The pattern applies to life too ... but lets keep that for another blog.

This page is powered by Blogger. Isn't yours?

Subscribe to Posts [Atom]