19
Jan 10

A History of the World

I just returned from a trip round SE Asia to see my last project launch. Called ‘A History of the World in 100 Objects‘, it’s a joint venture between BBC Radio 4 and the British Museum to chart human history in a new way. I developed the concept for the Flash 3D object explorer with the guys at GT and built it using Flash 10′s native 3D capabilities. Users are able to explorer objects from throughout human history in a sort of 3D timeline and even make history by adding their own. Here’s the TV advert for the series:

Since it is expected to grow to up to 10,000 objects over the next 5 years, I used all the tricks in the book to optimise loading, rendering and memory management – which will bore most people to tears, so that’s for another time. Check out the Flash site itself here.


03
Dec 09

Mind control

Here’s one of my old games being controlled with brainwaves in a homebrew EEG device cobbled together by Italian Hacker Mastro Gippo:


27
Nov 09

MouseWheelTrap – how to stop simultaneous Flash / browser scrolling in AS3

Update: This project is now hosted at GoogleCode

I recently stumbled over a new AS3 gotcha that seems to be bugging a lot of the Flash community. Apparently a new 'feature' of AS3, whereby using the mousewheel inside an embedded Flash movie still scrolls the surrounding browser window (if it has enough content, that is).

This didn't happen in AS2. If a Flash movie had focus, mousewheel events weren't sent to the browser window. It wasn't a problem in FireFox either, until a recent update and adversely affects any AS3 Flash app embedded in an HTML page where you might want to scroll or zoom with the mousewheel while over the Flash, instead of the scrolling the browser window.

So, I decided to cook up some code to fix this. While it's early version and isn't perfect, it suits my purposes, is easy to set up and doesn't require any external JavaScript - so I'd thought I'd share it with the world, in case Adobe never get around to addressing this 'feature'.

Introducing MouseWheelTrap. A handy little utility class that traps mousewheel events while the mouse is over the Flash, so your app scrolls how it was intended to. I've tested it with SWFObject on PC IE and FireFox, but not with SWFMacMouseWheel on Mac (if someone could tell me if it works). I decided against using jQuery for trapping mouse events, partly out of laziness, partly because many people have no control over the HTML that embeds their Flash app and therefore can't add custom JavaScript.

Setting up MouseWheelTrap is easy:

  • Download the MouseWheelTrap ZIP package, or just the AS file.
  • Unzip the package and have a look at the demo, or just take the MouseWheelTrap.as file and put it in the com.spikything.utils folder into your own project or classpath.
  • Import the utility and set it up somewhere in your main class like so:
  • import com.spikything.utils.MouseWheelTrap;
    MouseWheelTrap.setup(stage);

    Simple huh? Let me know how you get on...


    23
    Oct 09

    CoolIris type thing in 30 lines

    package { // Piclens type thing in 30 lines (FP10+) Liam O'Donnell - spikything.com
        import flash.display.Sprite;
        import flash.events.Event;
        public class Main extends Sprite {
            private var container :Sprite;
            private var imageGrid :Sprite;
            private var images :Array = [];
            public function Main():void {
                container = addChild(new Sprite()) as Sprite;
                imageGrid = container.addChild(new Sprite()) as Sprite;
                for (var i:uint = 0; i <200; i++) images.push(getItem(i));
                images.sortOn("z", Array.NUMERIC | Array.DESCENDING);
                for each (var item:Sprite in images) imageGrid.addChild(item);
                addEventListener(Event.ENTER_FRAME, update);
            }
            private function getItem(index:uint):Sprite {
                var item:Sprite = new Sprite();
                item.x = -(200 / 3) * 210 / 2 + (index / 3) * 210;
                item.y = (index % 3) * 160 - 40;
                item.z = 100 + Math.random() * 2000;
                item.graphics.beginFill(Math.random() * 0xffffff);
                item.graphics.drawRect(0, 0, 200, 150);
                return item;
            }
            private function update(e:Event):void {
                imageGrid.x += ((stage.stageWidth / 2) - mouseX) * .2;
                container.rotationY = ((stage.stageWidth / 2) - mouseX) * .2;
            }
        }
    }


    17
    Oct 09

    Local playback security in FlashDevelop and Flash CS3 / CS4

    I've seen a few people get into a pickle over this one. When you're developing and testing locally, you need to set the 'Local Playback Security' setting (sometimes referred to as the 'use network services' option) depending on whether you wish to access local external files (e.g. XML files, or images) or some other server (e.g. your dev backend server). You can't access both from a locally running SWF anymore, since it's a security risk. So here's how to set that option in Flash CS3 / CS4 or from within FlashDevelop.


    01
    Oct 09

    Turkey

    Whirling dervishes in TurkeyI recently went to Turkey and travelled around the entire Western half of the country. The highlight was hot air ballooning over Cappadoccia, but I just found this long exposure photo of some whirling dervishes I took and thought it was worth posting.


    06
    Sep 09

    How to embed fonts in pure AS3

    On my travels as a contractor, I've seen various methods used for embedding fonts in ActionScript 3 projects (code embedded, creating font SWFs, runtime loading, etc). Each of them has its own merits (and limitations), but generally you're looking for something that's easy to do, easy to maintain (for others, not just yourself) and of course that works!

    So, here's the method I use for pure AS3 projects I compile with the Flex SDK. I embed the TTF or OTF file in a 'Style' class and include those font files in the CVS/SVN repository too - it does my head in when fonts go missing, because a designer can't remember which font they used:

    import flash.text.Font;
    import flash.text.TextFormat;

    // UNICODE RANGE REFERENCE
    /*
    Default ranges
    U+0020-U+0040, // Punctuation, Numbers
    U+0041-U+005A, // Upper-Case A-Z
    U+005B-U+0060, // Punctuation and Symbols
    U+0061-U+007A, // Lower-Case a-z
    U+007B-U+007E, // Punctuation and Symbols

    Extended ranges (if multi-lingual required)
    U+0080-U+00FF, // Latin I
    U+0100-U+017F, // Latin Extended A
    U+0400-U+04FF, // Cyrillic
    U+0370-U+03FF, // Greek
    U+1E00-U+1EFF, // Latin Extended Additional
    */

    [Embed(source = '../fonts/myfont.ttf', fontName = 'MY_FONT',
    fontWeight = 'regular', unicodeRange =
    'U+0020-U+0040,U+0041-U+005A,U+005B-U+0060,U+0061-U+007A,U+007B-U+007E',
    mimeType = 'application/x-font')]
    public static const MY_FONT :Class;

    public static const DEFAULT_FONT :String        = "MY_FONT";
    public static const DEFAULT_TEXT_COLOUR :int = 0xFFFFFF;
    public static const DEFAULT_TEXT_SIZE :int = 14;
    public static const MY_TEXT_FORMAT :TextFormat = new
    TextFormat(DEFAULT_FONT, DEFAULT_TEXT_SIZE, DEFAULT_TEXT_COLOUR);

    Through experience, this seems to be the most robust and maintainable way of dealing with fonts (not to throw out more flexible, but perhaps less robust ways, such as runtime loading), especially when you need control of the unicode ranges you are embedding - which I have included for reference.


    01
    Sep 09

    Making your own search engine

    faviconWell, sort of. I just added an OpenSearch plugin to the site, that adds a 'spikything' search option to the search drop-down in FireFox 2+ and IE7+. To add the search plugin on your browser, click the drop down arrow on the search bar in your browser (top-right) and click 'Add spikything search'.

    Here's more info on how to do this yourself.