キャラチェンジ forked from: ワンダフルクエスト

by itouhiro forked from 画像表示のみ forked from: ワンダフルクエスト (diff: 218)
[c]でキャラチェンジ
[カーソルキー]でキャラ操作。
地形の当たり判定をしてないので「通れない地形」は現段階では無し。
♥0 | Line 229 | Modified 2013-07-11 12:04:52 | MIT License | (replaced)
play

ActionScript3 source code

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

// forked from itouhiro's "画像表示のみ forked from: ワンダフルクエスト"
// forked from siouxcitizen's "forked from: ワンダフルクエスト" http://wonderfl.net/c/fMu8
/**=====================================================
 * 画像をassets.wonderfl.netにアップロードして、表示をためします
 * ===================================================== */
package {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    
    /**
     * ...
     * @author itouhiro
     */
    [SWF(width="465", height="465", frameRate="30", backgroundColor="0xEEEEEE")]
    public class Main extends Sprite {
        private var preload:Preloader;
        static public var loading:int = 0;
        
        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            
            preload = new Preloader();
            trace('preload');
            addEventListener(Event.ENTER_FRAME, preloadHandler);
        }
        
        private function preloadHandler(e:Event):void {
            if (loading <= 0) return;
            removeEventListener(Event.ENTER_FRAME, preloadHandler);
            gamePlay();
        }
        
        private function gamePlay():void {
            var wld:World = new World(Bitmap(preload.get().content), stage);
            addChild(wld);
            
        }
    }
}
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.ProgressEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.ui.Keyboard;

class Preloader extends Sprite{
    private var preloadText:TextField = null;
    private var ld:Loader;
    
    public function Preloader():void {
        trace('constructor');
        ld = new Loader();
        ld.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
        ld.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgressHandler);
        ld.load(new URLRequest('http://assets.wonderfl.net/images/related_images/0/03/03e1/03e140c0fe09a4055ea74ea7b74af1c1a963ef68'), new LoaderContext(true));
    }
    
    public function get():Loader {
        return ld;
    }
    
    private function loadCompleteHandler(e:Event):void {
        removeChild(preloadText);
        Main.loading++;
    }
    
    private function loadProgressHandler(e:ProgressEvent):void {
        if ( ! preloadText) {
            //preloader
            preloadText = new TextField();
            preloadText.x = 160; preloadText.y = 12; preloadText.width = 160;
            preloadText.defaultTextFormat = new TextFormat('Verdana', 16, 0x000000);
            preloadText.text = 'Loading: 0 %';
            addChild(preloadText);
        }
        var percentLoaded:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
        preloadText.text = 'Loading: ' + percentLoaded + ' %';
        trace('Loading: ' + percentLoaded + ' %');
    }
}

class World extends Sprite {
    private var mapCharaTip:BitmapData;
    private var charaTip:Array;
    private var mapTable:Array;
    private var block:Array; //mapを人が通過できるかどうか。false..通れる、true..通行不可
    private var hero:Actor;
    private var scrn:Sprite;
    private var mv:Array = [0, 0];
    private var cnt:int = 0;
    
    public function World(img:Bitmap,stg:Stage):void {
        //画像の縦横比を3倍にしてmapCharaTipにcopy
        mapCharaTip = new BitmapData(img.width * 3, img.height * 3, true, 0x00000000);
        var matrix:Matrix = new Matrix(); matrix.scale(3, 3);
        mapCharaTip.draw(img, matrix);
        
        var w:int, h:int;
        //地形をbgDataに配置
        //[0]芝生, [1]砂, [2]石畳, [3]フローリング, [4]橋(縦), [5]橋(横), [6]木(小), [7]木(大),
        //[8]サボテン, [9]水, [10]壁(石), [11]壁(木), [12]壁(武器屋), [13]壁(防具屋), [14]壁(宿屋), [15]壺,
        //[16]タンス, [17]石像, [18]真っ暗
        block = [
            false, false, false, false, false, false, true, true,
            true, true, true, true, true, true, true, true,
            true, true, true, true
        ];
        var mapTable:Array = [
             [ 0, 9, 0, 0, 0, 0, 1, 0, 0, 0],
             [ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0],
             [ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0],
             [ 0, 9, 0, 0, 0, 0, 0, 0, 6, 0],
             [ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0],
             [ 1, 9, 0, 0, 0, 0, 0, 0, 0, 0],
             [ 1, 9, 9, 9, 9, 9, 9, 4, 4, 9],
             [ 1, 0, 0, 0, 9, 9, 0, 0, 0, 0],
             [ 1, 1, 0, 0, 5, 5, 0, 0, 0, 0],
             [ 1, 1, 1, 9, 9, 9, 9, 0, 0, 1],
        ];
        var bgData:BitmapData = new BitmapData(mapTable[y].length * 48, mapTable.length * 48, false, 0x333333);
        for (h = 0; h < mapTable.length; h++) {
            for (w = 0; w < mapTable[h].length; w++) {
                bgData.copyPixels(mapCharaTip, new Rectangle(mapTable[h][w]*48, 0, 48, 48), new Point(w*48, h*48));
            }
        }
        //キャラの[種類][パターン]ごとにcharaTipに登録
        charaTip = [];
        for (h = 1; h < mapCharaTip.height / 48; h++) {
            charaTip[h] = [];
            for (w = 0; w < mapCharaTip.width / 48; w++) {
                var charaData:BitmapData = new BitmapData(48, 48, true, 0x00000000);
                charaData.copyPixels(mapCharaTip, new Rectangle(w*48, h*48, 48, 48), new Point(0,0));
                charaTip[h][w] = new Bitmap(charaData);
            }
        }
        //画面表示
        scrn = new Sprite(); //screen
        var bg:Bitmap = new Bitmap(bgData);
        scrn.addChild(bg);
        
        //キャラ表示
        hero = new Actor(charaTip);
        hero.x = int(mapTable[0].length/2)*48;
        hero.y = int(mapTable.length/2)*48;
        scrn.addChild(hero);
        
        scrn.x = stg.stageWidth / 2 - 24 - hero.x;
        scrn.y = stg.stageHeight / 2 - 24 - hero.y;
        addChild(scrn);
        
        stg.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    }
    
    private function enterFrameHandler(e:Event):void {
        cnt = (cnt + 1) % 15; //frameRate/2
        if (cnt === 0) hero.patt();
        
        var u:int = 4; //unit
        if (mv[0] !== 0) {
            if (mv[0] > 0) { 
                scrn.x -= u;
                hero.x += u;
                mv[0] -= u;
            } else {
                scrn.x += u;
                hero.x -= u;
                mv[0] += u;
            }
        }
        if (mv[1] !== 0) {
            if (mv[1] > 0) { 
                scrn.y -= u;
                hero.y += u;
                mv[1] -= u;
            } else {
                scrn.y += u;
                hero.y -= u;
                mv[1] += u;
            }
        }
    }
    
    private function keyDownHandler(e:KeyboardEvent):void {
        if (mv[0] !== 0 || mv[1] !== 0) return;
         if (e.keyCode === Keyboard.UP) {
            mv = hero.move(Actor.UP);
        } else if (e.keyCode === Keyboard.DOWN) {
            mv = hero.move(Actor.DOWN);
        } else if (e.keyCode === Keyboard.RIGHT) {
            mv = hero.move(Actor.RIGHT);
        } else if (e.keyCode === Keyboard.LEFT) {
            mv = hero.move(Actor.LEFT);
        } else if (e.keyCode === Keyboard.C) {
            hero.changeChara();
        }
    }
    public function isMovable(ax:int, ay:int):Boolean {
        return block[mapTable[ay][ax]];
    }
}

class Actor extends Sprite {
    public static const UP:int = 2; //enum
    public static const DOWN:int = 0;
    public static const RIGHT:int = 4;
    public static const LEFT:int = 6;
    
    private var lastdir:int = 0; //向き
    private var lastpatt:int = 0;
    private var charas:Array = [];
    private var charaIndex:int = 0;
    private var bitmaps:Array = [];
    private const u:int = 48; //unit
    private var pattern:int = 0;
    
    public function Actor(kind:Array):void {
        charas = kind;
        bitmaps = charas[charaIndex + 1];
        addChild(bitmaps[lastdir+lastpatt]);
    }
    
    public function move(direction:int):Array {
        removeChild(bitmaps[lastdir+lastpatt]);
        lastdir = direction;
        addChild(bitmaps[lastdir+lastpatt]);
        switch (direction) {
            case Actor.DOWN:
                return [0, u];
            case Actor.UP:
                return [0, -u];
            case Actor.RIGHT:
                return [u, 0];
            case Actor.LEFT:
                return [-u, 0];
        }
        return [0,0];
    }
    
    public function patt():void {
        removeChild(bitmaps[lastdir+lastpatt]);
        pattern = (pattern + 1) % 2;
        lastpatt = pattern;
        addChild(bitmaps[lastdir+lastpatt]);
    }
    
    public function changeChara():void {
        removeChild(bitmaps[lastdir+lastpatt]);
        charaIndex = (charaIndex + 1) % 4;
        bitmaps = charas[charaIndex + 1];
        addChild(bitmaps[lastdir+lastpatt]);
    }
}