ステージエディット(セーブ&ロードの実験中)
状況
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で保存されるだけで、現状では自作のステージを公開することはできません。
コード
エディタ
<?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>
ゲーム本体
行数が多すぎたようで、載せられませんでした。あとで別の形で上げる予定。