トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     functionのreturnについて
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
susumu
Åê¹ÆNo.45367
投稿日時: 2010-7-27 19:57
新米
居住地: シンガポール
投稿: 6
使用環境:
MacOSX10.5.8, Flash CS3
functionのreturnについて
いま、Flash+PHP+MySQLを使用してスコアの制作をしています。

流れと致しましては、
ゲーム開始→ゲームの終了→名前を記入後、サブミットボタンを押すとスコアボードに切り替わり、スコアが表示されます。

その際、先にASからPHPへ名前とスコアのデータを送り一旦MySQLに挿入後、データをソートして引き出し再びASへ送りスコアボードへ表示という流れにしようと考えています。

ASからPHPへ値を渡し一旦MySQLへ格納後、再びスコアの高い順からデータを引き出しASまで引き出す事は出来ましたが、sendAndLoadを使用し送受信を行っているため受信用の関数から外へ値を渡す事が出来ません。returnを使用しましたが駄目でした。

以下ソースです。

var phpPath = "http://www.hogehoge.com/";
// 送信用LoadVarsインスタンス
var send_lv:LoadVars = new LoadVars();
// 受信用LoadVarsインスタンス
var recv_lv:LoadVars = new LoadVars();

//受信後の変数処理関数
recv_lv.onLoad = function(success)
{
if(success){
//受け取った変数の処理
recv_lv.uname0 = this.uname0;
recv_lv.score0 = this.score0;
recv_lv.uname1 = this.uname1;
recv_lv.score1 = this.score1;
recv_lv.uname2 = this.uname2;
recv_lv.score2 = this.score2;
recv_lv.uname3 = this.uname3;
recv_lv.score3 = this.score3;
recv_lv.uname4 = this.uname4;
recv_lv.score4 = this.score4;
recv_lv.uname5 = this.uname5;
recv_lv.score5 = this.score5;
recv_lv.uname6 = this.uname6;
recv_lv.score6 = this.score6;
recv_lv.uname7 = this.uname7;
recv_lv.score7 = this.score7;
recv_lv.uname8 = this.uname8;
recv_lv.score8 = this.score8;
recv_lv.uname9 = this.uname9;
recv_lv.score9 = this.score9;

trace(recv_lv.uname0); //usagi
trace(recv_lv.score0); //9999

return recv_lv;

}else{
errorMsg.text = 'Can not recieve the values from PHP.';
}
}

//送信用変数へ代入
send_lv.user = user_name.slice(0,-1);
send_lv.score = user_score;

//送受信
send_lv.sendAndLoad(phpPath + "getdata.php", recv_lv, "POST");

trace(recv_lv.uname0); //undefined
trace(recv_lv.score0); //undefined

以上、宜しくお願い致します。
奥村 典史
Åê¹ÆNo.45368
投稿日時: 2010-7-27 20:33
常連
居住地: 大阪府(以前:東京都府中市 / 土日は大抵京都)
投稿: 69
使用環境:
FlashCS5.5,
WinXP,Win7(64bit),

単体テスト用に
FlexSDK3.4,
As3Unit

エディター
FlashBuilder5

スクリプト
ActionScript3.0
Re: functionのreturnについて
やりたいことは
http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=9487&forum=6&post_id=45193#forumpost45193

と同じと解釈しました。


違う場合は何が違うか教えていただけると
答えられると思います。
永井勝則
Åê¹ÆNo.45369
投稿日時: 2010-7-28 0:26
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: functionのreturnについて
久しぶりにDelegateの登場かと思い、AS2.0リファレンスを引き引き、コードを書いてみましたが、違うようです。
たぶん、

trace(recv_lv.uname0); //undefined
trace(recv_lv.score0); //undefined

の行は、PHPからの結果が返ってくる前に実行されているので、
undefinedになっているのだと思います。
したがって、recv_lv.onLoadの呼出し後であれば、PHPからのデータは使えるようになると思います。

テストに使ったファイル
php
<?php
$fromflash = $_POST['username'];
$returndata = "name=".$fromflash."さん";
$returndata .= "&msg=アタックチャンス!!";
print $returndata;
?>


AS2.0
var phpPath:String = "http://localhost/phptest/getdata.php";
var send_lv:LoadVars = new LoadVars();
var recv_lv:LoadVars = new LoadVars();

recv_lv.onLoad = function(success:Boolean) {
	if (success) {
		trace("ここから使える");
		trace(this.name);
		trace(this.msg);
		recv_lv.name0 = this.name;
		recv_lv.msg0 = this.msg;
	} else {
		trace("エラー");
	}
};

send_btn.onRelease = function() {
	send_lv.username = name_txt.text;
	send_lv.sendAndLoad(phpPath,recv_lv,"POST");
};

check_btn.onRelease = function() {
	trace(recv_lv.name0);
	trace(recv_lv.msg0);
};


AS2.0には、戻ってきたデータが、LoadVars.onLoad上でなく、メインのタイムラインの関数で扱えるようになるDelegateというクラスがあります。
今回は関係ないと思いますが、前は便利に使っていたような記憶があります。
import mx.utils.Delegate;

var phpPath:String = "http://localhost/phptest/getdata.php";
var send_lv:LoadVars = new LoadVars();
var recv_lv:LoadVars = new LoadVars();

recv_lv.onLoad = Delegate.create(this, this.onLoadPHP);

function onLoadPHP(success:Boolean) {
	if (success) {
		trace("ここから使える");
		trace(recv_lv.name);
		trace(recv_lv.msg);
		recv_lv.name0 = recv_lv.name;
		recv_lv.msg0 = recv_lv.msg;
	} else {
		trace("エラー");
	}
};

send_btn.onRelease = function() {
	send_lv.username = name_txt.text;
	send_lv.sendAndLoad(phpPath,recv_lv,"POST");
};

check_btn.onRelease = function() {
	trace(recv_lv.name0);
	trace(recv_lv.msg0);
};



ちなみに、フレーム1にstop();を書き、
recv_lv.onLoadか、onLoadPHP内で、データの取得を確認した後、
gotoAndStop()で、メインのタイムラインのフレームを先に送れば、
その送った先のフレームでrecv_lv.name0などのデータは使えます。


----------------
永井勝則:
himco.jp :

susumu
Åê¹ÆNo.45371
投稿日時: 2010-7-28 14:16
新米
居住地: シンガポール
投稿: 6
使用環境:
MacOSX10.5.8, Flash CS3
Re: functionのreturnについて
永井 勝則 様

ご丁寧な解説ありがとうございます。
私なりにまねをしてみましたが、やはり駄目でした。
私自身、フラッシュやASを扱うのはこれが初めてでタイムラインやそれぞれの関数の働きなども把握しきれていません。(普段はグラフィックをやっています。今回、AS以外のウェブ系プログラムが出来るので振られてしまいました。。)

以下はサブミットボタンを離した時におこるアクションです。
またスコアボードにPHPから送られてきたデータをあてがうのですがこれ自体が関数で囲まれているのでこの関数の外で使用するには先のDelegateという物を使用するのでしょうか?そうなるとますます訳が分からなくなってきます。(T-T)/

<現状>
ゲームから渡ってきた名前とスコアを一度データベースへ挿入後、再度スコアの高い順にソートし引き出しまでは出来ています。recv_lv.onLoad内ではその値を確認出来ますが、それをecv_lv.onLoad関数外でも使用出来る様にしたい。

<追記>
ソースをいくらいじっても同じ結果になってしまいます。
どうしても、undefinedになってしまいます。
値の取り方が悪いのでしょうか?
recv_lv.onLoadの呼出し後にtraceを行ってもやはりundefinedになってしまいます。

// 送信用LoadVarsインスタンス
var send_lv:LoadVars = new LoadVars();
// 受信用LoadVarsインスタンス
var recv_lv:LoadVars = new LoadVars();

//Submit Action Here
btn_submitScore.onRelease = function ()
{
var phpPath = "http://www.hogehoge.com/";
var user_name = ScreenName.text; //username
var user_score = _root.iUserScore; //the score

if(_root.hasSubmitted == false)
{
if(user_name.length >= 2 && user_score > 0)
{

sendToPHP(user_name,user_score,phpPath);

trace(recv_lv.uname0); //undefind
trace(recv_lv.score0); //undefind

GSScoreSubmit.unauthSubmitScore(user_score, user_score, "", user_name);
_root.hasSubmitted = true;
btn_submitScore.enabled = false;
btn_submitScore._alpha = 50;
startSound("SoundFX", "Snd_SubmitScore", 100, 1);
//score board
_root.mcScoresPanel.gotoAndPlay("show");
/*END*/
}else{
errorMsg.text = 'Name is empty.';
}

}else{
errorMsg.text = 'Score not valid for submission';
}
};

//送信関数
function sendToPHP(user_name,user_score,phpPath)
{
//送信用変数へ代入
send_lv.user = user_name.slice(0,-1);
send_lv.score = user_score;
//送受信
send_lv.sendAndLoad(phpPath,recv_lv,"POST");
};

//受信後の変数処理関数
recv_lv.onLoad = function()
{
//受け取った変数の処理
recv_lv.uname0 = recv_lv.uname0;
recv_lv.score0 = recv_lv.score0;
recv_lv.uname1 = recv_lv.uname1;
recv_lv.score1 = recv_lv.score1;
recv_lv.uname2 = recv_lv.uname2;
recv_lv.score2 = recv_lv.score2;
recv_lv.uname3 = recv_lv.uname3;
recv_lv.score3 = recv_lv.score3;
recv_lv.uname4 = recv_lv.uname4;
recv_lv.score4 = recv_lv.score4;
recv_lv.uname5 = recv_lv.uname5;
recv_lv.score5 = recv_lv.score5;
recv_lv.uname6 = recv_lv.uname6;
recv_lv.score6 = recv_lv.score6;
recv_lv.uname7 = recv_lv.uname7;
recv_lv.score7 = recv_lv.score7;
recv_lv.uname8 = recv_lv.uname8;
recv_lv.score8 = recv_lv.score8;
recv_lv.uname9 = recv_lv.uname9;
recv_lv.score9 = recv_lv.score9;

trace(recv_lv.uname0); //kame
trace(recv_lv.score0); //4561
};

check_btn.onRelease = function()
{
trace(recv_lv.uname0); // ?
trace(recv_lv.score0); // ?
};
susumu
Åê¹ÆNo.45372
投稿日時: 2010-7-28 14:21
新米
居住地: シンガポール
投稿: 6
使用環境:
MacOSX10.5.8, Flash CS3
Re: functionのreturnについて
piggest 様
ご回答ありがとうございます。
「何が違う」かというのも把握出来ません。恐らく初歩的な事なのでしょうが、私自身今回初めてASを扱ったものでして。。
違うと言えば、ご覧頂いたコードはサブミット用関数の中にあり、さらに現在取り出そうとしているPHPの値をその関数外で使用するという事かもしれません。
何かご教授頂けると助かります。(T_T)/

ひろゆき
Åê¹ÆNo.45392
投稿日時: 2010-7-29 12:27
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: functionのreturnについて
var send_lv:LoadVars = new LoadVars();
var recv_lv:LoadVars = new LoadVars();

function sendAndLoad(user_name, user_score, phpPath):Void {
	send_lv.user = user_name.slice(0, -1);
	send_lv.score = user_score;
	send_lv.sendAndLoad(phpPath, ecv_lv, "POST");
};

recv_lv.onLoad = function(success:Boolean):Void {
	if (success) {
		var uname0:String = this.uname0;
		var score0:Number = this.score0;
		var uname1:String = this.uname1;
		var score1:Number = this.score1;
		var uname2:String = this.uname2;
		var score2:Number = this.score2;
		var uname3:String = this.uname3;
		var score3:Number = this.score3;
		var uname4:String = this.uname4;
		var score4:Number = this.score4;
		var uname5:String = this.uname5;
		var score5:Number = this.score5;
		var uname6:String = this.uname6;
		var score6:Number = this.score6;
		var uname7:String = this.uname7;
		var score7:Number = this.score7;
		var uname8:String = this.uname8;
		var score8:Number = this.score8;
		var uname9:String = this.uname9;
		var score9:Number = this.score9;
		//データ受信時の処理
		trace(this.uname0);
		trace(this.score0);
		GSScoreSubmit.unauthSubmitScore(user_score, user_score, "", user_name);
		//_root.hasSubmitted = true;
		//btn_submitScore.enabled = false;
		//btn_submitScore._alpha = 50;
		//startSound("SoundFX", "Snd_SubmitScore", 100, 1);
		//_root.mcScoresPanel.gotoAndPlay("show");
	}
};

btn_submitScore.onRelease = function ():Void {
	var phpPath = "http://lab.sakaisusumu.net/getdata.php";
	var user_name = ScreenName.text;
	var user_score = _root.iUserScore;
	if (_root.hasSubmitted == false) {
		if (user_name.length >= 2 && user_score > 0) {
			sendAndLoad(user_name, user_score, phpPath);
			//データ送信時の処理
			//GSScoreSubmit.unauthSubmitScore(user_score, user_score, "", user_name);
			_root.hasSubmitted = true;
			btn_submitScore.enabled = false;
			btn_submitScore._alpha = 50;
			startSound("SoundFX", "Snd_SubmitScore", 100, 1);
			_root.mcScoresPanel.gotoAndPlay("show");
		} else {
			errorMsg.text = 'Name is empty.';
		}
	} else {
		errorMsg.text = 'Score not valid for submission';
	}
};

データ送信時の処理とデータ受信時の処理ともに、
赤字の部分のスクリプトを記述していますが、

赤字の部分で何をやっているのか不明なので、
あとはご自分で。

というか、GSScoreSubmitが突然出てきますが、
これは回答者に説明がなければ、何をするものか確認できません。


----------------
質問する際は、回答者に具体的な情報を与えてください。

susumu
Åê¹ÆNo.45394
投稿日時: 2010-7-29 13:28
新米
居住地: シンガポール
投稿: 6
使用環境:
MacOSX10.5.8, Flash CS3
Re: functionのreturnについて
mayor 様
ご回答ありがとうございます。
失礼いたしました。。。

赤字の部分はボタンを押したときの処理です。
AS用レイヤーの第1フレーム?でいいのでしょうか?そこに記述されています。
上から、


GSScoreSubmit.unauthSubmitScore(user_score, user_score, "", user_name); //スコアを渡す。
_root.hasSubmitted = true; //?
btn_submitScore.enabled = false; //?
btn_submitScore._alpha = 50; //ボタンの透明度
startSound("SoundFX", "Snd_SubmitScore", 100, 1); //音楽の処理
_root.mcScoresPanel.gotoAndPlay("show"); //スコアボードへ飛ぶ


と解釈しています。
というのもこのフラッシュの制作者はASの知識は皆無なので、ソースを見る限りどこからか拾ってきたフラッシュを見た目だけ変えただけのようです。
因に赤字の部分はスコアを渡す関数の引数名を変えただけで、他はさわっていません。

以下、ボタン処理の関数です。


function load(url)
{
    var _loc3 = createEmptyMovieClip("loader_mc", getNextHighestDepth());
    var _loc2 = new MovieClipLoader();
    _loc2.addListener(this);
    _loc2.loadClip(url, _loc3);
} // End of the function
function onLoadInit(mc)
{
    _root.gs_loaded = true;
    gs_gameServices = new GameServices(gameServicesCallback);
    gs_scoreSubmit = new GSScoreSubmit(gameServicesCallback);
    gs_sendToFriend = new GSSendToFriend(stfCallback);
    GameServices.initGameTracking(null, false);
    gotoAndPlay(g_startFrame);
} // End of the function
function stfCallback(action)
{
    if (action == "nodata")
    {
    }
    else if (action == "load")
    {
        _root.mcSendPanel.myResponse = "MESSAGE FROM SERVER:\n" + action;
        _root.mcSendPanel.gotoAndPlay("Result");
    }
    else
    {
        _root.mcSendPanel.myResponse = "MESSAGE SENT!";
        _root.mcSendPanel.gotoAndPlay("Result");
    } // end else if
} // End of the function
function gameServicesCallback(gsResponseInfo, whichCommand)
{
    if (gsResponseInfo.isError())
    {
        startupVars.text = gsResponseInfo.message + "; " + gsResponseInfo.extended_info;
    }
    else
    {
        var _loc7 = gsResponseInfo.success;
        if (_loc7)
        {
            switch (whichCommand)
            {
                case "SetUserScoreGetScores":
                case "SetUserScoreGetScoresUnauth":
                case "GetScoreRanks":
                case "GetScoreRanksUnauth":
                {
                    var _loc2 = gsResponseInfo.results;
                    leaderBoardText = "";
                    if (_loc2.length > 0)
                    {
                        namesTxt = "";
                        scoresTxt = "";

                        for (i = 0; i < _loc2.length; i++)
                        {
                            leaderBoardText = leaderBoardText + (i + 1) + ". " + _loc2[i].user_name + "\t\t" + _loc2[i].score + "\n";
                            namesTxt = namesTxt + (_loc2[i].user_name.toUpperCase() + "\n");
                            scoresTxt = scoresTxt + (_loc2[i].score + "\n");
                        } // end of for
                    }
                    else
                    {
                        leaderBoardText = "There are no entries";
                    } // end else if
                    _root.mcScoresPanel.showData1.text = namesTxt;
                    _root.mcScoresPanel.showData2.text = scoresTxt;
                    break;
                } 
                case "GetUserScoreRanks":
                case "GetUserRatingRanks":
                case "GetRatingRanks":
                {
                    _loc2 = gsResponseInfo.results;
                    leaderBoardText = "";
                    if (_loc2.length > 0)
                    {
                        for (i = 0; i < _loc2.length; i++)
                        {
                            leaderBoardText = leaderBoardText + (i + 1) + ". " + _loc2[i].user_name + "\t\t" + _loc2[i].score + "\n";
                        } // end of for
                    }
                    else
                    {
                        leaderBoardText = "There are no entries";
                    } // end else if
                    showData.text = leaderBoardText;
                    break;
                } 
                case "SetUserScoreGetRank":
                case "SetUserScoreGetRankUnauth":
                case "GetSiteUserRank":
                {
                    var _loc6 = gsResponseInfo.outparams.user_rank;
                    showData.text = "Your rank is " + _loc6;
                    break;
                } 
                case "GetRegistrationStatus":
                case "UserLogin":
                {
                    var _loc4 = gsResponseInfo.results[0];
                    showData.text = "User " + _loc4.user_name + " (id=" + _loc4.user_id + ") created on " + _loc4.date_created + "\nLogged in " + _loc4.login_count + " times, last login on " + _loc4.last_login;
                    GameServices.loadAvatar(1, _root, "myAvatar", _root.getNextHighestDepth());
                    break;
                } 
                case "GetUserGameGroupExperiencePoints":
                case "GetUserGameExperiencePoints":
                case "GetUserSiteExperiencePoints":
                {
                    var _loc8 = gsResponseInfo.results[0].experience_points;
                    showData.text = "You currently have " + _loc8 + " experience points.";
                    break;
                } 
            } // End of switch
            if (whichCommand.indexOf("SetUserScore") != -1)
            {
                resultCode = gsResponseInfo.message;
                if (resultCode == "UNCHANGED")
                {
                    startupVars.text = "You already have a better score.";
                }
                else
                {
                    startupVars.text = "Score submitted!";
                } // end if
            } // end else if
        }
        else
        {
            showData.text = "Command " + whichCommand + " failed: " + gsResponseInfo.message;
        } // end else if
    } // end else if


また、ひとまずmayor様のソースをコピペして試して見ましたが結果は同じでした。
recv_lv.onLoad内では値を見る事が出来ますがrecv_lv.onLoad外ではundefindになります。
ひろゆき
Åê¹ÆNo.45396
投稿日時: 2010-7-29 14:53
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: functionのreturnについて
引用:
susumuさんは書きました:

また、ひとまずmayor様のソースをコピペして試して見ましたが結果は同じでした。
recv_lv.onLoad内では値を見る事が出来ますがrecv_lv.onLoad外ではundefindになります。

スクリプトがよくお分かりにならないということであれば、
recv_lv.onLoad外で参照することはできないと考えた方がよいでしょう。

値を参照したければ、「データ受信時の処理」の箇所で、処理を行うようにしてください。

それでも、分からないということであれば、
外注もお考えになった方がよろしいのでは?

[追記]
前述のスクリプトに間違いがあったので、修正。(青字部分)
赤字部分も少し修正。
(ただし、どの処理をどのタイミングで行うのかが不明確なので、要調整)


----------------
質問する際は、回答者に具体的な情報を与えてください。

susumu
Åê¹ÆNo.45415
投稿日時: 2010-8-2 12:09
新米
居住地: シンガポール
投稿: 6
使用環境:
MacOSX10.5.8, Flash CS3
Re: functionのreturnについて
ひろゆき様、ならびに手解きを頂きました皆様へ

ご教授有り難うございました。何とかゲームの方完成致しました。
私ももっとフラッシュを勉強したいと思います。
以上、簡単にではありますがお礼申し上げます。
有り難うございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops