問答収集 カテゴリ:Flashプログラミング
現在のスレッド一覧 / 新規に質問を投稿
レス数:8 / 状態:解決済み / No:122 / ATOM
1 名前:みすぺよ 日付:2013/11/16(土)11:34:07 ID:M3aTGAZSDaTq
現在、私はAS3を使ったADOBE AIRを使用したアンドロイドアプリの制作をしています。
ゲームの内容は、様々な方向から飛んでくる障害物を避けて得点を永遠に稼ぐタイプのゲームです。

そこで、私は ゲームオーバーの後にハイスコアの保存をして 
ゲームを終了させた後も セーブデータがリセットされずに残るプログラムを作りたいと思っています。

しかし、私はAS3はあまり使った事の無い初心者なので
共有オブジェクトについてのページを参考にしましたが、うまくいきません。
http://hakuhin.jp/as3/shared_obj.html

出来れば、最初のフレームにデータ読み込みのアクションで
ゲームオーバー後(読み込むフレームとは別のフレーム)に書き込みをしたいのですが、

1151エラーが出てしまいます。


どうすれば正常に動くでしょうか?
もし出来れば正しいコードの書き方を教えてもらえませんか?
よろしくお願いします。


フレーム1
var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
var obj : Object = so.data;

trace(obj.num);
}

フレーム2
var so:SharedObject = SharedObject.getLocal("my_data");
if (so)
{
var obj:Object = so.data;

obj.num = hiscore;
}
2 日付:2013/11/17(日)11:42:36 ID:uqGvQ4UrzKin
1151 エラーは、同じ名前の変数を 2 回以上定義すると発生します。(同じスコープ内で)
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/compilerErrors.html


どこかにまとめて変数を1度だけ宣言すると回避できます。

// 1フレーム目に記述 -------------------------------------
var so : SharedObject;
var obj : Object;

// フレーム1に記述 --------------------------------------
so = SharedObject.getLocal("my_data");
if(so){
obj = so.data;
trace(obj.num);
}

// フレーム2に記述 --------------------------------------
so = SharedObject.getLocal("my_data");
if (so){
obj = so.data;
obj.num = hiscore;
}



しかし使い捨て変数のために、わざわざ公開プロパティを用意するのは違和感があります。
そこで、匿名の関数を用意して、即時実行します。

関数内で宣言した変数は、ローカル変数として機能するようになり、気軽に使い捨て変数を利用する事ができます。
(ただし、Adobe Flash CS3 の場合、スコープに関係なく 1151 エラーが発生します)

// フレーム1に記述 --------------------------------------
(function() :void{

var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
var obj : Object = so.data;
trace(obj.num);
}

}).call(this);

// フレーム2に記述 --------------------------------------
(function() :void{

var so:SharedObject = SharedObject.getLocal("my_data");
if (so){
var obj:Object = so.data;
obj.num = hiscore;
}

}).call(this);
3 名前:みすぺよ  日付:2013/11/19(火)11:23:56 ID:M3aTGAZSDaTq
obj.num に無事ハイスコアを書き込む&読み込む事ができました。
hiscore = (obj.num); を使う事で変数が反映しました。


しかし、この動作はPCでは普通に動きますが
何故かアンドロイド用のADOBE AIRに出力をした時にまともに動作をしません。
ハイスコアが変動しないのです。

もしかすると、環境によってセーブ機能の作り方が違うのでしょうか? 
4 日付:2013/11/19(火)22:16:27 ID:uqGvQ4UrzKin
SharedObject は Android 環境でも動作するみたいですね。

flush() メソッドを使用すると、手動的にメディアに書き込みを試みる事ができます。
成功失敗などの結果も得られますので是非試してみてください。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/net/SharedObject.html#flush()

Adobe AIR 向けの暗号化付きローカルストレージ機能もあるようです。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/data/EncryptedLocalStore.html
5 名前:みすぺよ  日付:2013/11/23(土)11:23:02 ID:M3aTGAZSDaTq
URLをありがとうございます。
しかし、今の問題がどれと関連しているかが分かりません・・
とりあえず、データを読み込むフレームのアクションスクリプトを載せます。


//--------------------------------------------
var score = 0;
var document_obj:Object = stage.getChildAt(0);
trace(document_obj.score);
var hiscore = 0;
trace(document_obj.hiscore);
//---------------------------------------------
(function() :void{

var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
var obj : Object = so.data;
trace(obj.num);
hiscore = (obj.num);
}so.flush();

}).call(this);

//---------------------------------------------

本来ならば、hiscoreと言う変数を初期化してから
データの読み込みをします。

hiscoreはグローバルな変数なので、他の所でも読み込めるはずです。
しかし、アンドロイド用のAIRだと
何故か読み込みのコードに問題があるのか
何も読み込む事ができません。

(同じ方法でグローバル化した scoreと言う変数は携帯でもグローバル化にできている)

↑のコードをスマホ(アンドロイド)でうまく動かす解決法は無いでしょうか?
よろしくお願いします。

6 日付:2013/11/26(火)22:07:19 ID:uqGvQ4UrzKin
flush() メソッドを使用すると手動的に書き込む事ができます。
利用は必須ではありませんが、戻り値から書き込みに成功したか失敗したかを知る事ができます。

// 初期化 ----------------------------------------
var hiscore:Number = 0;


// 読み込み --------------------------------------
(function() :void{

var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
var obj : Object = so.data;
hiscore = obj.num;
trace("読み込み:" + hiscore);
}

}).call(this);


// 値を変更 --------------------------------------
hiscore = 12345;


// 書き込み --------------------------------------
(function() :void{

var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
var obj : Object = so.data;
obj.num = hiscore;
trace("書き込み:" + hiscore);

var result:String = so.flush();
trace("結果:" + result);
}

}).call(this);
7 名前:みすぺよ  日付:2013/11/27(水)09:47:39 ID:M3aTGAZSDaTq
皆さんありがとうございます。
しかし、アンドロイドでの動作についてはまだ分からない所があるので、
違うスレを作らせてもらいます。

PCでのセーブ機能に関しては解決しました。
8 名前:状態変更 日付:2013/11/27(水)09:47:51 ID:M3aTGAZSDaTq
この質問の状態を『解決』に変更しました。
このスレッドについて
質問の状態 :
解決済み
投稿開始日 :
2013/11/16(土)11:34:07
投稿終了日 :
2013/12/04(水)09:47:58
投稿者 :
みすぺよ
レス総数 :
8
スレッド番号 :
122
MondoCollectionSystem ver.0x00020000 by Hakuhin