In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

#16 Conway's Game of Life v3 ( flash on 2009-9-2 )

#16 Conway's Game of Life v3
* 
* ConvolutionFilter + paletteMap によるライフゲーム高速化実験。
* 意図的に遅くしないといけないとか、速すぎます。
* 色は意外と作られていない白黒にしてみました。おおよそ理解できたつもり。
* ところで黒白はどうやって作れば良いのでしょうか?
*
* FIXED:
* 乱数の種を常に0にしてたの忘れてた。ちょっとだけ増やしときますね。
* 
* NOTE:
* コーディングルールの意識(再確認)
* ・イベントハンドラはon*ではなく*Handler
* ・{}は縦に並ぶように
* 意図的違反: 優先順位を明確にするための()
* 
* @author krogue
Get Adobe Flash player
by krogue 02 Sep 2009
/**
 * Copyright krogue ( http://wonderfl.net/user/krogue )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/mYXe
 */

/**
 * #16 Conway's Game of Life v3
 * 
 * ConvolutionFilter + paletteMap によるライフゲーム高速化実験。
 * 意図的に遅くしないといけないとか、速すぎます。
 * 色は意外と作られていない白黒にしてみました。おおよそ理解できたつもり。
 * ところで黒白はどうやって作れば良いのでしょうか?
 *
 * FIXED:
 * 乱数の種を常に0にしてたの忘れてた。ちょっとだけ増やしときますね。
 * 
 * NOTE:
 * コーディングルールの意識(再確認)
 * ・イベントハンドラはon*ではなく*Handler
 * ・{}は縦に並ぶように
 * 意図的違反: 優先順位を明確にするための()
 * 
 * @author krogue
 */
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    
    [SWF(width="465", height="465", backgroundColor="0", frameRate="60")]
    public class Main extends Sprite
    {
        private var game:ConwayGame;
        private var frame:int = 0;
        
        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
        }
        
        private function addedToStageHandler(event:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
            initialize();
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
        
        private function enterFrameHandler(event:Event):void
        {
            update();
        }
        
        private function initialize():void
        {
            game = addChild(new ConwayGame()) as ConwayGame;
        }
        
        private function update():void
        {
            if (frame % 10 == 0)
                game.update();
            frame = (frame + 1 == 60 ? 0 : frame + 1);
        }
    }
}

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.filters.ConvolutionFilter;
import flash.geom.Point;
import flash.display.BitmapDataChannel;

class ConwayGame extends Sprite
{
    private static const COLOR_BLACK:uint = 0x000000;
    private static const COLOR_RED:uint = 0xFF0000;
    private static const COLOR_GREEN:uint = 0x00FF00;
    private static const COLOR_BLUE:uint = 0x0000FF;
    private static const ZERO_POINT:Point = new Point(0, 0);
    
    private const bitmap:Bitmap = addChild(new Bitmap()) as Bitmap;
    private const filter:ConvolutionFilter = buildFilter();
    private const rule1:Array /* of uint */ = new Array(256);
    private const rule2:Array /* of uint */ = new Array(256);
    private const rule3:Array /* of uint */ = new Array(256);
    
    public function ConwayGame()
    {
        bitmap.bitmapData = new BitmapData(465, 465, false, COLOR_BLACK);
        randomize(bitmap.bitmapData);
        
        // init rules (23/3)
        const n:int = 256;
        for (var i:int = 0; i < n; i++)
        {
            rule1[i] = COLOR_BLACK;
            rule2[i] = COLOR_BLACK;
            rule3[i] = COLOR_BLACK;
        }
        rule1[1 + 1 + 9] = COLOR_RED;
        rule1[1 + 1 + 1 + 9] = COLOR_RED;
        rule1[1 + 1 + 1] = COLOR_RED;
        rule2[1 + 1 + 9] = COLOR_GREEN;
        rule2[1 + 1 + 1 + 9] = COLOR_GREEN;
        rule2[1 + 1 + 1] = COLOR_GREEN;
        rule3[1 + 1 + 9] = COLOR_BLUE;
        rule3[1 + 1 + 1 + 9] = COLOR_BLUE;
        rule3[1 + 1 + 1] = COLOR_BLUE;
    }
    
    public function update():void
    {
        const bmd:BitmapData = bitmap.bitmapData;
        bmd.applyFilter(bmd, bmd.rect, ZERO_POINT, filter);
        bmd.paletteMap(bmd, bmd.rect, ZERO_POINT, rule1, rule2, rule3);
    }
    
    private static function randomize(bmd:BitmapData):void
    {
        bmd.lock();
        
        // randomize bmd (bmd = 0x000000 or 0x010101)
        const randomSeed:int = Math.floor(Math.random() * 0x100000000);
        const low:uint = 0;
        const high:uint = 1;
        bmd.noise(randomSeed, low, high, BitmapDataChannel.BLUE, true);
        
        // create rules (0x010101 => 0xFFFFFF)
        const rule1:Array /* of uint */ = new Array(256);
        const rule2:Array /* of uint */ = new Array(256);
        const rule3:Array /* of uint */ = new Array(256);
        const n:int = 256;
        for (var i:int = 0; i < n; i++)
        {
            rule1[i] = COLOR_BLACK;
            rule2[i] = COLOR_BLACK;
            rule3[i] = COLOR_BLACK;
        }
        rule1[1] = COLOR_RED;
        rule2[1] = COLOR_GREEN;
        rule3[1] = COLOR_BLUE;
        
        // apply rule (bmd = 0x000000 or 0xFFFFFF)
        bmd.paletteMap(bmd, bmd.rect, ZERO_POINT, rule1, rule2, rule3);
        
        bmd.unlock();
    }
    
    private static function buildFilter():ConvolutionFilter
    {
        // 順番に注意 (matrixX/Y => matrix)
        const filter:ConvolutionFilter = new ConvolutionFilter();
        filter.matrixX = 3;
        filter.matrixY = 3;
        filter.matrix = [ 1, 1, 1, 1, 9, 1, 1, 1, 1 ];
        filter.divisor = 0xFF;
        filter.bias = 0;
        return filter;
    }
}