ステージエディット(セーブ&ロードの実験中)

状況

SharedObjectによるデータの受け渡しができることを確認したところまで。実験のために、以下のファイルを一回上げてから、また続きを書く。
→どうも、読み込みに時間がかかる。このページのエディタでSAVEしたデータを、同じくこのページのプレイヤで再現できるかを確認したいんだが。時間をおいて、あとで確認することにする。
→コードだけ追加しとく。
→他のエントリも読み込めてないのと、google page creatorに上げたファイルを直接ダウンロードするのも時間がかかるので、google側の問題?また明日確認することにする。
→13:30頃は無理だったが、15:00に動作することを確認。セーブしたやつをちゃんとロードできるようになった。良かった。しかし、エディタはここに埋め込むには大きすぎるので、後で別のページを用意する予定。
→両方とも別ページで再生するようにした。


→家に帰ってからやってみたが、上手くロードできてない。(セーブはC:\Documents and Settings\Owner\Application Data\Macromedia\Flash Player\#SharedObjects\〜\ohhirasho.googlepages.comにできてたが、ロード時にデータが消えている。)明日、もう少し調べる。
→いけた。いきなり「何もセーブせずにゲーム本体を起動してみる」というのを試してみたのがダメだったっぽい。

swf

それぞれ別のページでswfを再生。
エディタページ」で設定したデータを、「ゲーム本体ページ」で遊ぶことができます(今はまだブロック配置のみ)。
データは、SharedObjectとしてそれぞれのPCで保存されるだけで、現状では自作のステージを公開することはできません。

エディタ
  • 左の欄の四角をドラッグ&ドロップで配置。
  • 左下のSAVEでステージをセーブ
  • 一応、画面右側のやつで、四角の大きさを調整可能。


エディタを開く

ゲーム本体
  • 左右キー
    • 移動
  • 上キー
    • ジャンプ
  • Rキー
    • リセット。上でSAVEしたデータの読み込み。

ゲーム本体を開く


コード

エディタ
<?xml version="1.0" encoding="UTF-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init()">
	<!--Script-->
	<mx:Script>
		<![CDATA[
			import mx.events.DragEvent;
			import mx.events.NumericStepperEvent;
			import mx.core.UIComponent;
			import mx.core.IFlexDisplayObject;
			import mx.core.DragSource;
			import mx.controls.Image;
			import mx.managers.DragManager;

			static public var CURRENT_SELECTED_IMAGE:Image;

			static public const BLOCK_W:Number = 50;
			static public const BLOCK_H:Number = 50;

			private function init():void{
				drop_item_box.addChild(CreateBlock());
				drop_item_box.addChild(CreateAASprite(" / ̄\ \n| ^o^ |\n \_/"));
			}

			protected function CreateBlock():Image{
				var bmp_data : BitmapData = new BitmapData(BLOCK_W, BLOCK_H, true , 0xAA888888);

				var bmp_obj:Bitmap = new Bitmap( bmp_data , PixelSnapping.AUTO , true);

				var image:Image = new Image();
				{
					image.width = bmp_obj.width;
					image.height = bmp_obj.height;
					image.addChild(bmp_obj);
					image.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler_Create);
				}

				return image;
			}

			protected function CreateAASprite(in_Text:String):Image{
				//まずは文字列を普通に表示するものを作成
				var text_field:TextField = new TextField();
				{
					text_field.text = in_Text;

					text_field.border = false;
					text_field.x = 0;
					text_field.y = 0;
					text_field.width = 99;
					text_field.height = 99;
				}

				//その内容をビットマップデータとして取り込む
				var bmp_data : BitmapData = new BitmapData(text_field.textWidth+5, text_field.textHeight+5, true , 0x00000000);
				{
					var matrix : Matrix = new Matrix(1,0,0,1,0,0);
					var color : ColorTransform = new ColorTransform(1,1,1,1,0,0,0,0);
					var rect : Rectangle = new Rectangle(0,0,bmp_data.width,bmp_data.height);
					bmp_data.draw(text_field, matrix, color, BlendMode.NORMAL, rect, true);
				}

				//取り込んだビットマップデータを表示
				var bmp_obj:Bitmap = new Bitmap( bmp_data , PixelSnapping.AUTO , true);
//				{
//					bmp_obj.x = -text_field.textWidth*0.5;
//					bmp_obj.y = -text_field.textHeight*0.5;
//				}

				var image:Image = new Image();
				{
					image.width = bmp_obj.width;
					image.height = bmp_obj.height;
					image.addChild(bmp_obj);
					image.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler_Create);
				}

				return image;
			}

			//ドラッグできるデータを新規作成してドラッグ開始
			private function mouseDownHandler_Create(event:MouseEvent):void{
				var trg:UIComponent = event.currentTarget as UIComponent;

				var image:Image = new Image();
				{
					var bitmapData:BitmapData = new BitmapData(trg.width, trg.height, true , 0x00000000);
					{
						bitmapData.draw(trg);
					}
					var bitmap:Bitmap = new Bitmap();
					{
						bitmap.bitmapData = bitmapData;
					}

					image.width = bitmap.width;
					image.height = bitmap.height;
					image.addChild(bitmap);
					image.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
				}

				//ドラッグ中のイメージを作成
				var imageProxy:UIComponent = new UIComponent();
				{
					imageProxy.addChild(image);
				}

				//ドラッグされるデータを作成
				var dragSource:DragSource = new DragSource();
				{
					dragSource.addData(image, "img");

					//座標も記録
					dragSource.addData(event.localX, "x");
					dragSource.addData(event.localY, "y");
				}

				//ドラッグを開始
				DragManager.doDrag(trg, dragSource, event, imageProxy);
			}

			//対象をドラッグする
			private function mouseDownHandler(event:MouseEvent):void{
				var trg:Image = event.currentTarget as Image;
				//ドラッグされるデータを作成
				var dragSource:DragSource = new DragSource();
				{
					dragSource.addData(trg, "img");
					//座標も記録
					dragSource.addData(event.localX, "x");
					dragSource.addData(event.localY, "y");
				}

				//ドラッグ中のイメージを作成
				var imageProxy:UIComponent = new UIComponent();
				{
					var bitmapData:BitmapData = new BitmapData(trg.width, trg.height, true , 0x00000000);
					{
						bitmapData.draw(trg);
					}
					var bitmap:Bitmap = new Bitmap();
					{
						bitmap.bitmapData = bitmapData;
					}
					imageProxy.addChild(bitmap);
				}

				//ドラッグを開始
				DragManager.doDrag(trg, dragSource, event, imageProxy);

				SetCurrentSelectedImage(trg);
			}

			private function dragEnterHandler(event:DragEvent):void{
				var trg:UIComponent = event.currentTarget as UIComponent;
				DragManager.acceptDragDrop(trg);
			}
			private function dragOverHandler(event:DragEvent):void{
//				var trg:UIComponent = event.currentTarget as UIComponent;
//				trg.setStyle("backgroundColor", "#FFFF99");
			}
			private function dragExitHandler(event:DragEvent):void{
//				var trg:UIComponent = event.currentTarget as UIComponent;
//				trg.setStyle("backgroundColor", "#FFFFFF");
			}
			private function dragDropHandler(event:DragEvent):void{
				var trg:UIComponent = event.currentTarget as UIComponent;

				var image:Image = event.dragSource.dataForFormat("img") as Image;
				var offsetX:Number = event.dragSource.dataForFormat("x") as Number;
				var offsetY:Number = event.dragSource.dataForFormat("y") as Number;

				image.x = event.localX - offsetX;
				image.y = event.localY - offsetY;

				trg.addChild(image);

				SetCurrentSelectedImage(image);
			}
			private function dragCompleteHandler(event:DragEvent):void{
//				var trg:UIComponent = event.currentTarget as UIComponent;
//				trg.setStyle("backgroundColor", "#FFFFFF");
			}

			protected function SetCurrentSelectedImage(image:Image):void{
				CURRENT_SELECTED_IMAGE = image;
				CurrentBlock2Stepper();
			}

			public function changeLX(event:NumericStepperEvent):void{
				Stepper2CurrentBlock();
			}
			public function changeRX(event:NumericStepperEvent):void{
				Stepper2CurrentBlock();
			}
			public function changeUY(event:NumericStepperEvent):void{
				Stepper2CurrentBlock();
			}
			public function changeDY(event:NumericStepperEvent):void{
				Stepper2CurrentBlock();
			}

			protected function Stepper2CurrentBlock():void{
				if(CURRENT_SELECTED_IMAGE == null){
					return;
				}

				var lx:Number = val_lx.value;
				var rx:Number = val_rx.value;
				var uy:Number = val_uy.value;
				var dy:Number = val_dy.value;

				CURRENT_SELECTED_IMAGE.x = lx;
				CURRENT_SELECTED_IMAGE.scaleX = (rx - lx)/BLOCK_W;
				CURRENT_SELECTED_IMAGE.y = uy;
				CURRENT_SELECTED_IMAGE.scaleY = (dy - uy)/BLOCK_H;
			}

			protected function CurrentBlock2Stepper():void{
				if(CURRENT_SELECTED_IMAGE == null){
					return;
				}

				var lx:Number = CURRENT_SELECTED_IMAGE.x;
				var rx:Number = CURRENT_SELECTED_IMAGE.x + CURRENT_SELECTED_IMAGE.width;
				var uy:Number = CURRENT_SELECTED_IMAGE.y;
				var dy:Number = CURRENT_SELECTED_IMAGE.y + CURRENT_SELECTED_IMAGE.height;

				val_lx.value = lx;
				val_rx.value = rx;
				val_uy.value = uy;
				val_dy.value = dy;
			}

			protected function ExportStageData():void{
				var stage_data:Array = new Array();
				{//Create
					var num:int = stage_canvas.numChildren;

					for(var i:int = 0; i < num; i+=1){
						var image:Image = stage_canvas.getChildAt(i) as Image;

						var obj_param:Object = {
							lx:image.x,
							rx:image.x + image.width,
							uy:image.y,
							dy:image.y + image.height,

							density:0.0,//fixed
							friction:0.0,
							category_bits:0x0004,

							name:"Block"
						};

						stage_data.push(obj_param);
					}
				}

				{//Save
					//"/"にセーブして、よそでも呼び出せるようにする
					var so:SharedObject = SharedObject.getLocal("stage_data", "/");

					if(so){
						so.data.stage_data = stage_data;

						try{
							so.flush(500);
						}catch(e:Event){
						}
					}
				}
			}
		]]>
	</mx:Script>


	<!--View-->
	<mx:Panel title="Owata Editor"
		paddingTop="10" paddingLeft="10"
		paddingRight="10" paddingBottom="10">

		<mx:HBox borderStyle="solid">
			<!--Left-->
			<mx:VBox borderStyle="solid">
				<mx:VBox borderStyle="solid" id = "drop_item_box"/>

				<mx:Button label="SAVE" y="280" buttonDown="ExportStageData()"/>
			</mx:VBox>

			<!--Center-->
			<mx:Canvas borderStyle="solid" id="stage_canvas" backgroundColor="#FFFFFF" width="400" height="300"
				dragEnter="dragEnterHandler(event)"
				dragOver="dragOverHandler(event)"
				dragExit="dragExitHandler(event)"
				dragDrop="dragDropHandler(event)"
 			/>

			<!--Right-->
			<mx:HBox borderStyle="solid">
				<!--List-->
				<mx:HBox borderStyle="solid">
					<mx:VBox borderStyle="solid">
						<mx:List id="my_obj_list" width="100"/>
						<mx:HBox borderStyle="solid">
							<mx:Label text="Add"/>
							<mx:Label text="Del"/>
						</mx:HBox>
					</mx:VBox>
				</mx:HBox>

				<!--Param-->
				<mx:VBox borderStyle="solid">
					<!--Top-->
					<mx:HBox borderStyle="solid">
						<mx:VBox borderStyle="solid" horizontalAlign="left">
							<mx:Label id="label_hoge" text="Category"/>
							<mx:ComboBox id="object_category"/>
						</mx:VBox>
						<mx:VBox borderStyle="solid" horizontalAlign="left">
							<mx:Label text="Name"/>
							<mx:TextInput  id="my_obj_name" text="Block 1" color="#000000"/>
						</mx:VBox>
					</mx:HBox>

					<!--Center-->
					<mx:Grid borderStyle="solid">
						<mx:GridRow borderStyle="none" id="row1">
							<mx:GridItem borderStyle="none" >
								<!--empty-->
							</mx:GridItem>
							<mx:GridItem borderStyle="none" horizontalAlign="right">
								<mx:Label text="UY:" textAlign="right"/>
							</mx:GridItem>
							<mx:GridItem borderStyle="none" >
								<mx:NumericStepper id="val_uy" change="changeUY(event);" value="0" minimum="-9999" maximum="9999"/>
							</mx:GridItem>
							<mx:GridItem borderStyle="none" >
								<!--empty-->
							</mx:GridItem>
						</mx:GridRow>
						<mx:GridRow borderStyle="none" id="row2">
							<mx:GridItem borderStyle="none" horizontalAlign="right">
								<mx:Label text="LX:" textAlign="right"/>
							</mx:GridItem>
							<mx:GridItem borderStyle="none" >
								<mx:NumericStepper id="val_lx" change="changeLX(event);" value="0" minimum="-9999" maximum="9999"/>
							</mx:GridItem>
							<mx:GridItem borderStyle="none" horizontalAlign="right">
								<mx:Label text="RX:" textAlign="right"/>
							</mx:GridItem>
							<mx:GridItem borderStyle="none" >
								<mx:NumericStepper id="val_rx" change="changeRX(event);" value="0" minimum="-9999" maximum="9999"/>
							</mx:GridItem>
						</mx:GridRow>
						<mx:GridRow borderStyle="none" id="row3">
							<mx:GridItem borderStyle="none" >
								<!--empty-->
							</mx:GridItem>
							<mx:GridItem borderStyle="none" horizontalAlign="right">
								<mx:Label text="DY:" textAlign="right"/>
							</mx:GridItem>
							<mx:GridItem borderStyle="none" >
								<mx:NumericStepper id="val_dy" change="changeDY(event);" value="0" minimum="-9999" maximum="9999"/>
							</mx:GridItem>
							<mx:GridItem borderStyle="none" >
								<!--empty-->
							</mx:GridItem>
						</mx:GridRow>
					</mx:Grid>

					<!--Bottom-->
				</mx:VBox>
			</mx:HBox>
		</mx:HBox>
	</mx:Panel>
</mx:Application>
ゲーム本体

行数が多すぎたようで、載せられませんでした。あとで別の形で上げる予定。