forked from: 1k Lemmings

by flashlight2 forked from 1k Lemmings (diff: 6)
1k Lemmings: animated bitmaps with variable framerates
runs @60 fps under 1.3ghz Atom
runs @45 fps (Android Froyo 2.2) under Snapdragon 1 Ghz
lemmings animation is 8 frames of 6*10 pixels
@by Hasufel 2010
♥0 | Line 108 | Modified 2010-09-02 05:09:52 | MIT License
play

ActionScript3 source code

/**
 * Copyright flashlight2 ( http://wonderfl.net/user/flashlight2 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/qeWT
 */

// forked from Hasufel's 1k Lemmings
package {
    //********************************************************
    //1k Lemmings: animated bitmaps with variable framerates
    //runs @60 fps under 1.3ghz Atom
    //runs @45 fps (Android Froyo 2.2) under Snapdragon 1 Ghz
    //lemmings animation is 8 frames of 6*10 pixels
    //@by Hasufel 2010
    //*******************************************************/
        
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.utils.ByteArray;
    import flash.utils.getTimer;
    import flash.utils.Timer;
    import net.hires.debug.Stats;

    [SWF(width=465, height=465, backgroundColor=40,frameRate=60)]

    public class Lemming extends Sprite {
        private const _stageW:uint = stage.stageWidth;
        private const _stageH:uint = stage.stageHeight;
        private const _graphicsData:Array =["ee1ebbd72568e9fbc851832ffc93c07d2ce8679bab84433de36adf92f01060061a1bafe090c09b10000000049454e44ae42608289504e470d0a1a0a0000000d49484452000000300000000a765526561647513fd0eb51eb936ea32b4fe8dd392efa0109cbc3b74a6ce33af450e158273cfc7a14a4f6ec508071511ba916bccd239b8c8dc9ac5ffd508572ac8ea5e1f125e7fc9ad52f1b935d6ada6c27c57ea5c8abb9c1039870be491733f6c267caee1ebbd72568e9fbc851832ffc93c07d2ce8679bab84433de36adf92f01060061a1bafe090c09b10000000049454e44ae426082ee1ebbd72568e9fbc851832ffc93c07d2ce8679bab84433de3ee1ebbd72568e9fbc851832ffc93c07d2ce8679bab84433de36adf92f01060061a1bafe090c09b10000000049454e44ae4260826adf92f01060061a1bafe090c09b10000000049454e44ae426082"];
        private var _renderData:BitmapData = new BitmapData(_stageW,_stageW,true,0xFFFFFFFF);
        private var _renderRect:Rectangle = new Rectangle(0,0,_stageW,_stageH);
        private var _loader:Loader;
        private var _assetsMemoryBank:Vector.<BitmapData> = new Vector.<BitmapData>;
        private var _assetsNum:uint = 0;
        private var _lemmingsNum:uint = 100;
        private var _lemmings:Vector.<LemmingSprite> = new Vector.<LemmingSprite>(_lemmingsNum, true);

        public function Lemming (){
            setProps(stage, {quality:StageQuality.LOW,scaleMode:StageScaleMode.NO_SCALE,align:StageAlign.TOP_LEFT});
            prepareAsset(0);
        }

        private function prepareAsset(n:int):void{
            var bytes:ByteArray = new ByteArray();
            var data1:Array=_graphicsData[n].split("");
            var data2:Array=[];
            var d1l:int = data1.length;
            for (var i:int=0;i<d1l;i+=2){
                data2.push("0x"+data1[i]+data1[i+1]);
            }
            var d2l:int = data2.length;
            for (var j:int=0;j<d2l;j++){
                bytes[j] = data2[j];
            }
            _loader = new Loader();
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE,assetLoaded);
            _loader.loadBytes(bytes);
        }

        private function assetLoaded(event:Event):void {
            var t:BitmapData = new BitmapData(_loader.content.width,_loader.content.height,true,0x00FFFFFF);
            t.draw(_loader.content,new Matrix());
            _assetsMemoryBank.push(t);
            _assetsNum++;
            if (_assetsNum<_graphicsData.length) {prepareAsset(_assetsNum);}
            else {initAnimation();}
        }

        private function initAnimation():void {
            addChild(new Bitmap(_renderData)) as Bitmap;
            addChild( new Stats() );
            for (var i:uint=0;i<_lemmingsNum;i++){
                _lemmings[i]=createLemming(randomNumber(0,_stageW),randomNumber(0,_stageH),[0,1,2,3,4,5,6,7],_assetsMemoryBank[0],70,randomNumber(0,8),6);
            }
            addEventListener(Event.ENTER_FRAME, renderDisplay);
        }

        private function renderDisplay(e:Event):void {
            var t:uint = getTimer();
            var z:uint=_lemmingsNum;
            _renderData.lock();
            _renderData.fillRect(_renderRect,0x00FFFF00);
            while(z--){
                var a:LemmingSprite = _lemmings[z];
                a.x+=.4;
                if (t - a.ti >=a.spd){
                    a.im = (++a.im)%a.imArL; //update frame to display
                    a.ti = t; //update inner time
                }
                _renderData.copyPixels(a.bmd,new Rectangle(a.imAr[a.im]*a.imW,0,a.imW,a.imH),new Point(a.x,a.y),null, null, true);//null, null, true for transparency
                if (a.x>_stageW) {a.x = -600;}
            }
            _renderData.unlock();
        }

        private function createLemming(x:Number,y:Number,imAr:Array,bmd:BitmapData,spd:uint,im:uint,imW:uint):LemmingSprite {
            var p:LemmingSprite=new LemmingSprite();
            setProps(p, {x:x,y:y,imAr:imAr,imArL:imAr.length,bmd:bmd,spd:spd,ti:getTimer(),im:im,imW:imW,imH:bmd.height});
            return( p );
        }

        private function randomNumber(low:uint, high:uint):uint{
            return Math.round(Math.random() * (high - low) + low);
        }

        private function setProps(o:*,p:Object):void {
            for (var k:String in p) {o[k]=p[k];}
        }
    }
}

import flash.display.BitmapData;
class LemmingSprite {
    public var x:Number;//x
    public var y:Number;//y
    public var imAr:Array;//frames array
    public var imArL:uint;//number of frames
    public var bmd:BitmapData;//bitmapData reference
    public var spd:uint;//frequence in ms of animation
    public var ti:uint;//inner time
    public var im:uint;//current frame counter
    public var imW:uint;//width for subdivision
    public var imH:uint;//height for subdivision
}