※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : osamX's ワンダフルクエスト [diff(749)]

FAVORITE BY
:
:
dot3D Dot
:
:
*reference3DALternativa3D面白い!!
:
:
:
:
墓標っぽいのが・・・なんだサボテンか。。。
:
:
Alternativa3D3Dなんかモンスターぽいのが・・・なんだサボテンか。。。
:
:
:
すげぇ・・・(汗
:
あれっ、見たコトあるモノが。。。
:
やべぇ!
:
WonderflQuest 第二章 そして舞台は3Dへ
:
毒でデュクシッってなりたい。
:
:
仕事がはやいw
:
すごー!
:
つくるのはやッ
:
FORKED
  1. // forked from clockmaker's [Alternativa3D] Wonderfl Quest 3D
  2. // forked from osamX's ワンダフルクエスト
  3. // forked from nengafl's nengafl
  4. /**=====================================================
  5.  * osamXさんのワンダフルクエストをfolkして3Dにしました。
  6.  * 3Dの実装はAlternativa3Dというライブラリを使っています。
  7.  *
  8.  * Papervision3Dと比べてポリゴン欠けが発生しづらいのが特徴で
  9.  * 今回の実装には向いていました。
  10.  *
  11.  * [How to Play]
  12.  * up, w    : move up
  13.  * down, s  : move down
  14.  * left, a  : move left
  15.  * right, d : move right
  16.  *
  17.  * [Hint]
  18.  * You can change map with edit MAP_DATA
  19.  * ===================================================== */
  20. package {
  21.     import com.bit101.components.ProgressBar;
  22.     import flash.display.*;
  23.     import flash.events.*;
  24.     import flash.geom.Point;
  25.     import flash.net.URLRequest;
  26.     import flash.system.LoaderContext;
  27.     import flash.ui.Keyboard;
  28.     import alternativa.engine3d.materials.MovieClipMaterial;
  29.     import alternativa.engine3d.materials.TextureMaterial;
  30.     import alternativa.engine3d.primitives.Plane;
  31.     import alternativa.types.Texture;
  32.     import alternativa.utils.MathUtils;
  33.     import jp.progression.commands.lists.SerialList;
  34.     import jp.progression.data.Resource;
  35.     import jp.progression.data.getResourceById;
  36.     import org.si.sion.*;
  37.     
  38.     [SWF(width="465", height="465", frameRate="60", backgroundColor="0x000000")]
  39.     public class WonderflQuest extends Sprite {
  40.         private static const FLDSIZE:uint = 48//フィールド(マップ上の1マス)の横・縦のドット数
  41.         private static const MAPSIZE:uint = 32//マップの横・縦のマスの個数
  42.         /**-----------------------------------------------------
  43.          * マップのデータ(ここが木で、あそこが芝生で...ってやつ)が入ってます。
  44.          * ここをいじると、マップが変わります。上のfieldListのコメント参照。
  45.          * ----------------------------------------------------- */
  46.         private static const MAP_DATA:Array =
  47.             [
  48.             [99999991112111110611111111211119],
  49.             [99990000010133110011000001013319],
  50.             [99990000010138330011000001013839],
  51.             [99990000010133337011000001013339],
  52.             [99911111010131110011111101013119],
  53.             [99110000000000000011000000000009],
  54.             [99110007000111110011000700011119],
  55.             [99110000006000010011000000600009],
  56.             [99110000000000000011000000000009],
  57.             [99111101000100001011110100010009],
  58.             [99111111000111111111111100011119],
  59.             [99999999449999991199999944999999],
  60.             [99000990000606671100099000060009],
  61.             [99100550000000701110055000000009],
  62.             [99119999001100601811999900110069],
  63.             [99199999999911101119999999991119],
  64.             [99111111112111110611111111211119],
  65.             [99110000010133110011000001013319],
  66.             [99110000010138330011000001013839],
  67.             [99110000010133337011000001013339],
  68.             [99111111010131110011111101013119],
  69.             [99110000000000000011000000000009],
  70.             [99110007000111110011000700011119],
  71.             [99110000006000010011000000600009],
  72.             [99110000000000000011000000000009],
  73.             [99111101000100001011110100010009],
  74.             [99111111000111111111111100011119],
  75.             [99999999449999999999999999999999],
  76.             [99000990000606071100999000060009],
  77.             [99100550000000001110555000000009],
  78.             [99999999999999999999999999999999],
  79.             [99999999999999999999999999999999],
  80.             ];
  81.         private static const SCALE:Number = 3//勇者やフィールドの拡大率
  82.         private static const SIZE:Number = 465//ステージの大きさ
  83.         // 空の画像
  84.         private static const SKY_URL:String = "http://clockmaker.jp/labs/100109_wonderfl_quest/imgs/sky.png";
  85.         private static const SPEED:Number = 3//勇者が歩くスピード FLDSIZEの約数にしてください
  86.         /**-----------------------------------------------------
  87.          * コンストラクタ。 ここが最初に処理されます。
  88.          * ----------------------------------------------------- */
  89.         public function WonderflQuest():void {
  90.             stage.quality = StageQuality.LOW;
  91.             _progress = new ProgressBar();
  92.             addChild(_progress);
  93.             _progress.x = (stage.stageWidth - _progress.width) / 2 >> 0
  94.             _progress.y = (stage.stageHeight - _progress.height) / 2 >> 0
  95.             createMap(); //マップを作る
  96.             yuusha = new Yuusha(); //勇者を作る
  97.             yuusha.scaleX = yuusha.scaleY = SCALE; //勇者を拡大表示
  98.             yuusha.x = yuusha.y = (SIZE - FLDSIZE) / 2//中央に配置
  99.             yuushaPos = new Point(16 * FLDSIZE, 26 * FLDSIZE); //勇者初期位置
  100.             moveMap(yuushaPos); //マップ移動
  101.         }
  102.         /**-----------------------------------------------------
  103.          * マップの1マス(フィールド)のリストです。
  104.          * ここをいじると好きな画像をマップ上に貼ることができます。
  105.          * 画像のサイズは、基本的に16*16ピクセルです。
  106.          * 形式はjpeg,gif,pngのどれかにしてください。
  107.          * Twitterのアイコン画像取得は、こちらのAPIを使わせてもらってます。
  108.          * http://usericons.relucks.org/
  109.          * ----------------------------------------------------- */
  110.         private const FIELD_IMG_URLS:Array = [
  111.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map0.png"false), //[ 0]: 芝生
  112.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map1.png"false), //[ 1]: 砂
  113.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map2.png"false), //[ 2]: 石畳
  114.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map3.png"false), //[ 3]: フローリング
  115.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map4.png"false), //[ 4]: 橋(縦)
  116.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map5.png"false), //[ 5]: 橋(横)
  117.             new Field("http://clockmaker.jp/labs/100109_wonderfl_quest/imgs/map6.png"true), //[ 6]: 木(小)
  118.             new Field("http://clockmaker.jp/labs/100109_wonderfl_quest/imgs/map7.png"true), //[ 7]: 木(大)
  119.             new Field("http://clockmaker.jp/labs/100109_wonderfl_quest/imgs/ton.png"true), //[ 8]: サボテン
  120.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map9.png"true), //[ 9]: 水
  121.             ];
  122.         /**-----------------------------------------------------
  123.          * 勇者の画像のURLリスト
  124.          * ----------------------------------------------------- */
  125.         private const YUUSHA_IMG_URLS:Array = [
  126.             "http://flash-scope.com/wonderfl/WonderflQuest/yuusha/yuushaF1.png"//前向き1
  127.             "http://flash-scope.com/wonderfl/WonderflQuest/yuusha/yuushaF2.png"//前向き2
  128.             "http://flash-scope.com/wonderfl/WonderflQuest/yuusha/yuushaB1.png"//後ろ向き1
  129.             "http://flash-scope.com/wonderfl/WonderflQuest/yuusha/yuushaB2.png"//後ろ向き2
  130.             "http://flash-scope.com/wonderfl/WonderflQuest/yuusha/yuushaL1.png"//左向き1
  131.             "http://flash-scope.com/wonderfl/WonderflQuest/yuusha/yuushaL2.png"//左向き2
  132.             "http://flash-scope.com/wonderfl/WonderflQuest/yuusha/yuushaR1.png"//右向き1
  133.             "http://flash-scope.com/wonderfl/WonderflQuest/yuusha/yuushaR2.png" //右向き2
  134.             ];
  135.         private var _progress:ProgressBar;
  136.         private var _world:BasicTemplate; // Alternativa3Dのテンプレート
  137.         private var _yuusha3D:Plane;
  138.         private var bMapData:Array = []; //フィールドが障害物か否かを記憶
  139.         private var frameCount:Number = 0//onEnterFrameで使用
  140.         private var keyFlags:Array = [falsefalsefalsefalse]; //下上左右のキーが押されているか
  141.         private var map:MovieClip; //マップ本体 これを動かして勇者が移動しているように見せる
  142.         private var walkDirection:int = 4//歩いていく方向 (0~3:下上左右  4:止)
  143.         private var yuusha:Yuusha; //勇者
  144.         private var yuushaPos:Point; //勇者のマップ上の座標
  145.         /**-----------------------------------------------------
  146.          * マップを作ります。
  147.          * この実装方法は良くないです。遅いし、何回も同じ画像をロードしてます。
  148.          * 画像が別ドメインにある時に、crossdomain.xmlがなくても大丈夫なようにしています。
  149.          * ----------------------------------------------------- */
  150.         private function createMap():void {
  151.             var i:int;
  152.             var cmd:IllegalLoadBitmapData;
  153.             map = new MovieClip();
  154.             bMapData = [];
  155.             var list:SerialList = new SerialList();
  156.             // update progress bar
  157.             list.onPosition = function():void {
  158.                 _progress.value = list.position / list.numCommands;
  159.             };
  160.             // Load Field Images
  161.             for (i = 0; i < FIELD_IMG_URLS.length; i++) {
  162.                 cmd = new IllegalLoadBitmapData(new URLRequest(FIELD_IMG_URLS[i].url));
  163.                 cmd.context = new LoaderContext(true);
  164.                 cmd.catchError = function(target:Object, error:Error):void {
  165.                     target.executeComplete();
  166.                 };
  167.                 list.addCommand(cmd);
  168.             }
  169.             // Load Yuusha Images
  170.             for (i = 0; i < YUUSHA_IMG_URLS.length; i++) {
  171.                 cmd = new IllegalLoadBitmapData(new URLRequest(YUUSHA_IMG_URLS[i]));
  172.                 cmd.context = new LoaderContext(true);
  173.                 cmd.catchError = function(target:Object, error:Error):void {
  174.                     target.executeComplete();
  175.                 };
  176.                 list.addCommand(cmd);
  177.             }
  178.             // SKY IMAGE
  179.             list.addCommand(new IllegalLoadBitmapData(new URLRequest(SKY_URL), {context: new LoaderContext(true)}));
  180.             // init
  181.             list.addCommand(
  182.                 function():void {
  183.                     for (var i:uint = 0; i < MAPSIZE; i++) {
  184.                         bMapData[i] = [];
  185.                         for (var j:uint = 0; j < MAPSIZE; j++) {
  186.                             var field:Field = FIELD_IMG_URLS[MAP_DATA[j][i]];
  187.                             bMapData[i][j] = field.isObstacle;
  188.                             switch (MAP_DATA[j][i]) {
  189.                                 case 6:
  190.                                 case 7:
  191.                                     field = FIELD_IMG_URLS[0];
  192.                                     break;
  193.                                 case 8:
  194.                                     field = FIELD_IMG_URLS[1];
  195.                                     break;
  196.                             }
  197.                             var res:Resource = getResourceById(field.url);
  198.                             if (res) {
  199.                                 var bmp:Bitmap = new Bitmap(res.toBitmapData());
  200.                                 bmp.x = FLDSIZE * i;
  201.                                 bmp.y = FLDSIZE * j;
  202.                                 bmp.scaleX = bmp.scaleY = SCALE;
  203.                                 map.addChild(bmp);
  204.                             }
  205.                         }
  206.                     }
  207.                     // build bitmap object from images
  208.                     yuusha.build(YUUSHA_IMG_URLS);
  209.                     // 3Dの初期化
  210.                     init3D();
  211.                     //イベントリスナーの登録
  212.                     addEventListener(Event.ENTER_FRAME, loop);
  213.                 }
  214.                 );
  215.             list.execute();
  216.         }
  217.         /**
  218.          * Init Alternativa3D
  219.          *
  220.          */
  221.         private var driver:SiONDriver = new SiONDriver();
  222.         private function init3D():void {
  223.             removeChild(_progress); //ロード画面非表示
  224.             stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); //イベントリスナーの登録
  225.             stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); //イベントリスナーの登録
  226.             var res:Resource = getResourceById(SKY_URL);
  227.             addChild(new Bitmap(res.toBitmapData()));
  228.             // Alternativa3Dを初期化
  229.             _world = new BasicTemplate(465465true);
  230.             addChild(_world);
  231.             var bmd:BitmapData = new BitmapData(map.width, map.height);
  232.             bmd.draw(map);
  233.             var tex:Texture = new Texture(bmd);
  234.             var mat:TextureMaterial = new TextureMaterial(tex);
  235.             var fieldPlane:Plane = new Plane(map.width, map.height, 11);
  236.             fieldPlane.cloneMaterialToAllSurfaces(mat);
  237.             _world.scene.root.addChild(fieldPlane);
  238.             fieldPlane.x = +map.width / 2 >> 0;
  239.             fieldPlane.y = +map.height / 2 >> 0;
  240.             var mcMat:MovieClipMaterial = new MovieClipMaterial(yuusha, FLDSIZE / SCALE, FLDSIZE / SCALE);
  241.             _yuusha3D = new Plane(FLDSIZE, FLDSIZE, 11);
  242.             _yuusha3D.cloneMaterialToAllSurfaces(mcMat);
  243.             _yuusha3D.z = -yuusha.height / 2;
  244.             _yuusha3D.rotationX = MathUtils.toRadian(90);
  245.             _world.scene.root.addChild(_yuusha3D);
  246.             _world.camera.z = -40;
  247.             _world.camera.rotationY = MathUtils.toRadian(180);
  248.             _world.camera.rotationX = MathUtils.toRadian(-100);
  249.             _world.camera.rotationZ = MathUtils.toRadian(180);
  250.             var field:Field;
  251.             var mat2:TextureMaterial;
  252.             var tree:Plane;
  253.             // 木とさぼ㌧だけ立体にする
  254.             for (var i:uint = 0; i < MAPSIZE; i++) {
  255.                 for (var j:uint = 0; j < MAPSIZE; j++) {
  256.                     switch (MAP_DATA[i][j]) {
  257.                         case 6:
  258.                         case 7:
  259.                         case 8:
  260.                             field = FIELD_IMG_URLS[MAP_DATA[i][j]];
  261.                             res = getResourceById(field.url);
  262.                             if (res) {
  263.                                 mat2 = new TextureMaterial(new Texture(res.toBitmapData()));
  264.                                 tree = new Plane(FLDSIZE, FLDSIZE, 11true);
  265.                                 tree.cloneMaterialToAllSurfaces(mat2);
  266.                                 _world.scene.root.addChild(tree);
  267.                                 tree.x = FLDSIZE * j + FLDSIZE / 2;
  268.                                 tree.y = FLDSIZE * i + FLDSIZE / 2;
  269.                                 tree.z = -FLDSIZE / 2;
  270.                                 tree.rotationX = MathUtils.toRadian(90);
  271.                             }
  272.                             break;
  273.                     }
  274.                 }
  275.             }
  276.             
  277.             var mml:String;
  278.             mml ="#REV;t120;";
  279.             mml+="%1@2s30@f100l4v9o6 $q7d2a2gfecd2>c<g8a8fg8f8ecd1&d1redae1redag2ec<a+6>c6d6<ag>c2<aga2&a8a8>d8e8a1;";
  280.             mml+="%1@4s30l8v7 $q3fafaeaeadadacgcgfafaeaeadadacgcgq7f+1f1q3f16a16>d<fadfa>d<e16a16>c<ea>c<ea>c<d16f16adf<a+>dfae16g16>c<eg<a>ceg<a+16>d16f<a+>d<ga+>d<a+g16a+16>d+<ga+>c+d+<a+>c+c+16e16>c+<c+e>c+<deae16g16>c+<eg>c+<eg>c+;";
  281.             mml+="%1@8s60l8@v126v14 $q5df<d>fce<c>e<a+>d<<a+>>d<a>cq8<<aq4>>cdfq8<dq4>fceq8<cq4>e<a+>dq8<<a+q4>>d<a>cq8<<aq4>>cq4< [da>d<a]4 q8dq4>dr4.<drdq8cq4>cr4.<crcq8<a+q4>a+r4.<a+ra+q8aq4>ar4.<araq8gq4>gr4.<grgq8>d+q4d+r4.d+rd+q8<aq4>ar4.areq8<aq4>ar4.ar<a;";
  282.             var playData:SiONData = driver.compile(mml);
  283.             driver.play(playData);
  284.         }
  285.         /**-----------------------------------------------------
  286.          * 毎フレームの処理。
  287.          * ----------------------------------------------------- */
  288.         private function loop(event:Event):void {
  289.             _yuusha3D.x = yuushaPos.x + FLDSIZE / 2;
  290.             _yuusha3D.y = yuushaPos.y + FLDSIZE / 2;
  291.             _world.camera.x = yuushaPos.x + FLDSIZE / 2;
  292.             _world.camera.y = yuushaPos.y + FLDSIZE + 100;
  293.             //20フレーム毎に処理する
  294.             if (frameCount++ > 20) {
  295.                 frameCount = 0;
  296.                 yuusha.walk();
  297.             }
  298.             //マップ(勇者)をどの方向に動かすか判定
  299.             if (yuushaPos.x % FLDSIZE == 0 && yuushaPos.y % FLDSIZE == 0) {
  300.                 var mapPosX:int = int(yuushaPos.x / FLDSIZE), mapPosY:int = int(yuushaPos.y / FLDSIZE);
  301.                 walkDirection = 4//止まる
  302.                 switch (true) {
  303.                     case keyFlags[0]: //下
  304.                         if (yuushaPos.y < (MAPSIZE - 1) * FLDSIZE && !bMapData[mapPosX][mapPosY + 1])
  305.                             walkDirection = 0;
  306.                         yuusha.changeDirection(0);
  307.                         break;
  308.                     case keyFlags[1]: //上
  309.                         if (yuushaPos.y > 0 && !bMapData[mapPosX][mapPosY - 1])
  310.                             walkDirection = 1;
  311.                         yuusha.changeDirection(1);
  312.                         break;
  313.                     case keyFlags[2]: //左
  314.                         if (yuushaPos.x > 0 && !bMapData[mapPosX - 1][mapPosY])
  315.                             walkDirection = 2;
  316.                         yuusha.changeDirection(2);
  317.                         break;
  318.                     case keyFlags[3]: //右
  319.                         if (yuushaPos.x < (MAPSIZE - 1) * FLDSIZE && !bMapData[mapPosX + 1][mapPosY])
  320.                             walkDirection = 3;
  321.                         yuusha.changeDirection(3);
  322.                         break;
  323.                 }
  324.             }
  325.             //次のマスまで自動的に勇者を歩かせる
  326.             switch (walkDirection) {
  327.                 case 0:
  328.                     yuushaPos.y += SPEED;
  329.                     break;
  330.                 case 1:
  331.                     yuushaPos.y -= SPEED;
  332.                     break;
  333.                 case 2:
  334.                     yuushaPos.x -= SPEED;
  335.                     break;
  336.                 case 3:
  337.                     yuushaPos.x += SPEED;
  338.                     break;
  339.             }
  340.             if (walkDirection < 4)
  341.                 moveMap(yuushaPos);
  342.         }
  343.         /**-----------------------------------------------------
  344.          * マップの座標計算。
  345.          * ----------------------------------------------------- */
  346.         private function moveMap(pos:Point):void {
  347.             map.x = (SIZE - FLDSIZE) / 2 - yuushaPos.x;
  348.             map.y = (SIZE - FLDSIZE) / 2 - yuushaPos.y;
  349.         }
  350.         /**-----------------------------------------------------
  351.          * キーボードのキーが押された時の処理。
  352.          * ----------------------------------------------------- */
  353.         private function onKeyDown(event:KeyboardEvent):void {
  354.             switch (event.keyCode) {
  355.                 case Keyboard.DOWN:
  356.                 case "s".charAt(0): //↓ s
  357.                     keyFlags[0] = true;
  358.             }
  359.             switch (event.keyCode) {
  360.                 case Keyboard.UP:
  361.                 case "w".charAt(0): //↑ w
  362.                     keyFlags[1] = true;
  363.             }
  364.             switch (event.keyCode) {
  365.                 case Keyboard.LEFT:
  366.                 case "a".charAt(0): //← a
  367.                     keyFlags[2] = true;
  368.             }
  369.             switch (event.keyCode) {
  370.                 case Keyboard.RIGHT:
  371.                 case "d".charAt(0): //→ d
  372.                     keyFlags[3] = true;
  373.             }
  374.         }
  375.         /**-----------------------------------------------------
  376.          * キーボードのキーが離された時の処理。
  377.          * ----------------------------------------------------- */
  378.         private function onKeyUp(event:KeyboardEvent):void {
  379.             switch (event.keyCode) {
  380.                 case Keyboard.DOWN:
  381.                 case "s".charAt(0): //↓ s
  382.                     keyFlags[0] = false;
  383.             }
  384.             switch (event.keyCode) {
  385.                 case Keyboard.UP:
  386.                 case "w".charAt(0): //↑ w
  387.                     keyFlags[1] = false;
  388.             }
  389.             switch (event.keyCode) {
  390.                 case Keyboard.LEFT:
  391.                 case "a".charAt(0): //← a
  392.                     keyFlags[2] = false;
  393.             }
  394.             switch (event.keyCode) {
  395.                 case Keyboard.RIGHT:
  396.                 case "d".charAt(0): //→ d
  397.                     keyFlags[3] = false;
  398.             }
  399.         }
  400.     }
  401. }
  402. import flash.display.*;
  403. import flash.errors.*;
  404. import flash.events.*;
  405. import flash.net.URLRequest;
  406. import flash.system.LoaderContext;
  407. import alternativa.engine3d.controllers.CameraController;
  408. import alternativa.engine3d.core.Camera3D;
  409. import alternativa.engine3d.core.Object3D;
  410. import alternativa.engine3d.core.Scene3D;
  411. import alternativa.engine3d.display.View;
  412. import jp.progression.commands.lists.SerialList;
  413. import jp.progression.commands.net.LoadCommand;
  414. import jp.progression.data.Resource;
  415. import jp.progression.data.getResourceById;
  416. /**-----------------------------------------------------
  417.  * 勇者クラスです。勇者を作ったり、足踏させたり、向きを変えたりします。
  418.  * ----------------------------------------------------- */
  419. class Yuusha extends MovieClip {
  420.     /**-----------------------------------------------------
  421.      * コンストラクタ。
  422.      * ----------------------------------------------------- */
  423.     public function Yuusha():void {
  424.     }
  425.     public var direction:int = 0//向き (0:前 1:後 2:左 3:右)
  426.     private var walkFlag:Boolean = true//足踏み用
  427.     private var yuushaImages:Array = []; //勇者の画像集
  428.     public function build(ImageURL:Array):void {
  429.         for (var i:uint = 0; i < 8; i++) {
  430.             var res:Resource = getResourceById(ImageURL[i]);
  431.             if (res) {
  432.                 var bmp:Bitmap = new Bitmap(res.toBitmapData());
  433.                 yuushaImages.push(bmp);
  434.                 if (i)
  435.                     yuushaImages[i].visible = false;
  436.                 addChild(yuushaImages[i]);
  437.             }
  438.         }
  439.     }
  440.     /**-----------------------------------------------------
  441.      * 向きを変更します。
  442.      * numは勇者の向きを表します。(0~3)
  443.      * ----------------------------------------------------- */
  444.     public function changeDirection(num:int):void {
  445.         direction = num;
  446.         for (var i:uint = 0; i < 8; i++) {
  447.             yuushaImages[i].visible = i == 2 * direction + int(walkFlag);
  448.         }
  449.     }
  450.     /**-----------------------------------------------------
  451.      * 足踏みさせます。
  452.      * ----------------------------------------------------- */
  453.     public function walk():void {
  454.         walkFlag = !walkFlag;
  455.         for (var i:uint = 0; i < 8; i++) {
  456.             yuushaImages[i].visible = i == 2 * direction + int(walkFlag);
  457.         }
  458.     }
  459. }
  460. /**-----------------------------------------------------
  461.  * Fieldクラスです。画像のURLと、そのフィールドが障害物か否かを保存します。
  462.  * ----------------------------------------------------- */
  463. class Field {
  464.     public function Field(s:String, b:Boolean = false):void {
  465.         url = s;
  466.         isObstacle = b;
  467.     }
  468.     public var isObstacle:Boolean//障害物か否か (true:障害物  false:障害物じゃない(歩ける))
  469.     public var url:String//画像のURL
  470. }
  471. class BasicTemplate extends Sprite {
  472.     /**
  473.      * 新しい BasicTemplate インスタンスを作成します。
  474.      * @param    viewWidth
  475.      * @param    viewHeight
  476.      * @param    scaleToStage
  477.      */
  478.     public function BasicTemplate(viewWidth:int = 640, viewHeight:int = 480, scaleToStage:Boolean = true) {
  479.         _viewWidth = viewWidth;
  480.         _viewHeight = viewHeight;
  481.         _scaleToStage = scaleToStage;
  482.         // Creating scene
  483.         scene = new Scene3D();
  484.         scene.splitAnalysis = false// not analysis for performance
  485.         scene.root = new Object3D();
  486.         // Adding camera
  487.         camera = new Camera3D();
  488.         camera.z = -1000;
  489.         scene.root.addChild(camera);
  490.         // camera contoller
  491.         cameraContoller = new CameraController(this);
  492.         cameraContoller.camera = camera;
  493.         // set view
  494.         view = new View();
  495.         view.camera = camera;
  496.         addChild(view);
  497.         // stage
  498.         if (stage)
  499.             init();
  500.         else
  501.             addEventListener(Event.ADDED_TO_STAGE, init);
  502.     }
  503.     /**
  504.      * カメラインスタンスです。
  505.      */
  506.     public var camera:Camera3D;
  507.     /**
  508.      * カメラコントローラーです。
  509.      */
  510.     public var cameraContoller:CameraController;
  511.     /**
  512.      * シーンインスタンスです。
  513.      */
  514.     public var scene:Scene3D;
  515.     /**
  516.      * ビューインスタンスです。
  517.      */
  518.     public var view:View;
  519.     /**
  520.      * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
  521.      * レンダリング後に実行したい処理を記述します。
  522.      */
  523.     protected var _onPostRender:Function = function():void {};
  524.     /**
  525.      * 初期化されたときに実行されるイベントです。
  526.      * 初期化時に実行したい処理を記述します。
  527.      */
  528.     private var _onInit:Function = function():void {};
  529.     /**
  530.      * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
  531.      * レンダリング前に実行したい処理を記述します。
  532.      */
  533.     private var _onPreRender:Function = function():void {};
  534.     private var _scaleToStage:Boolean;
  535.     private var _viewHeight:int;
  536.     private var _viewWidth:int;
  537.     public function get onInit():Function {
  538.         return _onInit;
  539.     }
  540.     public function set onInit(value:Function):void {
  541.         _onInit = value;
  542.     }
  543.     public function get onPostRender():Function {
  544.         return _onPostRender;
  545.     }
  546.     public function set onPostRender(value:Function):void {
  547.         _onPostRender = value;
  548.     }
  549.     public function get onPreRender():Function {
  550.         return _onPreRender;
  551.     }
  552.     public function set onPreRender(value:Function):void {
  553.         _onPreRender = value;
  554.     }
  555.     /**
  556.      * シングルレンダリング(レンダリングを一回だけ)を実行します。
  557.      */
  558.     public function singleRender():void {
  559.         onRenderTick();
  560.     }
  561.     /**
  562.      * レンダリングを開始します。
  563.      */
  564.     public function startRendering():void {
  565.         addEventListener(Event.ENTER_FRAME, onRenderTick);
  566.     }
  567.     /**
  568.      * レンダリングを停止します。
  569.      */
  570.     public function stopRendering():void {
  571.         removeEventListener(Event.ENTER_FRAME, onRenderTick);
  572.     }
  573.     /**
  574.      * 初期化されたときに実行されるイベントです。
  575.      * 初期化時に実行したい処理をオーバーライドして記述します。
  576.      */
  577.     protected function atInit():void {
  578.     }
  579.     /**
  580.      * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
  581.      * レンダリング後に実行したい処理をオーバーライドして記述します。
  582.      */
  583.     protected function atPostRender():void {
  584.     }
  585.     /**
  586.      * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
  587.      * レンダリング前に実行したい処理をオーバーライドして記述します。
  588.      */
  589.     protected function atPreRender():void {
  590.     }
  591.     /**
  592.      * @private
  593.      */
  594.     private function init(e:Event = null):void {
  595.         // resize
  596.         stage.addEventListener(Event.RESIZE, onResize);
  597.         onResize(null);
  598.         // render
  599.         startRendering();
  600.         atInit();
  601.         _onInit();
  602.     }
  603.     /**
  604.      * @private
  605.      */
  606.     private function onRenderTick(e:Event = null):void {
  607.         atPreRender();
  608.         _onPreRender();
  609.         scene.calculate();
  610.         atPostRender();
  611.         _onPostRender();
  612.     }
  613.     /**
  614.      * @private
  615.      */
  616.     private function onResize(event:Event = null):void {
  617.         if (_scaleToStage) {
  618.             view.width = stage.stageWidth;
  619.             view.height = stage.stageHeight;
  620.         } else {
  621.             view.width = _viewWidth;
  622.             view.height = _viewHeight;
  623.         }
  624.     }
  625. }
  626. /**
  627.  * クロスドメイン問題を無視してロードするLoadBitmapData
  628.  * @see http://wonderfl.net/code/5c164cb968b9883d1eee01b236c5206956e57545
  629.  */
  630. class IllegalLoadBitmapData extends LoadCommand {
  631.     public function IllegalLoadBitmapData(request:URLRequest, initObject:Object = null) {
  632.         // 引数を設定する
  633.         _request = request;
  634.         // 親クラスを初期化する
  635.         super(request, initObject);
  636.     }
  637.     private var _context:LoaderContext;
  638.     private var _request:URLRequest;
  639.     private var loaderA:Loader;
  640.     private var loaderB:Loader;
  641.     public function get context():LoaderContext {
  642.         return _context;
  643.     }
  644.     public function set context(value:LoaderContext):void {
  645.         _context = value;
  646.     }
  647.     override protected function executeFunction():void {
  648.         // Loader を作成する
  649.         loaderA = new Loader();
  650.         // イベントリスナーを登録する
  651.         loaderA.contentLoaderInfo.addEventListener(Event.COMPLETE, _complete1);
  652.         loaderA.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _ioError2);
  653.         loaderA.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, super.dispatchEvent);
  654.         // ファイルを読み込む
  655.         loaderA.load(_request, context);
  656.     }
  657.     /**
  658.      * データが正常にロードされたときに送出されます。
  659.      */
  660.     private function _complete1(e:Event):void {
  661.         loaderB = new Loader();
  662.         loaderB.contentLoaderInfo.addEventListener(Event.INIT, _complete2);
  663.         loaderB.loadBytes(loaderA.contentLoaderInfo.bytes);
  664.     }
  665.     private function _complete2(e:Event):void {
  666.         var loader:Loader = e.currentTarget.loader;
  667.         var bmd:BitmapData = new BitmapData(loader.width, loader.height, true, 0x00000000);
  668.         bmd.draw(loader);
  669.         // データを保持する
  670.         super.data = bmd;
  671.         // 処理を終了する
  672.         super.executeComplete();
  673.     }
  674.     private function _ioError2(e:IOErrorEvent):void {
  675.         super.throwError(thisnew IOError(e.text));
  676.     }
  677. }
noswf
  1. // forked from clockmaker's [Alternativa3D] Wonderfl Quest 3D
  2. // forked from osamX's ワンダフルクエスト
  3. // forked from nengafl's nengafl
  4. /**=====================================================
  5.  * clockmakerさんのWonderfl Quest 3D をfolkして勇者を俺のキャラに改造しました。
  6.  * clockさん、勝手な事をやってしまい、本当に申し訳御座いませんでした。
  7.  * [How to Play]
  8.  * up, w    : move up
  9.  * down, s  : move down
  10.  * left, a  : move left
  11.  * right, d : move right
  12.  *
  13.  * [Hint]
  14.  * You can change map with edit MAP_DATA
  15.  * ===================================================== */
  16. package {
  17.     import com.bit101.components.ProgressBar;
  18.     import flash.display.*;
  19.     import flash.events.*;
  20.     import flash.geom.Point;
  21.     import flash.net.URLRequest;
  22.     import flash.system.LoaderContext;
  23.     import flash.ui.Keyboard;
  24.     import alternativa.engine3d.materials.MovieClipMaterial;
  25.     import alternativa.engine3d.materials.TextureMaterial;
  26.     import alternativa.engine3d.primitives.Plane;
  27.     import alternativa.types.Texture;
  28.     import alternativa.utils.MathUtils;
  29.     import jp.progression.commands.lists.SerialList;
  30.     import jp.progression.data.Resource;
  31.     import jp.progression.data.getResourceById;
  32.     [SWF(width="465", height="465", frameRate="60", backgroundColor="0x000000")]
  33.     public class WonderflQuest extends Sprite {
  34.         private static const FLDSIZE:uint = 48//フィールド(マップ上の1マス)の横・縦のドット数
  35.         private static const MAPSIZE:uint = 32//マップの横・縦のマスの個数
  36.         /**-----------------------------------------------------
  37.          * マップのデータ(ここが木で、あそこが芝生で...ってやつ)が入ってます。
  38.          * ここをいじると、マップが変わります。上のfieldListのコメント参照。
  39.          * ----------------------------------------------------- */
  40.         private static const MAP_DATA:Array =
  41.             [
  42.             [99999991112111110611111111211119],
  43.             [99990000010133110011000001013319],
  44.             [99990000010138330011000001013839],
  45.             [99990000010133337011000001013339],
  46.             [99911111010131110011111101013119],
  47.             [99110000000000000011000000000009],
  48.             [99110007000111110011000700011119],
  49.             [99110000006000010011000000600009],
  50.             [99110000000000000011000000000009],
  51.             [99111101000100001011110100010009],
  52.             [99111111000111111111111100011119],
  53.             [99999999449999991199999944999999],
  54.             [99000990000606671100099000060009],
  55.             [99100550000000701110055000000009],
  56.             [99119999001100601811999900110069],
  57.             [99199999999911101119999999991119],
  58.             [99111111112111110611111111211119],
  59.             [99110000010133110011000001013319],
  60.             [99110000010138330011000001013839],
  61.             [99110000010133337011000001013339],
  62.             [99111111010131110011111101013119],
  63.             [99110000000000000011000000000009],
  64.             [99110007000111110011000700011119],
  65.             [99110000006000010011000000600009],
  66.             [99110000000000000011000000000009],
  67.             [99111101000100001011110100010009],
  68.             [99111111000111111111111100011119],
  69.             [99999999449999999999999999999999],
  70.             [99000990000606071100999000060009],
  71.             [99100550000000001110555000000009],
  72.             [99999999999999999999999999999999],
  73.             [99999999999999999999999999999999],
  74.             ];
  75.         private static const SCALE:Number = 3//勇者やフィールドの拡大率
  76.         private static const SIZE:Number = 465//ステージの大きさ
  77.         // 空の画像
  78.         private static const SKY_URL:String = "http://clockmaker.jp/labs/100109_wonderfl_quest/imgs/sky.png";
  79.         private static const SPEED:Number = 3//勇者が歩くスピード FLDSIZEの約数にしてください
  80.         /**-----------------------------------------------------
  81.          * コンストラクタ。 ここが最初に処理されます。
  82.          * ----------------------------------------------------- */
  83.         public function WonderflQuest():void {
  84.             stage.quality = StageQuality.LOW;
  85.             _progress = new ProgressBar();
  86.             addChild(_progress);
  87.             _progress.x = (stage.stageWidth - _progress.width) / 2 >> 0
  88.             _progress.y = (stage.stageHeight - _progress.height) / 2 >> 0
  89.             createMap(); //マップを作る
  90.             yuusha = new Yuusha(); //勇者を作る
  91.             yuusha.scaleX = yuusha.scaleY = SCALE; //勇者を拡大表示
  92.             yuusha.x = yuusha.y = (SIZE - FLDSIZE) / 2//中央に配置
  93.             yuushaPos = new Point(16 * FLDSIZE, 26 * FLDSIZE); //勇者初期位置
  94.             moveMap(yuushaPos); //マップ移動
  95.         }
  96.         /**-----------------------------------------------------
  97.          * マップの1マス(フィールド)のリストです。
  98.          * ここをいじると好きな画像をマップ上に貼ることができます。
  99.          * 画像のサイズは、基本的に16*16ピクセルです。
  100.          * 形式はjpeg,gif,pngのどれかにしてください。
  101.          * Twitterのアイコン画像取得は、こちらのAPIを使わせてもらってます。
  102.          * http://usericons.relucks.org/
  103.          * ----------------------------------------------------- */
  104.         private const FIELD_IMG_URLS:Array = [
  105.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map0.png"false), //[ 0]: 芝生
  106.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map1.png"false), //[ 1]: 砂
  107.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map2.png"false), //[ 2]: 石畳
  108.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map3.png"false), //[ 3]: フローリング
  109.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map4.png"false), //[ 4]: 橋(縦)
  110.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map5.png"false), //[ 5]: 橋(横)
  111.             new Field("http://clockmaker.jp/labs/100109_wonderfl_quest/imgs/map6.png"true), //[ 6]: 木(小)
  112.             new Field("http://clockmaker.jp/labs/100109_wonderfl_quest/imgs/map7.png"true), //[ 7]: 木(大)
  113.             new Field("http://clockmaker.jp/labs/100109_wonderfl_quest/imgs/ton.png"true), //[ 8]: サボテン
  114.             new Field("http://flash-scope.com/wonderfl/WonderflQuest/map/map9.png"true), //[ 9]: 水
  115.             ];
  116.         /**-----------------------------------------------------
  117.          * 勇者の画像のURLリスト
  118.          * ----------------------------------------------------- */
  119.         private const YUUSHA_IMG_URLS:Array = [
  120.             "http://img.f.hatena.ne.jp/images/fotolife/t/tagox_image/20100110/20100110163247.png"//前向き1
  121.             "http://img.f.hatena.ne.jp/images/fotolife/t/tagox_image/20100110/20100110163705.png"//前向き2
  122.             "http://img.f.hatena.ne.jp/images/fotolife/t/tagox_image/20100110/20100110163705.png"//後ろ向き1
  123.             "http://img.f.hatena.ne.jp/images/fotolife/t/tagox_image/20100110/20100110163247.png"//後ろ向き2
  124.             "http://img.f.hatena.ne.jp/images/fotolife/t/tagox_image/20100110/20100110164532.png"//左向き1
  125.             "http://img.f.hatena.ne.jp/images/fotolife/t/tagox_image/20100110/20100110164531.png"//左向き2
  126.             "http://img.f.hatena.ne.jp/images/fotolife/t/tagox_image/20100110/20100110164531.png"//右向き1
  127.             "http://img.f.hatena.ne.jp/images/fotolife/t/tagox_image/20100110/20100110164532.png" //右向き2
  128.             ];
  129.         private var _progress:ProgressBar;
  130.         private var _world:BasicTemplate; // Alternativa3Dのテンプレート
  131.         private var _yuusha3D:Plane;
  132.         private var bMapData:Array = []; //フィールドが障害物か否かを記憶
  133.         private var frameCount:Number = 0//onEnterFrameで使用
  134.         private var keyFlags:Array = [falsefalsefalsefalse]; //下上左右のキーが押されているか
  135.         private var map:MovieClip; //マップ本体 これを動かして勇者が移動しているように見せる
  136.         private var walkDirection:int = 4//歩いていく方向 (0~3:下上左右  4:止)
  137.         private var yuusha:Yuusha; //勇者
  138.         private var yuushaPos:Point; //勇者のマップ上の座標
  139.         /**-----------------------------------------------------
  140.          * マップを作ります。
  141.          * この実装方法は良くないです。遅いし、何回も同じ画像をロードしてます。
  142.          * 画像が別ドメインにある時に、crossdomain.xmlがなくても大丈夫なようにしています。
  143.          * ----------------------------------------------------- */
  144.         private function createMap():void {
  145.             var i:int;
  146.             var cmd:IllegalLoadBitmapData;
  147.             map = new MovieClip();
  148.             bMapData = [];
  149.             var list:SerialList = new SerialList();
  150.             // update progress bar
  151.             list.onPosition = function():void {
  152.                 _progress.value = list.position / list.numCommands;
  153.             };
  154.             // Load Field Images
  155.             for (i = 0; i < FIELD_IMG_URLS.length; i++) {
  156.                 cmd = new IllegalLoadBitmapData(new URLRequest(FIELD_IMG_URLS[i].url));
  157.                 cmd.context = new LoaderContext(true);
  158.                 cmd.catchError = function(target:Object, error:Error):void {
  159.                     target.executeComplete();
  160.                 };
  161.                 list.addCommand(cmd);
  162.             }
  163.             // Load Yuusha Images
  164.             for (i = 0; i < YUUSHA_IMG_URLS.length; i++) {
  165.                 cmd = new IllegalLoadBitmapData(new URLRequest(YUUSHA_IMG_URLS[i]));
  166.                 cmd.context = new LoaderContext(true);
  167.                 cmd.catchError = function(target:Object, error:Error):void {
  168.                     target.executeComplete();
  169.                 };
  170.                 list.addCommand(cmd);
  171.             }
  172.             // SKY IMAGE
  173.             list.addCommand(new IllegalLoadBitmapData(new URLRequest(SKY_URL), {context: new LoaderContext(true)}));
  174.             // init
  175.             list.addCommand(
  176.                 function():void {
  177.                     for (var i:uint = 0; i < MAPSIZE; i++) {
  178.                         bMapData[i] = [];
  179.                         for (var j:uint = 0; j < MAPSIZE; j++) {
  180.                             var field:Field = FIELD_IMG_URLS[MAP_DATA[j][i]];
  181.                             bMapData[i][j] = field.isObstacle;
  182.                             switch (MAP_DATA[j][i]) {
  183.                                 case 6:
  184.                                 case 7:
  185.                                     field = FIELD_IMG_URLS[0];
  186.                                     break;
  187.                                 case 8:
  188.                                     field = FIELD_IMG_URLS[1];
  189.                                     break;
  190.                             }
  191.                             var res:Resource = getResourceById(field.url);
  192.                             if (res) {
  193.                                 var bmp:Bitmap = new Bitmap(res.toBitmapData());
  194.                                 bmp.x = FLDSIZE * i;
  195.                                 bmp.y = FLDSIZE * j;
  196.                                 bmp.scaleX = bmp.scaleY = SCALE;
  197.                                 map.addChild(bmp);
  198.                             }
  199.                         }
  200.                     }
  201.                     // build bitmap object from images
  202.                     yuusha.build(YUUSHA_IMG_URLS);
  203.                     // 3Dの初期化
  204.                     init3D();
  205.                     //イベントリスナーの登録
  206.                     addEventListener(Event.ENTER_FRAME, loop);
  207.                 }
  208.                 );
  209.             list.execute();
  210.         }
  211.         /**
  212.          * Init Alternativa3D
  213.          *
  214.          */
  215.         private function init3D():void {
  216.             removeChild(_progress); //ロード画面非表示
  217.             stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); //イベントリスナーの登録
  218.             stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); //イベントリスナーの登録
  219.             var res:Resource = getResourceById(SKY_URL);
  220.             addChild(new Bitmap(res.toBitmapData()));
  221.             // Alternativa3Dを初期化
  222.             _world = new BasicTemplate(465465true);
  223.             addChild(_world);
  224.             var bmd:BitmapData = new BitmapData(map.width, map.height);
  225.             bmd.draw(map);
  226.             var tex:Texture = new Texture(bmd);
  227.             var mat:TextureMaterial = new TextureMaterial(tex);
  228.             var fieldPlane:Plane = new Plane(map.width, map.height, 11);
  229.             fieldPlane.cloneMaterialToAllSurfaces(mat);
  230.             _world.scene.root.addChild(fieldPlane);
  231.             fieldPlane.x = +map.width / 2 >> 0;
  232.             fieldPlane.y = +map.height / 2 >> 0;
  233.             var mcMat:MovieClipMaterial = new MovieClipMaterial(yuusha, FLDSIZE / SCALE, FLDSIZE / SCALE);
  234.             _yuusha3D = new Plane(FLDSIZE, FLDSIZE, 11);
  235.             _yuusha3D.cloneMaterialToAllSurfaces(mcMat);
  236.             _yuusha3D.z = -yuusha.height / 2;
  237.             _yuusha3D.rotationX = MathUtils.toRadian(90);
  238.             _world.scene.root.addChild(_yuusha3D);
  239.             _world.camera.z = -40;
  240.             _world.camera.rotationY = MathUtils.toRadian(180);
  241.             _world.camera.rotationX = MathUtils.toRadian(-100);
  242.             _world.camera.rotationZ = MathUtils.toRadian(180);
  243.             var field:Field;
  244.             var mat2:TextureMaterial;
  245.             var tree:Plane;
  246.             // 木とさぼ㌧だけ立体にする
  247.             for (var i:uint = 0; i < MAPSIZE; i++) {
  248.                 for (var j:uint = 0; j < MAPSIZE; j++) {
  249.                     switch (MAP_DATA[i][j]) {
  250.                         case 6:
  251.                         case 7:
  252.                         case 8:
  253.                             field = FIELD_IMG_URLS[MAP_DATA[i][j]];
  254.                             res = getResourceById(field.url);
  255.                             if (res) {
  256.                                 mat2 = new TextureMaterial(new Texture(res.toBitmapData()));
  257.                                 tree = new Plane(FLDSIZE, FLDSIZE, 11true);
  258.                                 tree.cloneMaterialToAllSurfaces(mat2);
  259.                                 _world.scene.root.addChild(tree);
  260.                                 tree.x = FLDSIZE * j + FLDSIZE / 2;
  261.                                 tree.y = FLDSIZE * i + FLDSIZE / 2;
  262.                                 tree.z = -FLDSIZE / 2;
  263.                                 tree.rotationX = MathUtils.toRadian(90);
  264.                             }
  265.                             break;
  266.                     }
  267.                 }
  268.             }
  269.         }
  270.         /**-----------------------------------------------------
  271.          * 毎フレームの処理。
  272.          * ----------------------------------------------------- */
  273.         private function loop(event:Event):void {
  274.             _yuusha3D.x = yuushaPos.x + FLDSIZE / 2;
  275.             _yuusha3D.y = yuushaPos.y + FLDSIZE / 2;
  276.             _world.camera.x = yuushaPos.x + FLDSIZE / 2;
  277.             _world.camera.y = yuushaPos.y + FLDSIZE + 100;
  278.             //20フレーム毎に処理する
  279.             if (frameCount++ > 20) {
  280.                 frameCount = 0;
  281.                 yuusha.walk();
  282.             }
  283.             //マップ(勇者)をどの方向に動かすか判定
  284.             if (yuushaPos.x % FLDSIZE == 0 && yuushaPos.y % FLDSIZE == 0) {
  285.                 var mapPosX:int = int(yuushaPos.x / FLDSIZE), mapPosY:int = int(yuushaPos.y / FLDSIZE);
  286.                 walkDirection = 4//止まる
  287.                 switch (true) {
  288.                     case keyFlags[0]: //下
  289.                         if (yuushaPos.y < (MAPSIZE - 1) * FLDSIZE && !bMapData[mapPosX][mapPosY + 1])
  290.                             walkDirection = 0;
  291.                         yuusha.changeDirection(0);
  292.                         break;
  293.                     case keyFlags[1]: //上
  294.                         if (yuushaPos.y > 0 && !bMapData[mapPosX][mapPosY - 1])
  295.                             walkDirection = 1;
  296.                         yuusha.changeDirection(1);
  297.                         break;
  298.                     case keyFlags[2]: //左
  299.                         if (yuushaPos.x > 0 && !bMapData[mapPosX - 1][mapPosY])
  300.                             walkDirection = 2;
  301.                         yuusha.changeDirection(2);
  302.                         break;
  303.                     case keyFlags[3]: //右
  304.                         if (yuushaPos.x < (MAPSIZE - 1) * FLDSIZE && !bMapData[mapPosX + 1][mapPosY])
  305.                             walkDirection = 3;
  306.                         yuusha.changeDirection(3);
  307.                         break;
  308.                 }
  309.             }
  310.             //次のマスまで自動的に勇者を歩かせる
  311.             switch (walkDirection) {
  312.                 case 0:
  313.                     yuushaPos.y += SPEED;
  314.                     break;
  315.                 case 1:
  316.                     yuushaPos.y -= SPEED;
  317.                     break;
  318.                 case 2:
  319.                     yuushaPos.x -= SPEED;
  320.                     break;
  321.                 case 3:
  322.                     yuushaPos.x += SPEED;
  323.                     break;
  324.             }
  325.             if (walkDirection < 4)
  326.                 moveMap(yuushaPos);
  327.         }
  328.         /**-----------------------------------------------------
  329.          * マップの座標計算。
  330.          * ----------------------------------------------------- */
  331.         private function moveMap(pos:Point):void {
  332.             map.x = (SIZE - FLDSIZE) / 2 - yuushaPos.x;
  333.             map.y = (SIZE - FLDSIZE) / 2 - yuushaPos.y;
  334.         }
  335.         /**-----------------------------------------------------
  336.          * キーボードのキーが押された時の処理。
  337.          * ----------------------------------------------------- */
  338.         private function onKeyDown(event:KeyboardEvent):void {
  339.             switch (event.keyCode) {
  340.                 case Keyboard.DOWN:
  341.                 case "s".charAt(0): //↓ s
  342.                     keyFlags[0] = true;
  343.             }
  344.             switch (event.keyCode) {
  345.                 case Keyboard.UP:
  346.                 case "w".charAt(0): //↑ w
  347.                     keyFlags[1] = true;
  348.             }
  349.             switch (event.keyCode) {
  350.                 case Keyboard.LEFT:
  351.                 case "a".charAt(0): //← a
  352.                     keyFlags[2] = true;
  353.             }
  354.             switch (event.keyCode) {
  355.                 case Keyboard.RIGHT:
  356.                 case "d".charAt(0): //→ d
  357.                     keyFlags[3] = true;
  358.             }
  359.         }
  360.         /**-----------------------------------------------------
  361.          * キーボードのキーが離された時の処理。
  362.          * ----------------------------------------------------- */
  363.         private function onKeyUp(event:KeyboardEvent):void {
  364.             switch (event.keyCode) {
  365.                 case Keyboard.DOWN:
  366.                 case "s".charAt(0): //↓ s
  367.                     keyFlags[0] = false;
  368.             }
  369.             switch (event.keyCode) {
  370.                 case Keyboard.UP:
  371.                 case "w".charAt(0): //↑ w
  372.                     keyFlags[1] = false;
  373.             }
  374.             switch (event.keyCode) {
  375.                 case Keyboard.LEFT:
  376.                 case "a".charAt(0): //← a
  377.                     keyFlags[2] = false;
  378.             }
  379.             switch (event.keyCode) {
  380.                 case Keyboard.RIGHT:
  381.                 case "d".charAt(0): //→ d
  382.                     keyFlags[3] = false;
  383.             }
  384.         }
  385.     }
  386. }
  387. import flash.display.*;
  388. import flash.errors.*;
  389. import flash.events.*;
  390. import flash.net.URLRequest;
  391. import flash.system.LoaderContext;
  392. import alternativa.engine3d.controllers.CameraController;
  393. import alternativa.engine3d.core.Camera3D;
  394. import alternativa.engine3d.core.Object3D;
  395. import alternativa.engine3d.core.Scene3D;
  396. import alternativa.engine3d.display.View;
  397. import jp.progression.commands.lists.SerialList;
  398. import jp.progression.commands.net.LoadCommand;
  399. import jp.progression.data.Resource;
  400. import jp.progression.data.getResourceById;
  401. /**-----------------------------------------------------
  402.  * 勇者クラスです。勇者を作ったり、足踏させたり、向きを変えたりします。
  403.  * ----------------------------------------------------- */
  404. class Yuusha extends MovieClip {
  405.     /**-----------------------------------------------------
  406.      * コンストラクタ。
  407.      * ----------------------------------------------------- */
  408.     public function Yuusha():void {
  409.     }
  410.     public var direction:int = 0//向き (0:前 1:後 2:左 3:右)
  411.     private var walkFlag:Boolean = true//足踏み用
  412.     private var yuushaImages:Array = []; //勇者の画像集
  413.     public function build(ImageURL:Array):void {
  414.         for (var i:uint = 0; i < 8; i++) {
  415.             var res:Resource = getResourceById(ImageURL[i]);
  416.             if (res) {
  417.                 var bmp:Bitmap = new Bitmap(res.toBitmapData());
  418.                 yuushaImages.push(bmp);
  419.                 if (i)
  420.                     yuushaImages[i].visible = false;
  421.                 addChild(yuushaImages[i]);
  422.             }
  423.         }
  424.     }
  425.     /**-----------------------------------------------------
  426.      * 向きを変更します。
  427.      * numは勇者の向きを表します。(0~3)
  428.      * ----------------------------------------------------- */
  429.     public function changeDirection(num:int):void {
  430.         direction = num;
  431.         for (var i:uint = 0; i < 8; i++) {
  432.             yuushaImages[i].visible = i == 2 * direction + int(walkFlag);
  433.         }
  434.     }
  435.     /**-----------------------------------------------------
  436.      * 足踏みさせます。
  437.      * ----------------------------------------------------- */
  438.     public function walk():void {
  439.         walkFlag = !walkFlag;
  440.         for (var i:uint = 0; i < 8; i++) {
  441.             yuushaImages[i].visible = i == 2 * direction + int(walkFlag);
  442.         }
  443.     }
  444. }
  445. /**-----------------------------------------------------
  446.  * Fieldクラスです。画像のURLと、そのフィールドが障害物か否かを保存します。
  447.  * ----------------------------------------------------- */
  448. class Field {
  449.     public function Field(s:String, b:Boolean = false):void {
  450.         url = s;
  451.         isObstacle = b;
  452.     }
  453.     public var isObstacle:Boolean//障害物か否か (true:障害物  false:障害物じゃない(歩ける))
  454.     public var url:String//画像のURL
  455. }
  456. class BasicTemplate extends Sprite {
  457.     /**
  458.      * 新しい BasicTemplate インスタンスを作成します。
  459.      * @param    viewWidth
  460.      * @param    viewHeight
  461.      * @param    scaleToStage
  462.      */
  463.     public function BasicTemplate(viewWidth:int = 640, viewHeight:int = 480, scaleToStage:Boolean = true) {
  464.         _viewWidth = viewWidth;
  465.         _viewHeight = viewHeight;
  466.         _scaleToStage = scaleToStage;
  467.         // Creating scene
  468.         scene = new Scene3D();
  469.         scene.splitAnalysis = false// not analysis for performance
  470.         scene.root = new Object3D();
  471.         // Adding camera
  472.         camera = new Camera3D();
  473.         camera.z = -1000;
  474.         scene.root.addChild(camera);
  475.         // camera contoller
  476.         cameraContoller = new CameraController(this);
  477.         cameraContoller.camera = camera;
  478.         // set view
  479.         view = new View();
  480.         view.camera = camera;
  481.         addChild(view);
  482.         // stage
  483.         if (stage)
  484.             init();
  485.         else
  486.             addEventListener(Event.ADDED_TO_STAGE, init);
  487.     }
  488.     /**
  489.      * カメラインスタンスです。
  490.      */
  491.     public var camera:Camera3D;
  492.     /**
  493.      * カメラコントローラーです。
  494.      */
  495.     public var cameraContoller:CameraController;
  496.     /**
  497.      * シーンインスタンスです。
  498.      */
  499.     public var scene:Scene3D;
  500.     /**
  501.      * ビューインスタンスです。
  502.      */
  503.     public var view:View;
  504.     /**
  505.      * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
  506.      * レンダリング後に実行したい処理を記述します。
  507.      */
  508.     protected var _onPostRender:Function = function():void {};
  509.     /**
  510.      * 初期化されたときに実行されるイベントです。
  511.      * 初期化時に実行したい処理を記述します。
  512.      */
  513.     private var _onInit:Function = function():void {};
  514.     /**
  515.      * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
  516.      * レンダリング前に実行したい処理を記述します。
  517.      */
  518.     private var _onPreRender:Function = function():void {};
  519.     private var _scaleToStage:Boolean;
  520.     private var _viewHeight:int;
  521.     private var _viewWidth:int;
  522.     public function get onInit():Function {
  523.         return _onInit;
  524.     }
  525.     public function set onInit(value:Function):void {
  526.         _onInit = value;
  527.     }
  528.     public function get onPostRender():Function {
  529.         return _onPostRender;
  530.     }
  531.     public function set onPostRender(value:Function):void {
  532.         _onPostRender = value;
  533.     }
  534.     public function get onPreRender():Function {
  535.         return _onPreRender;
  536.     }
  537.     public function set onPreRender(value:Function):void {
  538.         _onPreRender = value;
  539.     }
  540.     /**
  541.      * シングルレンダリング(レンダリングを一回だけ)を実行します。
  542.      */
  543.     public function singleRender():void {
  544.         onRenderTick();
  545.     }
  546.     /**
  547.      * レンダリングを開始します。
  548.      */
  549.     public function startRendering():void {
  550.         addEventListener(Event.ENTER_FRAME, onRenderTick);
  551.     }
  552.     /**
  553.      * レンダリングを停止します。
  554.      */
  555.     public function stopRendering():void {
  556.         removeEventListener(Event.ENTER_FRAME, onRenderTick);
  557.     }
  558.     /**
  559.      * 初期化されたときに実行されるイベントです。
  560.      * 初期化時に実行したい処理をオーバーライドして記述します。
  561.      */
  562.     protected function atInit():void {
  563.     }
  564.     /**
  565.      * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
  566.      * レンダリング後に実行したい処理をオーバーライドして記述します。
  567.      */
  568.     protected function atPostRender():void {
  569.     }
  570.     /**
  571.      * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
  572.      * レンダリング前に実行したい処理をオーバーライドして記述します。
  573.      */
  574.     protected function atPreRender():void {
  575.     }
  576.     /**
  577.      * @private
  578.      */
  579.     private function init(e:Event = null):void {
  580.         // resize
  581.         stage.addEventListener(Event.RESIZE, onResize);
  582.         onResize(null);
  583.         // render
  584.         startRendering();
  585.         atInit();
  586.         _onInit();
  587.     }
  588.     /**
  589.      * @private
  590.      */
  591.     private function onRenderTick(e:Event = null):void {
  592.         atPreRender();
  593.         _onPreRender();
  594.         scene.calculate();
  595.         atPostRender();
  596.         _onPostRender();
  597.     }
  598.     /**
  599.      * @private
  600.      */
  601.     private function onResize(event:Event = null):void {
  602.         if (_scaleToStage) {
  603.             view.width = stage.stageWidth;
  604.             view.height = stage.stageHeight;
  605.         } else {
  606.             view.width = _viewWidth;
  607.             view.height = _viewHeight;
  608.         }
  609.     }
  610. }
  611. /**
  612.  * クロスドメイン問題を無視してロードするLoadBitmapData
  613.  * @see http://wonderfl.net/code/5c164cb968b9883d1eee01b236c5206956e57545
  614.  */
  615. class IllegalLoadBitmapData extends LoadCommand {
  616.     public function IllegalLoadBitmapData(request:URLRequest, initObject:Object = null) {
  617.         // 引数を設定する
  618.         _request = request;
  619.         // 親クラスを初期化する
  620.         super(request, initObject);
  621.     }
  622.     private var _context:LoaderContext;
  623.     private var _request:URLRequest;
  624.     private var loaderA:Loader;
  625.     private var loaderB:Loader;
  626.     public function get context():LoaderContext {
  627.         return _context;
  628.     }
  629.     public function set context(value:LoaderContext):void {
  630.         _context = value;
  631.     }
  632.     override protected function executeFunction():void {
  633.         // Loader を作成する
  634.         loaderA = new Loader();
  635.         // イベントリスナーを登録する
  636.         loaderA.contentLoaderInfo.addEventListener(Event.COMPLETE, _complete1);
  637.         loaderA.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _ioError2);
  638.         loaderA.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, super.dispatchEvent);
  639.         // ファイルを読み込む
  640.         loaderA.load(_request, context);
  641.     }
  642.     /**
  643.      * データが正常にロードされたときに送出されます。
  644.      */
  645.     private function _complete1(e:Event):void {
  646.         loaderB = new Loader();
  647.         loaderB.contentLoaderInfo.addEventListener(Event.INIT, _complete2);
  648.         loaderB.loadBytes(loaderA.contentLoaderInfo.bytes);
  649.     }
  650.     private function _complete2(e:Event):void {
  651.         var loader:Loader = e.currentTarget.loader;
  652.         var bmd:BitmapData = new BitmapData(loader.width, loader.height, true, 0x00000000);
  653.         bmd.draw(loader);
  654.         // データを保持する
  655.         super.data = bmd;
  656.         // 処理を終了する
  657.         super.executeComplete();
  658.     }
  659.     private function _ioError2(e:IOErrorEvent):void {
  660.         super.throwError(thisnew IOError(e.text));
  661.     }
  662. }
noswf
Get Adobe Flash Player