Thursday, October 15, 2009

Simple Star Wars wipe in as3

I've done this effect to death, used it again in the upcoming DAC ( Whose launch has been delayed due to having to add achievements, luckily someone else is doing that ) so I figured it's time to put it out to pasture and share it around.

'cause we've not been posting as often here, I thought I'd treat everyone to some nice grabs to break up the code slightly.

Basically we want to create a simple gradient rectangle movieclip, like so

swatch_grab.png

And we end up with something looking like this,

gradient_grab.png

A simple rectangle that's slightly bigger than your stage, that fades out to one side. It needs to be bigger than your stage 'cause we want all the gradient part with the alpha blending to be off-screen when we first apply it as a mask.

Next up, the boring old code bit.

package Classes {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.display.Stage;
    
    import gs.TweenLite;
    
    public class Transition {

//---------------------------------------------------------------------------------------
// Assets
//---------------------------------------------------------------------------------------
        [Embed("../_assets/assets.swf",symbol="transitionMaskMC")]
        private var transitionMaskMC:Class;

//---------------------------------------------------------------------------------------
// Properties
//---------------------------------------------------------------------------------------
        private var playField:Sprite;

        private var grabBitmapData:BitmapData;
        private var grabBitmap:Bitmap;

        private var transitionMask:Sprite;
            
//------------------------------------------------
// System
//------------------------------------------------
        private var main:Main;
        private var mainMovie:DisplayObject;
        private var stage:Stage;

        private var callBack:Function;
        
//---------------------------------------------------------------------------------------
//Constructor
//---------------------------------------------------------------------------------------
        public function Transition(){
            main=Main.getInstance();
            mainMovie=main.getMainMovie();
            stage=main.getStage();

            grabBitmapData=new BitmapData(640,480,false,0);
            grabBitmap=new Bitmap(grabBitmapData);
            grabBitmap.cacheAsBitmap=true;
            
            transitionMask=new transitionMaskMC();
            transitionMask.cacheAsBitmap=true;
        }
        
//---------------------------------------------------------------------------------------
// Public
//---------------------------------------------------------------------------------------
        public function toString():String {
            return "Transition";
        }        

//---------------------------------------------------------------------------------------
        public function grabScreen(callBackArg:Function):void{
            callBack=callBackArg;

            if(playField==null){
                playField=main.getInitObj().getPlayField().transition;
            }

            grabBitmapData.draw(stage);
            transitionMask.x=-160;
            grabBitmap.mask=transitionMask;
            playField.addChild(grabBitmap);
            playField.addChild(transitionMask);

            callBackArg();

            TweenLite.to(transitionMask, 1.5, {x:640, delay:0.2,onComplete:houseKeeping});

        }

//---------------------------------------------------------------------------------------
        public function houseKeeping():void{
            playField.removeChild(transitionMask);
            playField.removeChild(grabBitmap);
        }

//---------------------------------------------------------------------------------------
    }
}

There's really no way to make code look interesting in a blog is there ?

            grabBitmapData=new BitmapData(640,480,false,0);
            grabBitmap=new Bitmap(grabBitmapData);
            grabBitmap.cacheAsBitmap=true;
            
            transitionMask=new transitionMaskMC();
            transitionMask.cacheAsBitmap=true;

Here in our constructor we're just creating a bitmap which we're going to use when we take a snap shot of the whole screen, and create our transisitonMask ( ie, the gradient mc we've just made ) instance.
The key thing is to turn cacheAsBitmap=true on both, otherwise the gradient mask won't work, it'll just be a boring old normal gradient free mask.

            grabBitmapData.draw(stage);
            transitionMask.x=-160;
            grabBitmap.mask=transitionMask;
            playField.addChild(grabBitmap);
            playField.addChild(transitionMask);

            callBackArg();

            TweenLite.to(transitionMask, 1.5, {x:640, delay:0.2,onComplete:houseKeeping});

This is the guts of what we're doing. Firstly use the always sexy draw() to grab the whole screen, then position the mask so our alpha blended bit is off screen. We want the whole snap shot bitmap to be masked normally at first.
We then simply add both the bitmap and mask to the screen. You'll notice the playField reference there. What I do, as I'm a layer loving kinda guy, is create a simple class that creates all the holders for all the things in a game at the depths I want. It's like codey version of using layers that way. So for your transition "layer", that should be on top of everything else ( You could also add it directly to the stage, same thing, I'm just paranoid that I'll need a layer above the transition for some reason ).
We've got the bitmap, the mask, the bitmap is now masked so all we need to do is cheat, and use the very lovely TweenLite. That just slides our mask all the way across the screen, in effect removing our mask, but with the nice alpha blending on the edge it makes it appear soft. Kinda like in Star Wars.

Notice the callback and the slight delay in the tween in there ? What we do is call the transition method, and then jump back to our main code where we're setting up the screen "beneath" the transition, so it wipes away to reveal our next screen.

[Update: Destroy all Cars is now ( Finally ) live, so you can see it action and see if you want to go to the effort of using it yourself ]

Squize.

#    Comments [0] |
 
Wednesday, October 07, 2009

Hello Pixel Bender

Played with Pixel Bender yet ? For Ionic ( My TD game which is taking an age to finish ) I wanted to use a similar effect to the transition in cronusX, the rgb split / tv interference thing. In the transition it didn't matter how long it took, but to use it in-game with God knows how many sprites along with collisions running it's got to be a lot lot quicker. Yeah you know where this is going.

ionic_rgbGrab.jpg

After firing up the Pixel Bender toolkit and swearing and looking through docs and examples for an hour or so, I kinda got it, so I thought I'd share what little I know. Just to warn you, this is going to be code heavy and no example to even look at, dry reading ahead. Maybe open up some porn in another tab and just flick between the two when your eyes start glazing over.

<languageVersion : 1.0;>

kernel RGBDistortion
< namespace : "RGB Distort";
vendor : "www.gamingyourway.com";
version : 1;
description : "Pixel Bender version of RGB distort";
>
{
  input image3 src;
  output pixel3 dst;

  parameter float rOffset
<
   minValue:float(-50.0);
   maxValue:float(50.0);
   defaultValue:float(0.0);
>;

  parameter float gOffset
<
   minValue:float(-50.0);
   maxValue:float(50.0);
   defaultValue:float(0.0);
>;

  parameter float bOffset
<
   minValue:float(-50.0);
   maxValue:float(50.0);
   defaultValue:float(0.0);
>;
  void

  evaluatePixel()
  {
    float2 outCoords=outCoord();

    float2 redPos=outCoords;
    redPos[0]+=rOffset;
    float3 inputColorR = sample(src,redPos);
    dst.r = inputColorR.r;

    float2 greenPos=outCoords;
    greenPos[0]+=gOffset;
    float3 inputColorG = sample(src,greenPos);
    dst.g = inputColorG.g;

    float2 bluePos=outCoords;
    bluePos[0]+=bOffset;
    float3 inputColorB = sample(src,bluePos);
    dst.b = inputColorB.b;
  }
}

I'll try and break it down quickly in my usual lazy not really explaining things style. At the start is simple metadata, nothing you can't figure out there.

   input image3 src;
   output pixel3 dst;


A bit more interesting. input is the image you're going to send to the kernal, image3 being the datatype ( Because we don't want to worry about the alpha channel the datatype is image3 ( RGB ), if you want alpha it would be image4 ( ARGB )), the output is the bitmap we're going to plot the result to, which is a pixel3 datatype ( Which is the same as image3 ).

  parameter float rOffset
<
   minValue:float(-50.0);
   maxValue:float(50.0);
   defaultValue:float(0.0);
>;

This how you set up an argument to pass to the kernal. It's a float and refers to the red channel offset when we jiggle things about. The min/max and default values are more for the toolkit itself. When you run it it'll give you a slider to play with, and those are the values for the slider ( It'll make sense when you copy the code into the toolkit. Also you can drop a description in there as more metadata, but this is for Flash so we don't really need it ).

   evaluatePixel()

This is our main loop. Everything in this method is run on each and every pixel in the image.

    float2 outCoords=outCoord();

The outCoord() method returns this pixels x/y as two floating point numbers, in the form of an array ( Kinda ). We just store that in a var out of habit and speed.

    float2 redPos=outCoords;
    redPos[0]+=rOffset;
    float3 inputColorR = sample(src,redPos);
    dst.r = inputColorR.r;

redPos is our x,y position. We then add the new x position to redPos.x ( redPos[0] ), with the new x position being our parameter from above.
inputColorR is quite a chunky little line. sample grabs the pixel data at ( inputSource, position ), in effect we're setting the float3 ( RGB ) variable inputColorR = sourceImage[x+our offset][y]
After doing that, we make this pixel in the r(ed channel ) in our destination this colour. Basically we're doing this:

var rgb=sourceBitmap.getPixel(x+offset,y);
destBitmap.setPixel(x,y,rgb);

( But just on the red channel ).

The rest of the kernal is just more of the same, just for the other two channels.

After that pick the Export Filter for Flash Player option and we're ready to get back to normal coding.

package Classes {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.display.Shader;
    import flash.display.ShaderJob;
    import flash.display.ShaderParameter;
    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.events.ShaderEvent;
    import flash.filters.ShaderFilter;
    
    public class Transition {
        
//---------------------------------------------------------------------------------------
// Assets
//---------------------------------------------------------------------------------------
        [Embed(source="_shaders/distortion.pbj", mimeType="application/octet-stream")]
        private var shader_distortPBJ:Class;

        [Embed("/_assets/assets.swf",symbol="staticMC")]
        private var staticMC:Class;

//---------------------------------------------------------------------------------------
// Properties
//---------------------------------------------------------------------------------------
        private var playField:Sprite;

        private var shaderBitmapData:BitmapData;
        private var grabBitmapData:BitmapData;
        private var grabBitmap:Bitmap;

        private var shader_distort:Shader;
        private var shaderFilter_distort:ShaderFilter;
        
        private var distortCnt:int;
        private var rSin:Number;

        private var staticEffect:Sprite;
        private var staticAnim:MovieClip;
                
//------------------------------------------------
// System
//------------------------------------------------
        private var main:Main;
        private var mainMovie:DisplayObject;
        private var stage:Stage;

//---------------------------------------------------------------------------------------
//Constructor
//---------------------------------------------------------------------------------------
        public function Transition(){
            main=Main.getInstance();
            mainMovie=main.getMainMovie();
            stage=main.getStage();

//Let's make our bitmaps where we're going to plot our data too
            shaderBitmapData=new BitmapData(700,380,false,0);
            
            grabBitmapData=new BitmapData(700,380,true,0);
            grabBitmap=new Bitmap(grabBitmapData);
            grabBitmap.alpha=0.4;
//Create our shader, sexy
            shader_distort=new Shader(new shader_distortPBJ());
            shader_distort.data.src.input=shaderBitmapData;

            staticEffect=new staticMC();
            staticAnim=staticEffect["anim"];
            staticAnim.gotoAndStop(1);
        }

//---------------------------------------------------------------------------------------
// Public
//---------------------------------------------------------------------------------------
        public function toString():String {
            return "Transition";
        }        

//---------------------------------------------------------------------------------------
        public function init():void{
            playField=main.getInitObj().getPlayfield().transitionPlayField;
            rSin=0;
        }
        
//---------------------------------------------------------------------------------------
        public function distortInit():void{
            if(grabBitmap.parent!=null){
                return;    
            }

            distortCnt=0;
            shaderBitmapData.draw(stage);
            playField.addChild(grabBitmap);

            staticEffect.height=int(Math.random()*100)+10;
            staticEffect.y=int(Math.random()*300)+50;
            staticAnim.gotoAndPlay(1);
            playField.addChild(staticEffect);
            
            startJob();
        }

//---------------------------------------------------------------------------------------
// Private
//---------------------------------------------------------------------------------------
        private function startJob():void{
            rSin++;
            rSin++;
            ShaderParameter(shader_distort.data.rOffset).value=[Math.sin(rSin)*12];
            ShaderParameter(shader_distort.data.gOffset).value=[Math.cos(rSin)*12];
            ShaderParameter(shader_distort.data.bOffset).value=[Math.sin(-rSin)*12];
            
            var job:ShaderJob = new ShaderJob(shader_distort,grabBitmapData);
            job.addEventListener(ShaderEvent.COMPLETE,shaderCompleted);
            job.start();
        }
        
//---------------------------------------------------------------------------------------
        private function shaderCompleted(e:ShaderEvent):void{
            if(++distortCnt==6){
                staticAnim.gotoAndStop(1);
                playField.removeChild(staticEffect);
                playField.removeChild(grabBitmap);
                return;
            }

            staticEffect.height=int(Math.random()*100)+10;
            staticEffect.y=int(Math.random()*300)+50;

            startJob();
        }

//---------------------------------------------------------------------------------------
    }
}

Sigh, that's a ton of boring code to look at, let's just pick out the fun stuff ( Equating as3 to fun, fuck me that's tragic ).

        [Embed(source="_shaders/distortion.pbj", mimeType="application/octet-stream")]
        private var shader_distortPBJ:Class;

That's how to embed the kernal.

//Let's make our bitmaps where we're going to plot our data too
            shaderBitmapData=new BitmapData(700,380,false,0);
            
            grabBitmapData=new BitmapData(700,380,true,0);
            grabBitmap=new Bitmap(grabBitmapData);
            grabBitmap.alpha=0.4;

What we're going to do is grab the screen when we want to run the effect, but we just want it faint ( alpha=0.4 ). shaderBitmapData is our source, with grabBitmapData being our dest. You can use the same bitmap for both, but Flash has to create a temp working copy, so it's slower.

//Create our shader, sexy
            shader_distort=new Shader(new shader_distortPBJ());
            shader_distort.data.src.input=shaderBitmapData;

Finally we're creating our actual shader, with the second line defining our source bitmap, which can do here as it won't change.

The distortInit() just grabs the screen, resets any vars we need and sends up the static effect ( Which has nothing to do with the pixel bender stuff, so we're going to ignore that ). Once that's all done we call the startJob() method which does the magic.

        private function startJob():void{
            rSin++;
            rSin++;
            ShaderParameter(shader_distort.data.rOffset).value=[Math.sin(rSin)*12];
            ShaderParameter(shader_distort.data.gOffset).value=[Math.cos(rSin)*12];
            ShaderParameter(shader_distort.data.bOffset).value=[Math.sin(-rSin)*12];
            
            var job:ShaderJob = new ShaderJob(shader_distort,grabBitmapData);
            job.addEventListener(ShaderEvent.COMPLETE,shaderCompleted);
            job.start();
        }

K, so we're using sin and cos to create our r,g and b position offsets, nothing new there. The ShaderParameter is how we change our parameter values in the kernal. You can hit the values directly, and they will be modified, but it doesn't actually do anything. I lost over an hour to that before finding out about ShaderParameter. Hopefully those lines should make sense.

Next up, we create a ShaderJob. We're doing this as opposed to the adding it as a filter approach, as this is the async magic that we've gone to all this effort for ( Runs on it's own thread etc. etc. Let's face it, that's the only thing we all know about PB ). The ShaderJob just wants to know which kernal we're using, and the destination bitmap.
Finally we just add a listener to that, and call the start() method, and it'll go and do it's thing and won't affect our other code. There's no waiting around here.

        private function shaderCompleted(e:ShaderEvent):void{
            if(++distortCnt==6){
                staticAnim.gotoAndStop(1);
                playField.removeChild(staticEffect);
                playField.removeChild(grabBitmap);
                return;
            }

            staticEffect.height=int(Math.random()*100)+10;
            staticEffect.y=int(Math.random()*300)+50;

            startJob();
        }

We're just been recursive bad boys here. Have we run the effect 6 times ? Yes so we're done, clear everything up, nope, so call the startJob() method again.

Hardly an indepth technical breakdown, but hopefully it's a starting point. This was a fair few hours of swearing for me, but I'm old so new things take longer to make sense, so it shouldn't take you more than a couple of hours to get PB doing cool things.

Squize.

#    Comments [2] |
 
Monday, October 05, 2009

Old news already ?

I was going to post about my experiments with Pixel Bender the other night, but I guess this tiny bit of news warrants more of a mention first.

Don't look at the picture below, don't! Now, what would be the coolest platform you can imagine having your as3 games running on ?

iphone_home.gif
You looked at the picture first and spoiled it didn't you ?

So before the net that talks about Flash is awash with the news, and it's all we ever hear about again, get your fill here: Flash Platform Extends to the iPhone

Squize.

#    Comments [3] |
 
Wednesday, September 30, 2009

Coming soon to a race track near you

Here's a little clip of what to expect from "Destroy all Cars", which should hopefully be live by the end of the week


Squize.
#    Comments [7] |
 
Friday, September 18, 2009

Timing is everything

This is just going to be a short "So obvious maybe it's not worth saying" post, but lets face it, most of the posts here fall into that category.

The driving / crashing game I'm working on right now ( Look a couple of posts down to read very little about it. NDA's, they're like garlic to this vampire of a blog ) has a nice Star Wars wipe. I've used it a couple of times before, it's a simple yet effective transition, and it suits some games well.
In this case it fits as it reinforces the fast movement from left to right, which is what the game's all about. And you thought I just threw all these games together by blindly bashing on the keys until the errors stop. Ahem.

Anyway as this game uses box2D the results are very variable. A little tweak here and a little one there and it throws up totally different results, which in turn means a lot of testing. I must have seen the same screens thousands of times. I mean that literally.

The other day my beautiful Star Wars wipe got to the point where I couldn't take it any more. I imagine people who work in the porn industry get sick of it after a while, or a tour guide at the Sistine Chapel ( Now there's two extremes ). I'm going to shorten it to make it run quicker.

No.

Trust your instincts when it comes to the timing of things like that. If it looked great the first couple of times ( After tweaking of course. Nothing is right first time ) then it's right. Don't let your boredom get the better of you.
Many a time I've had to dig my heels in with clients where they've seen lots and lots of iterations of a game ( That's agile development for you ) where they've got sick of the same sequence I have, and suggested it be shortened.

Just say the same thing you would to a unkempt man with his arm in a sling asking you to just help him put something heavy in the back of his van, here, it's just up this dark alley. Just reach right in there and put it far at the back, whilst he stands behind you.

If you say yes to it, it will be the development equivalent of having to rub the lotion into your skin. And no, we don't want the hose again.

It's not just transitions, text too is something that it's easy to skip by too quickly. A simple rule of thumb, read the text yourself twice. Not coder read it, proper read it. Twice. Slowly. And that's how long it's going to have to sit there, no matter how many times you have to sit through it ( Before any one chimes in and says you just the reduce the time during testing and put it back to the original when the game's nearly done, I know, this is just design theory. Work with me here ).

Squize.

#    Comments [5] |
 
Thursday, September 10, 2009

Lives. They're really not evil you know.

Our mate Ali has had his Mechanaught game reviewed over at Jay's. We really like the game.

mechanaughtscreenie.png

It's not perfect, but what it does it does really well. It is what a good Flash game should be, a nice time waster, not a life changing experience.

Something in the review about it though really caught my eye,

"My biggest gripe with Mechanaught is actually the implementation of lives. I thought we'd covered this was an unnecessary and annoying idea for a browser game. I sent out flyers and everything. This is a flash game, not an arcade hall with a sticky floor. You're not going to get quarters out of me, just an enraged baboon-like hooting.
If you run out of lives, that's it. Game over. You can go back to your most recent save, but it's still frustrating. Maybe some people will like the added difficulty, but the rest of us are going to be annoyed that dying carries such a stiff penalty instead of simply popping you back to the beginning of a stage. Maybe if health kits were a more frequent find, it wouldn't be as much of an issue.
"

I must have missed the memo. It's one thing that a games difficulty may be out slightly for some players ( No one will ever get it perfect for everyone ), but a game with lives and a game over mechanic is far from a dated notion.
An end of level boss was originally a spike in the difficulty to increase the length of a game. These soon became the norm to the point that most players expect a boss battle and feel cheated if they don't get one. And yet, they are there for the very same reason that lives are. It's to increase the longevity of a game and introduce a pronounced risk / reward, in the case of lives something which is clearly tangible from the offset.

I just finished Arkham Asylum the other day. Fantastic game, believe the hype. All the reviews said it's about 10 hours gameplay, but I've been off the xbox for a while so I'm a bit rusty, it must have taken me more like 12/14 ( I've still got to go back and max those achievements out. I'm a gamer score whore ). That didn't have lives, and just as well as it would be in the bin by now if I got a Game Over after dying 3 times and then sent back a fair way.
That's a 10+ hour game, not a 30min Flash game. A lives mechanic only really works if you can complete the game with the base number of lives, or you can either collect extra ones or have continues ( Or it's pure score attack, Geometry Wars being the perfect example of a popular console shoot'em up with a nasty ol' Game Over ) so you can actually complete it.

I think it's fair to say that there isn't a progressive Flash game with 10 hours playability before the job is done. Yeah you may have played DTD for 10 hours in total ( Which has lives in the form of energy ) but nothing that I know of that's 10 hours from the start of the tale to the conclusion ( Does Dofus count ? Feel free to correct me if it does ).

Lives are a valid mechanic for small Flash games. I'm not saying every game in Flash should use them ( Untold games shouldn't ), but a lot of games suit them, need them in fact. Just to repeat myself, they lengthen the game play ( The game play we can't lengthen with more real content due to budgets ). It may be a slightly artificial and forced way to do it, but in adding a clear risk and reward to the game it works well.
The alternative being ? Grinding out a victory ? I'm old enough to have used infinite lives pokes in games, and no matter how hard you try you soon succumb to the safety / apathy that offers and with no risk you miss out on that all important money shot that is reward.

Squize.

#    Comments [8] |
 
Tuesday, September 08, 2009

What's stuck in our pipeline ?

Figured it would be an idea to actually talk about Flash work on here for a pleasant change. I've been quiet of late as to be honest nothing much has been happening. I've been wrestling with box2D for one project, finishing off another and working on the TD as a personal release.

Here's a little grab from the National Geographic project ( I can't say anything more about it, NDAs = not the best subject for a blog post )

natGeo_grab.png

We've been hit with a lot of amends on this project, but it's all shaping up nicely. I believe it's going to be a CD only release, possibly making it online at a later date. So that's a game I can't talk about that you'll possibly never play. This is why I haven't been blogging much.

Next up is a game I've been doing with my mate Elliot at www.MakingFunGames.com


dac_grab.png


Not the most gripping of screen grabs I know, but I think this could well be a bit secret too ( No NDA, but then no "Feel free to spill your guts about it" ). This is a box2D based game, and I'm not even going to start bitching about how hellish it is to get box2D to do something ( I did the pinball game way back, and so had forgotten everything I'd learned, which at the time was barely enough to get a ball moving with some flippers ).
I think it's going to be quite good when it's done, there is something pleasing about making cars crash for some primeval reason.

Both of these should be done and dusted by the end of the month.

ionicChyrsus_grab.jpg

This is the current build of Ionic, my TD game, which shows some nasty placeholder art for the turrets. The baddie shadow effects are in now, which I'm really happy with ( So happy I didn't actually manage to capture a grab of them in action ) plus some of the collision checks / shooting. One thing I added the other day is that little spiky drone just at the bottom of that top red box. That little drone, aside from needing to be scaled up and re-coloured, comes out of that open hatch on the far left there and collects any dropped coins when a baddie is killed ( See, he's heading for that obscured spinning gold G there ).

They say a picture is worth a 1000 words, aside from that one, which needs a 1000 words to explain it. Not my greatest prtScn moment.

I'm not even going to put a release date on Ionic, it's done when it's done. It's not me being all "This is my art, don't you understand ?", it's me being snowed under with other things, so this is my down time project.

Squize.

#    Comments [3] |
 
Friday, September 04, 2009

A game in a week - not with me it seems ...

So, it's 21:11h here in Germany now and just 2 minutes ago I wiped off the last item on my todo list for Via Romanum, a word game I've been working on for the last couple of days.

There will be no public release for the next 2 weeks though (I'm on holiday, yehaaa!).

So without going into detail (I'll have to do a quick rant about creating and searching large lists of words and how to make that quick enough to test a whole 10x10 grid for left/right and top/down combinations of letters that might form words)

Sunset_04a.jpg
Just to set the mood even for our well known logo ...

via_promo_00.jpg
... the menu screen ...

via_promo_01.jpg
... and some in game impressions.


Off to the beach now ... nGFX


#    Comments [2] |
 
Monday, August 31, 2009

Power of recall please.

One of our rare political posts on here. Both Olli and myself try and avoid them as we don't speak for each other when it comes to things like politics and religion, and this is meant to be a blog about Flash and our tinkering with it. But sometimes things need to be vented.

The whole ethos of the political system in Britain, and most Western countries, is that you vote for someone to represent your views in Parliament / equivalent. At a maximum every 5 years ( There is no fixed term government in the UK, it's up to the Prime Ministers disgression ) we have a general election where every "seat" in the House of Commons is voted for. The only other time a seat can be contested is during a by-election, which usually comes about due to the current MP ( Member of Parliament ) being taken ill and unable to carry out their duties.

In Britain we don't have the power to "recall" a MP. Recall is basically a vote of no confidence in a MP where through voter power they can lose their seat and a by-election can be called to replace them. Ironically we do have the power to push through a motion of no confidence, but that's not in our hands, that's only available to the opposition parties. If a motion is put forward then the majority of the house of commons has to vote for it for it to be passed. If the government of the day has an overall majority, then unless a lot of it's own members rebel, it's not going to get passed. I can't see many MPs voting to lose their jobs on morale grounds.

In effect, there is no way through voter power to remove either one single MP, or a whole government, until the current Prime Minister sets a date for a general election, or the parliamentary term runs out.

Earlier this year we had the expenses row. MP's more than playing the system, they were effectively stealing from the British public, the tax payers, the people who put them into power basically. They've stolen our money, and we can do nothing at all about it. Nothing.

One of my favourite quotes about it was from the Tory MP Alan Duncan, describing the situation after the expenses row broke, "You have to live on rations and you are treated like shit.". This is someone who in the last six years has claimed £127,658 under the second home allowance. Of course he apologised after wards, explaining it was just a joke. Mr Duncan, you jokester you.

No way to get rid of these people. Unreal.

What can happen though is that public opinion can turn so badly against an MP that they look to stand down at the next election ( As there is no way they can win ). This isn't really falling on the sword for things like claiming extensive mortgage payments on a property which is already paid for and claiming it was an oversight ( That's not even me making it up to justify my point. Or happened just the once ).
Come the next general election a lot of MP's will be standing down due to the expenses row, so up until then they will still be representing their constituents in parliament. Why aren't these people quitting on the spot and enabling a by-election when they have lost the confidence of the people they are paid to represent ?

Meet the golden parachute payment. This little beauty is in place to "ease" MP's back into life outside of politics. This is a sum based on age and length of time as a MP. The best thing ? The first £30,000 is tax free. Recently it's been agreed that the amount of the salary they receive will increase. Every 3 years the Review Body on Senior Salaries ( SSRB ) reviews MP's pay levels. This same review body recommended that only MPs who have lost their seats at an election, or due to boundary changes, should receive this payment. If you've resigned, you shouldn't get it. Just to show how toothless this body actually is, this recommendation has been overturned by a committee of MPs. Vested interest ?

Is it any wonder that MP's are going to stand down at the next election, rather than do the honorable thing and quit now.

Here's an interesting thing. In May 2007 BP ( British Petroleum ) signed a deal with Libya to embark on a sharing deal of any gas or oil deposits found in the country. BP gets a healthy 19% share, in return for a $900 million investment. It's been quoted that the deal could generate as much as £15 billion in revenue.
Now BP have had a rough time of it recently, their profits are less than projected over the last quarter. A mere $2.6 billion, with yearly profits being $25.6 billion. Hard times, when you consider how much they spend on exploration and still see profits like that. These numbers are just vast. This is the 5th largest company in the world.

21st December 1988 a terrorist bomb was detonated in Pan Am flight 103, with the bulk of the wreckage landing on the Scottish town of Lockerbie. In total 270 were killed.

On 31 January 2001 Abdelbaset Ali Mohmed Al Megrahi was convicted and sentenced to life imprisonment.

On the 20th of this month he was freed on compassionate grounds as he has been diagnosed with terminal cancer. He's gone home to die.

This has obviously caused an outcry from all corners, relatives of victims, the US government ( Including the FBI ), the British press, the British people as a whole weren't in favour of this ( See this poll taken in Scotland ).

Remember how we mentioned BP and it's deal with Libya. Letters have been leaked that implicate the release of al-Megrahi with that deal being ratified.

Here's a quote from Saad Djebbar, a lawyer who advises the Libyan government "No one was in any doubt that if al-Megrahi died in a Scottish prison it would have serious repercussions for many years which would be to the disadvantage of British industry". Pretty obvious which industry that comment was aimed at, unless there are lots of British businesses investing $900 million + in Libya.

Here's a quote from a letter from Jack Straw, Secretary of State for Justice, sent to Kenny MacAskill, his Scottish counterpart in December 2007.
"The wider negotiations with the Libyans are reaching a critical stage and in view of the overwhelming interests for the United Kingdom, I have agreed in this instance the [prisoner transfer agreement] should be in the standard form and not mention any individual."
In his defence Straw originally didn't want to include al-Megrahi in any prisoner exchange deal, but did a U-turn as can be seen in the quote above.

Six weeks after that letter was sent the deal with BP was finally ratified.

One last quote, from Saif Gadaffi, Colonel Gadaffi's son, "People should not get angry because we were talking about commerce or oil. We signed an oil deal at the same time. The commerce and oil deals were all with the [prisoner transfer agreement]."

I think we're all grown up enough to know that all governments do things for what could be deemed the greater good without informing us. It's just that when politicians are shown to have told lies to us, the people who put them in power, the people who pay their wages, that we should have the right to remove them from their posts. The BP deal could generate up to £15 billion. How much of that will come back to us the tax payers ( Going by figures from 2002, only 20% ) ? Has a person who was convicted of killing 270 people been freed for purely economic reasons, to help wealthy people become more wealthy ? And if so, it's been done in our name, and there is nothing we can do about it.

Squize.

#    Comments [3] |
 
Monday, August 24, 2009

Oh dear, Oh dear me.

If you're a regular reader you'll hopefully know that when we moan or bitch about someone or something then it's usually 'cause we think it's justified. We don't just turn on anyone and everyone for the hell of it, or for the joy of stirring things up. Life's too short.

The target of my venom ? The latest article posted on mochi, "The work scheme of an independent Flash developer".

The author Badim has made a point of being open and honest with his figures in the past, which we've even linked to before. His constant openness has made him somewhat of a poster boy for the indie scene, he's living the dream for a lot of people, and he's not afraid to share his knowledge.

That's got to be applauded.

But his article, sorry, but there's just not one word I can agree with, and I'm amazed it's been passed fit for publication by mochi.

The low light for me is this quote:

"If you’re not naturally talented at art, the next issue to be resolved is where to get good graphics. The easiest, cheapest, fastest way is to use sprite sets. The most popular of them are the hits from consoles (Megaman, Zelda, Sonic). it’ll be convenient for you to find the right set for your future games. If you can’t find the sprite set you want or have something specific in mind, move to the next option."

( The next option being to pay an artist ).

If I've even got to explain the wrongness with that then this really isn't the blog for you, move along please.

These "Let's make money with Flash, it's piss easy and there's loads to be made" posts seem to be getting progressively worse. I've just re-read the article again to make sure, and I can't find any mention of the joy of creating a game. The creative process. The love that makes a game shine. The shit that should matter basically.

A very disappointing article which sums up what is so wrong with the indie Flash scene right now. It's great that we can all make cash now. It's even better than very talented people can make lots of cash now. It's not great when money becomes the central focus of game creation. I don't live in a bohemian bubble, I have the same bills to pay that you have. My full time job is making games, that's it, without them I starve. But I still put the game first, and that's the advice I'd give to anyone, not to use a Mario sprite in your game.

Squize.

#    Comments [9] |