CharacterChip Test

by nenjiru
キャラクターチップの実装実験 その1

検証内容まとめ
http://d.hatena.ne.jp/nenjiru/20110908/charachip
♥0 | Line 119 | Modified 2011-09-08 18:05:05 | MIT License | (replaced)
play

Related images

ActionScript3 source code

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

package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;
    import net.hires.debug.Stats;
    
    [SWF(frameRate="60", width="465", height="465")]
    
    /**
     * キャラクターチップの実装実験 その1
     * ステージサイズのビットマップに直接描画
     * 
     * @author nenjiru
     */
    public class CharacterChipTest extends Sprite 
    {
        private static const URL:String = "http://assets.wonderfl.net/images/related_images/f/f0/f0d9/f0d908a88f90364e927c41c65ec84590247aeee3";
        
        public function CharacterChipTest():void 
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE , complete);
            loader.load(new URLRequest(URL), new LoaderContext(true));
        }
        
        private function complete(event:Event):void 
        {
            var loaderInfo:LoaderInfo = event.target as LoaderInfo;
            loaderInfo.removeEventListener(Event.COMPLETE , complete);
            var source:Bitmap = loaderInfo.content as Bitmap;
            draw(source.bitmapData);
        }
        
        private function draw(source:BitmapData):void 
        {
            var canvas:BitmapData = new BitmapData(465, 465, false, 0xFFFFFFFF);
            addChild(new Bitmap(canvas));
            
            var chara:CharacterChip;
            var charas:Vector.<CharacterChip> = new Vector.<CharacterChip>();
            
            //3000体生成
            for (var i:int = 0; i < 3000; i++) 
            {
                chara = new CharacterChip(source.width, source.height, 4, 3);
                chara.x = 7 * (i % 65);
                chara.y = 9 * (i / 65 >> 0);
                chara.pattern = 1;
                charas.push(chara);
            }
            
            stage.addEventListener(Event.ENTER_FRAME, function (e:Event):void 
            {
                canvas.lock();
                canvas.fillRect(canvas.rect, 0xFFFFFFFF);
                
                for (var i:int = 0, n:int = charas.length; i < n; i++) 
                {
                    charas[i].update();
                    canvas.copyPixels(source, charas[i].rectangle, charas[i].point);
                }
                
                canvas.unlock();
            });
            
            addChild(new Stats());
        }
    }
}

import flash.geom.Point;
import flash.geom.Rectangle;

/**
 * キャラクターチップオブジェクト
 * 
 * @author nenjiru
 */
class CharacterChip  
{
    private var _row:int;
    private var _col:int;
    private var _frame:int;
    private var _pattern:int;
    
    private var _rect:Rectangle;
    private var _point:Point;
    
    /**
     * キャラクターチップ画像サイズと、行列数を指定
     * 
     * @param    width キャラクターチップ画像の横幅
     * @param    height キャラクターチップ画像の縦幅
     * @param    row 画像の横列(方向パターン)
     * @param    col 画像の縦列(アニメーションフレーム)
     */
    public function CharacterChip(width:Number, height:Number, row:int, col:int)
    {
        _row = row;
        _col = col;
        _rect = new Rectangle(0, 0, width / col >> 0, height / row >> 0);
        _point = new Point();
    }
    
    /**
     * 表示横列を示す
     * 
     * アニメーションパターンに相当する
     * 指定行を表示(反映)させるには、 update メソッドを実行する
     */
    public function get pattern():int 
    {
        return _pattern;
    }
    
    public function set pattern(value:int):void 
    {
        if (0 <= value && _row > value)
        {
            _pattern = value;
        }
    }
    
    /**
     * X座標
     */
    public function get x():Number 
    {
        return _point.x;
    }
    
    public function set x(value:Number):void 
    {
        _point.x = value;
    }
    
    /**
     * Y座標
     */
    public function get y():Number 
    {
        return _point.y;
    }
    
    public function set y(value:Number):void 
    {
        _point.y = value;
    }
    
    /**
     * ポイントオブジェクト
     */
    public function get point():Point 
    {
        return _point;
    }
    
    /**
     * 矩形オブジェクト
     */
    public function get rectangle():Rectangle 
    {
        return _rect;
    }
    
    /**
     * クリップ位置の更新
     */
    public function update():void 
    {
        _rect.x = (_frame++ % _col) * _rect.width;
        _rect.y = (_pattern * _rect.height);
    }
}