Just made these two videos. One is the timelapse video I took to show my development process and the other is to show off the gameplay for those that cant run flash (Linux) or dont want to actually play the game, just want to see what the fuss is about :P
The timelapse was produced using 2300 ish screenshots, one taken every 60 seconds by Chronolapse.
Enjoy:
You can play the game here: http://mikecann.co.uk/ludum-dare/ludum-dare-hour-40-complete/#thegame
Monday 23 August 2010
Sunday 22 August 2010
Ludum Dare - Hour 40 - COMPLETE!
Okay well its not quite complete, the waves of enemies could do with some more work but I have my mum coming up from London to visit me in 30 mins so im gonna call it quits here.
So, finally it has a name, I have called it "48 Hours Later" :) Its not technically true as I have only had 40 hours to do it, but oh well!
Overall im pretty happy with my first Ludum Dare entry, im very tired right now and have a banging headache, but thats all part of the fun right?
So onto the game. First some shots:
Okay so if you have been following waaaay back my original intention was to make a game with the same sort of art style as World of Goo but with the game mechanics of Boom Stick. I think I have stayed pretty true to that original idea.
Basically you fight against waves of enemies that float across the screen. There are currently only 10 waves, I would have liked more and with more variety but oh well ;)
The theme of the competition was "Enemies as Weapons". I have incorporated that theme by having the enemies drop giblets when they die. You then have a certain amount of time to pick up those giblets and fire them back at the enemies. Enemies as weapons!
So as a disclaimer: im sure the game has many bugs and things, I have run out of time to do much in the way of testing and optimising. If you find any bugs however drop a comment I would love to hear about them as I plan to release this to a few flash portals, so would like to get those bugs fixed ;)
Anyways enough jibber jabber. A few more shots then the game is below:
EDIT: I have now made a youtube gameplay video and timelapse of development, check em here.
Tools Used:
Adobe Photoshop CS5
Adobe Flash Builder 4
Adobe Flash CS5
SFXR
Chronolapse
Ludum Dare - Hour 31
Well its been quite a while since my last progress report. I have mostly been sleeping (well 4 hours of it anyways).
So progress is coming along nicely STILL no gameplay tho :S
So far you can shoot and destroy the enemies and then collect thier giblets before they become part of the terrain. The idea is that you can then shoot those giblets back at the enemies. Take alook if you are interested:
Oh I just noticed I left some debug sliders on there I was using to try and hone the bloom levels. Have a play with them if you want.
Right. Gameplay.
Labels:
48hours,
bloom,
competition,
Flash,
gameplay,
Liero,
ludum,
Ludum Dare,
Particles,
worms
Saturday 21 August 2010
Ludum Dare - Hour 22
Okay, im starting to get pretty tired. Its not very late (midnight) but I think the lack of sleep last night is catching up with me. Im gonna get a few hours kip now then back up early to start again I think.
As for progress. I have a basic enemy type in, it doesnt do much except bleed, and it doesnt look too good (I really cant draw!) but oh well.
As before I have done a build that you can "play":
So the next task for me when I wake up is to add some sort of scoring mechanism and ofcourse to add the ability to use the "Enemies as Weapons" :P
Labels:
48hours,
competition,
Flash,
Game,
ludum,
Ludum Dare
Ludum Dare - Hour 17
Okay its been about 6 hours since my last update, and I have been working pretty much solid apart from an hour lunchbreak when I went for a wander into town.
Ive made quite abit of progress with the core bits of the engine including the physics particle systems and the destructible terrain.
Dont believe me? Take a look for yourself:
Theres still no game really, just a pretty tech demo. Im hoping the gameplay will come next :)
Im going to have abit of a break now, get some food wind down a little then its going to be a loooooong night ahead for me!
Ludum Dare - Hour 11
Thought I would update now I have a basic scene and a controllable player. See for yourself:
Use left and right keys to navigate.
Next step is a gun and destructible terrain, and not forgetting particles!
Use left and right keys to navigate.
Next step is a gun and destructible terrain, and not forgetting particles!
Ludum Dare - Hour 6
Progress update. I had a small sleep between 5 and 7 as I was getting pretty sleepy and my body still thought it was night time.
Desprite this im making progress:
It doesnt look like much yet, I have mostly been laying the foundations for later development :)
So far I have the foreground layer in, need the other layers in next then some camera movement, tho Im going to have to get some breakfast soon!
Desprite this im making progress:
It doesnt look like much yet, I have mostly been laying the foundations for later development :)
So far I have the foreground layer in, need the other layers in next then some camera movement, tho Im going to have to get some breakfast soon!
Labels:
48hours,
development,
Flash,
Game,
ludum,
Ludum Dare
Friday 20 August 2010
Ludum Dare - Hour 1
Okay I have had an hour now and I have spent it trying to come up with an art style and game ideas. I have chucked a load of screenshots down into a google doc here: https://docs.google.com/drawings/edit?id=1W7ILlCI3mODPue3oW25gb0maryxfTIo7XZRv8XlXbHM&hl=en&authkey=CIO9wIcM I think I have a rough idea of what im going for.
I really like the World Of Goo art style, plus im hoping the shilloette like style will be much easier for my poor drawing ability :P
As for gameplay, "Enemies as Weapons" instantly reminded me of the flash game Boom Stick for some reason. So in that game you shoot enemies flying by overhead with your shotgun. You then run around and pick up ammo that drops from them. You then use that ammo to shoot more of them, simples!
The great thing about this idea is that I have done work in the past on LieroXNA and Worms 2 Mobile so hopefully I can use some of the experience I have gleamed from doing those games to make this one :)
With design out of the way now, I think im going to setup my environment and get cracking!
Ludum Dare - Hour 0
Okay its 3:31am the competition started 31mins ago. I had originally intended to wake up at 5-6am then start coding but I couldnt sleep so I thought I would get cracking early then catch a nap later on when im tired.
The theme for the competition is "Enemies as Weapons" which is actually a better theme than what I was expecting "Technology in the wrong time period". I havent got an idea yet but im sure something will come to me :)
Anyways, here is where all the magic will be happeneing over the next 48 hours:
I have ChronoLapse setup to capture a screenshot every 60 seconds so hopefully we will get a nice video at the end showing my progress (or lack of :P).
I will be updating at regular intervals throughout, mainly to break up the dev process a little as 48hours is a long time!
Wish me luck!
The theme for the competition is "Enemies as Weapons" which is actually a better theme than what I was expecting "Technology in the wrong time period". I havent got an idea yet but im sure something will come to me :)
Anyways, here is where all the magic will be happeneing over the next 48 hours:
I have ChronoLapse setup to capture a screenshot every 60 seconds so hopefully we will get a nice video at the end showing my progress (or lack of :P).
I will be updating at regular intervals throughout, mainly to break up the dev process a little as 48hours is a long time!
Wish me luck!
Monday 16 August 2010
Ludum Dare 18 this Weekend!
Dont think I have blogged about this yet, so im doing so now.
Im planning on entering the 18th Ludum Dare compo, starting this sat. This will be my very first entry and im quite excited!
For those not in the know the Ludum Dare competition is a competition for Indie Games Developers. You have 48 to make a game (practically) from scratch. Its a solo competition so I cant call in my partner in crime olip.co.uk to do the artwork for me.
Rules are as follows:
- You must work alone (solo).
- All game code and content must be created within the 48 hours.
- Games must be based on the theme.
- All libraries, middleware, content creation, and development tools are allowed.
- Source code must be included.
The themes for this edition of the compo are currently being voted on here.
I doubt I will be able to come up with much in the 48 hour limit, but im hoping to get at least something remotely playable!
AS3, Dictionary & Weak Method Closures
This is going to be a technical post so those of you not of the code persuasion look away now..
Okay great, now those guys have gone I can get down to it.
Some of my recent work on the SWFt project has revolved around the use of Robert Penners AS3Signals. If you dont know what Signals are I strongly reccomend that you check out Roberts blog for more info. In brief, they are an alternative to the Events system found in Flash, based on the Signal / Slot pattern of Qt and C# they are much faster and more elegant (my opinion) than native events.
I have been trying to incorporate signals in SWft for both the elegance and performance gains that they bring, however there is an issue that was brought to my attention by Shaun Smith on the mailing list. The issue is that my current use of them will cause memory leaks.
I realised that this too would apply to the work I had been doing using the RobotLegs and Signals libraries. RobotLegs (for those of you that dont know) is an excellent Dependency Injection framework inspired by the very popular PureMVC framework. I have blogged before about its excellence. Signals have been incorporated into RobotLegs as a separate 'plugin' by Joel Hooks in the form of the SignalCommandMap. The SignalCommandMap does as the name implies, it allows you to map signals to commands so that whenever a mapped signal is dispatched then the corresponding command is executed.
Its a very nice, elegant, solution to RIA development. However there is one catch. I have so far been using signals such as:
[codesyntax lang="actionscript3" lines="normal"]
[/codesyntax]
So here we can see a typical use of Signals in a mediator. There are two things going on here that are of concern, lets break them down.
Firstly on line 12 we are listening to a signal on the view, then passing on the event directly to an app-level event, notice how nice and clean this is, this is what I love about using RL & Signals. Line 13 we are listening for an app-level signal for a change on the model then updating the view to reflect this.
It all looks well and good but unfortunately in its current state it could cause a memory leak. This is because we are listening to events on signals without then removing the listen. For example, we are listening to the app-level event on line 13 "modelChanged.add(onModelChanged);" so now the "modelChanged" signal has a reference to this Mediator. This will cause a leak when the View is removed from the display list. Normally the mediator would also be make available for garbage collection, however, because the singleton Signal has a reference to the Mediator it cannot be removed.
The same goes for line 12. Suppose the "ViewEventOccuredSignal" that is injected is not a singleton and is swapped out for another instance it could not be garbage collected as the "view.someSignal" has a reference to its dispatch function.
Realising this problem I knew that the solution was simply to be careful and add a "onRemoved" override function in my Mediator then clean up by removing the signal listeners. However I like the simplicity and beauty of current way of doing things so I started to wonder if there was another way.
I started thinking about whether I could use weak references with the Signal. If I could then I wouldnt have to worry about cleaning up as the Signal wouldnt store any hard-references to the functions and so the listener would be free for collection. After some digging however I realised that there was no option for weak listening in Robert Penners AS3Signals.
I thought to myself why the hell not? I knew that the Dictionary object in AS3 has an option to store its contents weakly so I thought so long as you don't require order dependant execution of your listeners it should be possible to store the listener functions in a weakly referenced Dictionary.
It was at this point that I noticed Roberts post on the subject of weakly referenced Signals: http://flashblog.robertpenner.com/2009/09/as3-events-7-things-ive-learned-from.html. In it he references Grant Skinners post concerning a bug with storing functions in a weakly referenced Dictionary.
From Grant's post:
This was starting to look bad for my idea. Me being me however, I thought I knew better, and that post was written pre Flash 10 so I thought to myself: perhaps its been fixed in Flash 10. So I set to work coding a simple example.
I created a very simple Signal dispatcher:
[codesyntax lang="actionscript3" lines="normal"]
[/codesyntax]
And a very simple listening object:
[codesyntax lang="actionscript3" lines="normal"]
[/codesyntax]
And then a simple Application to hook it all together:
[codesyntax lang="mxml" lines="normal"]
[/codesyntax]
So what I should expect to see from this example is that when I click "Add Listener" it should create a listener reference which will then listen for when the signal is dispatched and trace out a "ping".
What actually happens is you get nothing. No trace out, despite the fact that there is clearly still a reference to the listener in the Application file.
So whats happening here? If you break into the debugger at the point that the listener is added then you get the following:
You can see that the type "MethodClosure" is added as the key to the dictionary rather than Function which is passed in. MethodClosure is a special native Flash Type that you dont have access to. It exists to resolve the issues we used to have in AS2 where passing a function of a class to a listener would cause the listener to go out of scope and other nasties. From the Adobe docs:
..
The only problem is that it seems that using a MethodClosure as a key in a weak dictionary causes the MethodClosure to have no references and hence be free for garbage collection as soon as its added to the Dictionary which is not good :(
So thats about as far as I got, I have spent a few evenings on this one now and I think im about ready to call it quits. I had a few ideas about creating Delegate handlers to make functions very much in the same way as was done in AS2 but then I read this post: http://blog.betabong.com/2008/09/26/weak-method-closure/ and the subsequent comments and realised it probably wasnt going to work.
I also had an idea about using the only other method of holding weak references the EventDispatcher class. I thought perhaps somehow I could get it to hold the weak references then I could loop through the listeners in there calling dispatch manually. Despite "listeners" property showing up in the Flex debugger for an EventDispatcher you dont actually have access to that property unfortunately so hence cant get access to the listening functions. Interestingly however the EventDispatcher uses "WeakMethodClosure" object instead of the "MethodClosure" object according to the debugger.
Well I guess for now Ill have to make sure I code more carefully and unlisten from my Signals ;)
Okay great, now those guys have gone I can get down to it.
Some of my recent work on the SWFt project has revolved around the use of Robert Penners AS3Signals. If you dont know what Signals are I strongly reccomend that you check out Roberts blog for more info. In brief, they are an alternative to the Events system found in Flash, based on the Signal / Slot pattern of Qt and C# they are much faster and more elegant (my opinion) than native events.
I have been trying to incorporate signals in SWft for both the elegance and performance gains that they bring, however there is an issue that was brought to my attention by Shaun Smith on the mailing list. The issue is that my current use of them will cause memory leaks.
I realised that this too would apply to the work I had been doing using the RobotLegs and Signals libraries. RobotLegs (for those of you that dont know) is an excellent Dependency Injection framework inspired by the very popular PureMVC framework. I have blogged before about its excellence. Signals have been incorporated into RobotLegs as a separate 'plugin' by Joel Hooks in the form of the SignalCommandMap. The SignalCommandMap does as the name implies, it allows you to map signals to commands so that whenever a mapped signal is dispatched then the corresponding command is executed.
Its a very nice, elegant, solution to RIA development. However there is one catch. I have so far been using signals such as:
[codesyntax lang="actionscript3" lines="normal"]
public class MyMediator extends Mediator
{
// View
[Inject] public var view : MyView;
// Signals
[Inject] public var eventOccured : ViewEventOccuredSignal;
[Inject] public var modelChanged : ModelChangedSignal;
override public function onRegister():void
{
view.someSignal.add(eventOccured.dispatch);
modelChanged.add(onModelChanged);
}
protected function onModelChanged()
{
view.updateView();
}
}
[/codesyntax]
So here we can see a typical use of Signals in a mediator. There are two things going on here that are of concern, lets break them down.
Firstly on line 12 we are listening to a signal on the view, then passing on the event directly to an app-level event, notice how nice and clean this is, this is what I love about using RL & Signals. Line 13 we are listening for an app-level signal for a change on the model then updating the view to reflect this.
It all looks well and good but unfortunately in its current state it could cause a memory leak. This is because we are listening to events on signals without then removing the listen. For example, we are listening to the app-level event on line 13 "modelChanged.add(onModelChanged);" so now the "modelChanged" signal has a reference to this Mediator. This will cause a leak when the View is removed from the display list. Normally the mediator would also be make available for garbage collection, however, because the singleton Signal has a reference to the Mediator it cannot be removed.
The same goes for line 12. Suppose the "ViewEventOccuredSignal" that is injected is not a singleton and is swapped out for another instance it could not be garbage collected as the "view.someSignal" has a reference to its dispatch function.
Realising this problem I knew that the solution was simply to be careful and add a "onRemoved" override function in my Mediator then clean up by removing the signal listeners. However I like the simplicity and beauty of current way of doing things so I started to wonder if there was another way.
I started thinking about whether I could use weak references with the Signal. If I could then I wouldnt have to worry about cleaning up as the Signal wouldnt store any hard-references to the functions and so the listener would be free for collection. After some digging however I realised that there was no option for weak listening in Robert Penners AS3Signals.
I thought to myself why the hell not? I knew that the Dictionary object in AS3 has an option to store its contents weakly so I thought so long as you don't require order dependant execution of your listeners it should be possible to store the listener functions in a weakly referenced Dictionary.
It was at this point that I noticed Roberts post on the subject of weakly referenced Signals: http://flashblog.robertpenner.com/2009/09/as3-events-7-things-ive-learned-from.html. In it he references Grant Skinners post concerning a bug with storing functions in a weakly referenced Dictionary.
From Grant's post:
Note that there is a known bug with Dictionary that prevents it from operating correctly with references to methods. It seems that Dictionary does not resolve the method reference properly, and uses the closure object (ie. the "behind the scenes" object that facilitates method closure by maintaining a reference back to the method and its scope) instead of the function as the key. This causes two problems: the reference is immediately available for collection in a weak Dictionary (because while the method is still referenced, the closure object is not), and it can create duplicate entries if you add the same method twice. This can cause some big problems for things like doLater queues.
This was starting to look bad for my idea. Me being me however, I thought I knew better, and that post was written pre Flash 10 so I thought to myself: perhaps its been fixed in Flash 10. So I set to work coding a simple example.
I created a very simple Signal dispatcher:
[codesyntax lang="actionscript3" lines="normal"]
package
{
import flash.events.EventDispatcher;
import flash.utils.Dictionary;
public class SimpleDispatcher
{
protected var _listeners : Dictionary;
public function SimpleDispatcher(useWeak:Boolean)
{
_listeners = new Dictionary(useWeak);
}
public function add(f:Function) : void
{
_listeners[f] = true;
}
public function dispatch() : void
{
for (var o:* in _listeners)
{
o();
}
}
}
}
[/codesyntax]
And a very simple listening object:
[codesyntax lang="actionscript3" lines="normal"]
package
{
public class SimpleListener
{
public function listen(d:SimpleDispatcher) : void
{
d.add(onPing);
}
protected function onPing() : void
{
trace(this+" - ping");
}
}
}
[/codesyntax]
And then a simple Application to hook it all together:
[codesyntax lang="mxml" lines="normal"]
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
import mx.controls.List;
protected var _dispatcher : SimpleDispatcher = new SimpleDispatcher(true);
protected var _listener : SimpleListener;
protected function onAddListenerClicked(event:MouseEvent):void
{
_listener = new SimpleListener();
_listener.listen(_dispatcher);
}
protected function onRunGCClicked(event:MouseEvent):void
{
try
{
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
}
catch (e:*) {}
}
protected function onDispatchClicked(event:MouseEvent):void
{
_dispatcher.dispatch();
}
]]>
</fx:Script>
<s:VGroup width="100%" height="100%" horizontalAlign="center" verticalAlign="middle">
<s:Button label="Add Listener" click="onAddListenerClicked(event)" />
<s:Button label="Run GC" click="onRunGCClicked(event)" />
<s:Button label="Dispatch" click="onDispatchClicked(event)" />
</s:VGroup>
</s:Application>
[/codesyntax]
So what I should expect to see from this example is that when I click "Add Listener" it should create a listener reference which will then listen for when the signal is dispatched and trace out a "ping".
What actually happens is you get nothing. No trace out, despite the fact that there is clearly still a reference to the listener in the Application file.
So whats happening here? If you break into the debugger at the point that the listener is added then you get the following:
You can see that the type "MethodClosure" is added as the key to the dictionary rather than Function which is passed in. MethodClosure is a special native Flash Type that you dont have access to. It exists to resolve the issues we used to have in AS2 where passing a function of a class to a listener would cause the listener to go out of scope and other nasties. From the Adobe docs:
Event handling is simplified in ActionScript 3.0 thanks to method closures, which provide built-in event delegation. In ActionScript 2.0, a closure would not remember what object instance it was extracted from, leading to unexpected behavior when the closure was invoked.
..
This class is no longer needed because in ActionScript 3.0, a method closure will be generated when someMethod is referenced. The method closure will automatically remember its original object instance.
The only problem is that it seems that using a MethodClosure as a key in a weak dictionary causes the MethodClosure to have no references and hence be free for garbage collection as soon as its added to the Dictionary which is not good :(
So thats about as far as I got, I have spent a few evenings on this one now and I think im about ready to call it quits. I had a few ideas about creating Delegate handlers to make functions very much in the same way as was done in AS2 but then I read this post: http://blog.betabong.com/2008/09/26/weak-method-closure/ and the subsequent comments and realised it probably wasnt going to work.
I also had an idea about using the only other method of holding weak references the EventDispatcher class. I thought perhaps somehow I could get it to hold the weak references then I could loop through the listeners in there calling dispatch manually. Despite "listeners" property showing up in the Flex debugger for an EventDispatcher you dont actually have access to that property unfortunately so hence cant get access to the listening functions. Interestingly however the EventDispatcher uses "WeakMethodClosure" object instead of the "MethodClosure" object according to the debugger.
Well I guess for now Ill have to make sure I code more carefully and unlisten from my Signals ;)
Labels:
Actionscript,
as3,
as3signals,
bug,
Code,
dictionary,
Flex,
Personal Projects,
Programming,
PureMVC,
RobotLegs,
SWFt
Sunday 15 August 2010
Shader Based 2D Shadowing
Those who know me know I used to do quite abit of development in c# using Microsoft's XNA platform.
Well I like to check back in every now and then with some of the big players in the community to see what's going on.
One of those players is Catalin Zima, who is famous for producing many great shader and effect samples.
One of Catalin's reccent project particularly caught my eye however as I had tried to tackle the same problem several years ago when I was in my final year of university. That is, Dynamic 2D Shadows Calculated on the GPU (http://mikecann.co.uk/university-projects/shadowshader-in-rendermonkey/)
Catalin's approach to the problem is far more elegant that my brute force iterative approach. He uses a clever technique of distorting the desired casting image about the light in such a way as not to require iterative pixel lookups.
If you are interested in the more details in the technique I encourage you to check it out over on Catalin's blog: http://www.catalinzima.com/2010/07/my-technique-for-the-shader-based-dynamic-2d-shadows/
Labels:
2d,
C#,
community,
HLSL,
Programming,
shader,
shadow,
university,
XNA
Monday 9 August 2010
Assembly 2010 - CNCD & Fairlight Demo
It was the massive annual Assembly gathering last week. Traditionally its a place for the demo scene to gather and present their demos and to hack out new ones.
For those not in the know the demo scene or "scene" is where a team of people come together and compete to make a music video. Except that they arent videos in the traditional sense as its all generated using code and runs in realtime. This means that you have to be super efficient with your code. Some of the competitions are "64k" or even "4k" competitions which means that the whole demo must fit in 64kb or 4kb! The music is also produced by the groups and often excellent.
I have been checking out some of the demos produced by the teams this year and they are simply stunning. Every year they get better and better.
This one from CNCD and Fairlight particularly caught my eye as it has massive numbers of particles and a stunning soundtrack kinda reminiscent of glitchy Radiohead. Therefore I thought it essential I share it here.
Enjoy:
Oh while im at it check out this one from last year:
If you are interested in more demos from assembly you can get them all here: http://scene.org/newfiles.php?dayint=7&dir=/parties/2010/assembly10/
Oh I have also posted about the demoscene before here: http://mikecann.co.uk/art/andromeda-software-development-lifeforce-2007/
For those not in the know the demo scene or "scene" is where a team of people come together and compete to make a music video. Except that they arent videos in the traditional sense as its all generated using code and runs in realtime. This means that you have to be super efficient with your code. Some of the competitions are "64k" or even "4k" competitions which means that the whole demo must fit in 64kb or 4kb! The music is also produced by the groups and often excellent.
I have been checking out some of the demos produced by the teams this year and they are simply stunning. Every year they get better and better.
This one from CNCD and Fairlight particularly caught my eye as it has massive numbers of particles and a stunning soundtrack kinda reminiscent of glitchy Radiohead. Therefore I thought it essential I share it here.
Enjoy:
Oh while im at it check out this one from last year:
If you are interested in more demos from assembly you can get them all here: http://scene.org/newfiles.php?dayint=7&dir=/parties/2010/assembly10/
Oh I have also posted about the demoscene before here: http://mikecann.co.uk/art/andromeda-software-development-lifeforce-2007/
Friday 6 August 2010
A Few Site Changes
As im not out tonight I thought I would do a little work on the site.
I have been meaning to add the retweet and facebook buttons for ages. I have also updates the flash header to make it a little prettier :)
What d'you think?
Wednesday 4 August 2010
Gourmet Ranch
I cant believe I haven't talked about this yet.
I spoke about 6 months ago about joining a new startup called Playdemic as the Lead Flash Developer. I couldn't say much at the time as we were in stealth mode. As our first product has been out for about a month however, I think its about time I wrote a blog post on the subject.
Gourmet Ranch is Flash game for face book that follows closely on the heels of the other Facebook game successes such as Farmville and Cafeworld. The premise is simple, you grow crops and animals in your fields and then when the time comes you harvest them and use them to bake recipes. Those recipes are then served to your waiting customers by your waiters.
As the lead flash dev on the project its my responsibility to code all the engine and game play elements. Despite my several years worth of experience with flash games this was a challenging project . Making a game that is a multiplayer game but not a multiplayer game (no client pushing) is definately not for the feint of heart.
Despite the challenges and the occasional heated moment during development I think the product we have produced is excellent and is superior to many of the similar games available on Facebook. The stats for the first month of the game are impressive as can be seen from the data gleamed from AppData.
The main challenge now is to continue the early growth we have seen and retain the existing users we have won. So that means players of the game should be looking forward to regular updates with new content and bug fixing :)
Anyways if you wanna check it out head over to facebook --> http://apps.facebook.com/gourmetranch/
Monday 2 August 2010
Flex 4 Spark & Rollover Group Containing Rect
Was working on my top-secret Flex-based project over the weekend when I discovered something I hadn't come across before.
The issue is that when you have a Spark Rect GraphicsElement within a Spark Group it seems that the rollover event of the group is triggered even though the mouse doesn't roll over the Rect.
Here is a video I made to explain my issue on Twitter:
The code in the video is as follows:
[codesyntax lang="mxml"]
[/codesyntax]
It turns out (after posting the issue on the Adobe Forums) that I was simply missing the "mouseEnabledWhereTransparent" property on the Group. Setting it to false causes the mouse to perform a hit-test rather than a simple bounds check. Thank you Mr Shongrunden for pointing this out to me :)
So this now works:
[codesyntax lang="php"]
[/codesyntax]
I hope this helps someone else out!
The issue is that when you have a Spark Rect GraphicsElement within a Spark Group it seems that the rollover event of the group is triggered even though the mouse doesn't roll over the Rect.
Here is a video I made to explain my issue on Twitter:
The code in the video is as follows:
[codesyntax lang="mxml"]
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<s:Group rollOver="trace('ya')">
<s:Rect x="100" y="100" width="20" height="20">
<s:fill>
<s:SolidColor color="0x00ff00" />
</s:fill>
</s:Rect>
</s:Group>
</s:WindowedApplication>
[/codesyntax]
It turns out (after posting the issue on the Adobe Forums) that I was simply missing the "mouseEnabledWhereTransparent" property on the Group. Setting it to false causes the mouse to perform a hit-test rather than a simple bounds check. Thank you Mr Shongrunden for pointing this out to me :)
So this now works:
[codesyntax lang="php"]
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<s:Group rollOver="trace('ya')" mouseEnabledWhereTransparent="false">
<s:Rect x="100" y="100" width="20" height="20">
<s:fill>
<s:SolidColor color="0x00ff00" />
</s:fill>
</s:Rect>
</s:Group>
</s:WindowedApplication>
[/codesyntax]
I hope this helps someone else out!
Labels:
Actionscript,
Behaviour,
Code,
Expected,
Flex,
Flex4,
Group,
MXML,
Programming,
Rollover,
Spark,
Video
Sunday 1 August 2010
Exploring The World of Lucid Dreaming
Im not too sure if I have spoken before about Lucid Dreaming. I was interested in the concept several years ago when I first heard about it and then by accidentally managed to do it once while on holiday. It was an incredible experience and ever since the concept of consciously influencing your dreaming state has fascinated me.
I read about this book in New Scientist so added it to my Amazon wish-list for next time I buy some books. I have only just gotten round to begin reading it.
Its basically a how-to guide to Lucid Dreaming and seems very well written and has had many excellent reviews. One of the very first techniques the book suggests is to keep a "dream journal", a diary of your dreams so that can start to recognise patterns and signs in the dreams allowing your concious to detect when you are dreaming and wake you up.
So thats what im going to be doing for the next few weeks, keeping a diary of my dreams. Im thinking it should make for a rather interesting experience ;)
Oh BTW, no this isnt a knee-jerk reaction to Inception (which I went to watch last week and is a terrible film IMO), I had book ordered before I had heard of Inception, just coincidence.
Defcon 2010 - Hacker Intercepts GSM
I know I have been posting alot of videos lately but this one caught my eye for a couple of reasons this morning.
Firstly its an impressive video showing how easy it is to intercept 80% of the worlds calls with just $1,500 worth of equipment. Also the source article over on Venture Beat says that he can also jam a band preventing calls just as easily which is quite scary.
The second reason why this video caught my eye is it appears that this brit-hacker is wearing high-heels throughout his presentation, check it out:
Firstly its an impressive video showing how easy it is to intercept 80% of the worlds calls with just $1,500 worth of equipment. Also the source article over on Venture Beat says that he can also jam a band preventing calls just as easily which is quite scary.
The second reason why this video caught my eye is it appears that this brit-hacker is wearing high-heels throughout his presentation, check it out:
Subscribe to:
Posts (Atom)