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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     性格判断コンテンツ
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Itchy
Åê¹ÆNo.25274
投稿日時: 2006-5-1 14:11
新米
居住地:
投稿: 14
使用環境:
WinXP,Flash 8
Re: 性格判断コンテンツ
ひろゆきさん、野中さん
色々ご意見ありがとうございます。
また、返信遅くなり申し訳ございません。
野中さん、ひろゆきさんの意見を参考にしつつ何とか、自力で考えた結果、昨日ようやく解決できました。

解決手段としては、今まで、三つのMCに書いていたIF文を
ひとつにし、下記のように書きました。

this.setResult = function() {


var resultA=0;
var resultB=0;


trace("pointA");
trace(_global.pointA);

trace("pointB");
trace(_global.pointB);

//set resultA

if(17<=_global.pointA && _global.pointA<=20){
resultA = 1;

}
if(13<=_global.pointA && _global.pointA<=16){
resultA = 2;

}





このような、if文で、resultA、resultBをそれぞれ4つ定義し、
さらに、if文で

if(resultA ==1 && resultB ==4){
this._parent.mcResult.gotoAndStop("resA");
//_root.mainContents.mcResult.gotoAndStop("resA");
trace("resA!");
}





resultAと resultBの組み合わせで、結果ムービークリップの各ラベルに飛ばすようにしました。

問題のポイント加算はラジオボタンに、
_global.pointB += 4;
と書き、加算させました。

また、メインのタイムラインに定義した、グローバル関数も
はじめ、

_global.pointA="";
のように、統一していたものも、ポイント加算に関するものは
_global.pointA=0;
に直しました。

"";は文字列として扱われてしまうんですね・・・
どうりで加算されないわけです・・・・。

入れ違いで、ご返信いただいたのに、申し訳ございません。今後も参考にさせていただきます。

ありごとうございました。






ひろゆき
Åê¹ÆNo.25239
投稿日時: 2006-4-29 8:48
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 性格判断コンテンツ
なんだか、どんどん複雑にされているような気がしますが...。

サンプル
#FlashPlayer7以降で、RadioButton コンポーネントを利用するとして、
#1画面だけで選択肢を選択、判定を行うもの。

ライブラリ内に、RadioButton を追加。
また、ムービークリップ(リンケージ識別子: set_mc) を作成。
set_mc には、テキストフィールド(インスタンス名: n_txt, q_txt) を配置。
import mx.controls.RadioButton;
//var questionArray:Array = new Array();
var selectArray:Array = new Array();
selectArray = ["強い", "やや強い", "やや弱い", "弱い"];
for (var n:Number = 1; n <= 10; n++) {
	var _mc:MovieClip = this.attachMovie("set_mc", "set"+n, n);
	_mc._x = 40;
	_mc._y = 20+50*(n-1);
	_mc.n_txt.text = n;
	_mc.q_txt.text = "質問"+n;
	for (var t:Number = 1; t <= 4; t++) {
		var _rb:RadioButton = _mc.createClassObject(RadioButton, "rb"+t, t);
		_rb.move(60+100*(t-1), 20);
		_rb.label = selectArray[t-1];
		_rb.data = 5 - t;
		_rb.groupName = "group";
	}
}
check_btn.onRelease = function():Void {
	var pointA:Number = 0;
	var pointB:Number = 0;
	for (var n:Number = 1; n <= 5; n++) {
		var checkNum:Number = _root["set"+n].group.selectedData;
		if (checkNum != undefined) {
			pointA += checkNum;
		} else {
			showPoint(false);
			return;
		}
	}
	for (var n:Number = 6; n <= 10; n++) {
		var checkNum:Number = _root["set"+n].group.selectedData;
		if (checkNum != undefined) {
			pointB += checkNum;
		} else {
			showPoint(false);
			return;
		}
	}
	showPoint(true, pointA, pointB);
};
function showPoint(flag:Boolean, pointA:Number, pointB:Number):Void {
	if (flag) {
		display_txt.text = " A: "+ pointA + "点 + B: " + pointB +"点 でした。";
	} else {
		display_txt.text = " 選択されていない質問があります。";
	}
}

参考まで。


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

Itchy
Åê¹ÆNo.25146
投稿日時: 2006-4-25 18:18
新米
居住地:
投稿: 14
使用環境:
WinXP,Flash 8
Re: 性格判断コンテンツ
お世話さまです。
たしかにABCDの前に改行が入ってました。
また、変数のリストアップもご指摘の通りでした。

>ムービーの構成を縮小して、2択1問で結果を正しく取得して、判定することはおできになりますか?

試してみます。
野中文雄
Åê¹ÆNo.25145
投稿日時: 2006-4-25 18:11
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 性格判断コンテンツ
まず、グローバル変数は、代入演算子=で空文字列""に設定されていますか? だとすれば、[出力]パネルには、正確には6行の改行が入っていませんか?
(空白つまり"")
(同上)
(同上)
(同上)
(同上)
(同上)
A
B
C
D

また、[ムービープレビュー]で[変数のリストアップ]をしたとき、以下のようにグローバル変数の右辺が空ではありませんか?
[デバッグ] > [変数のリストアップ]より引用:
グローバル変数:
変数 _global.ans_A1 =
変数 _global.ans_B1 =
変数 _global.ans_A2 =
変数 _global.ans_B2 =
変数 _global.resultA =
変数 _global.resultB =
変数 _global.m01 =
変数 _global.m02 =
変数 _global.s01 =
変数 _global.s02 =

以上の場合には、すべてのグローバル変数が、初期値の空文字列""から変更されていません。したがって、2択のボタンによる値が設定されていないと推測されます。

さらにムービーの構成を縮小して、2択1問で結果を正しく取得して、判定することはおできになりますか?
引用:
Itchyさんは書きました:
traceに関してですが、ムービープレビューをして、各選択肢を選択して、最後に診断結果ボタンを押したところ、出力パネルにはABCDとだけでました。


----------------
 

Itchy
Åê¹ÆNo.25144
投稿日時: 2006-4-25 17:50
新米
居住地:
投稿: 14
使用環境:
WinXP,Flash 8
Re: 性格判断コンテンツ
traceに関してですが、ムービープレビューをして、各選択肢を選択して、最後に診断結果ボタンを押したところ、出力パネルにはABCDとだけでました。最後の

onClipEvent (load) {
this.getPoint03 = function() {
trace(_global.resultA);
trace(_global.resultB);
trace(_global.m01);
trace(_global.m02);
trace(_global.s01);
trace(_global.s02);
if (_global.resultA == _global.m01 && _global.resultB == _global.s01) {
trace("A");
_root.resMC.gotoAndPlay("A");
}
if (_global.resultA == _global.m01 && _global.resultB == _global.s02) {
trace("B");
_root.resMC.gotoAndPlay("B");
}
if (_global.resultA == _global.m02 && _global.resultB == _global.s01) {
trace("C");
_root.resMC.gotoAndPlay("C");
}
if (_global.resultA == _global.m02 && _global.resultB == _global.s02) {
trace("D");
_root.resMC.gotoAndPlay("D");
}
};
}

に関しては、データの引渡しは可能とのことでしょうか?
野中文雄
Åê¹ÆNo.25143
投稿日時: 2006-4-25 17:34
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 性格判断コンテンツ
trace()ステートメントは、処理の経過状況を確認するためのものですから、動作結果は変わりません。引用されたスクリプト中でも、使っていらっしゃいませんでしたか?
引用:
Itchyさんは書きました:
次に、インスタンス名 result_controller01のMCに
resultAの条件を下記のように
onClipEvent (load) {

    this.getPoint01 = function() {    
        var pointA = 0;
        trace(_global.ans_A1);
        trace(_global.ans_B1);

引用:
Itchyさんは書きました:
実際に前回の通りtraceを追加したのですが、特に変化ありませんでした。その前に、trace()ステートメントの結果を、確認するというのはどういうことでしょうか?すみません、教えてください。(勉強不足です・・・)

参考:「trace関数
ActionScript ? Flash
FLASHのActionScriptを楽しく覚える講座
Flash ActionScript入門ノート「trace()で出力パネルに書き出す


----------------
 

Itchy
Åê¹ÆNo.25142
投稿日時: 2006-4-25 17:17
新米
居住地:
投稿: 14
使用環境:
WinXP,Flash 8
Re: 性格判断コンテンツ
前の回答で挿入したtrace()ステートメントの結果は、確認されましたか?

実際に前回の通りtraceを追加したのですが、特に変化ありませんでした。その前に、trace()ステートメントの結果を、確認するというのはどういうことでしょうか?すみません、教えてください。(勉強不足です・・・)
野中文雄
Åê¹ÆNo.25141
投稿日時: 2006-4-25 16:22
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 性格判断コンテンツ
代入演算子=に変更すれば、初期値の設定として(とくにFlash Player 7以降では)意味があります。ただ、初期値が空白文字列""でよいのかは、後に検討すべき問題として残ります。
引用:
Itchyさんは書きました:
_global.ans_A1 == ""; を _global.ans_A1 = "";にしてもこの場合あまり意味がないということでしょうか?

前の回答で挿入したtrace()ステートメントの結果は、確認されましたか? その結果を見ないと、先に進めません。
引用:
また、「指定のフレームに飛ばない」というのは、result_controller03のMovieClipアクションに定義した関数(function)getPoint03()で

_root.resMC.gotoAndPlay("A");

このように、結果MC(インスタンス名はresMC)内のキーフレームに、結果を配置しているので、ポイントによりラベルA?Dまでのどれかにとばしたかったのですが・・・。

以下にいわれている内容が、よくわかりません。MoiveClipアクションにはまた別の関数(function)が定義してあるようですので、それをどのように呼出しているのかわからないことにはコメントができません。

ただいずれにしても、上述のtrace()結果の確認が先決だと思われます。
引用:
resultA、resultB、その組み合わせの3つをそれぞれちがったムービークリップアクションに書いているため、その連携がうまくいかないのかなと、思ったりしてたのですがいかがでしょうか?


----------------
 

Itchy
Åê¹ÆNo.25140
投稿日時: 2006-4-25 16:08
新米
居住地:
投稿: 14
使用環境:
WinXP,Flash 8
Re: 性格判断コンテンツ
ご返信ありがとうございます。
_global.ans_A1 == ""; を _global.ans_A1 = "";にしてもこの場合あまり意味がないということでしょうか?

また、「指定のフレームに飛ばない」というのは、result_controller03のMovieClipアクションに定義した関数(function)getPoint03()で

_root.resMC.gotoAndPlay("A");

このように、結果MC(インスタンス名はresMC)内のキーフレームに、結果を配置しているので、ポイントによりラベルA?Dまでのどれかにとばしたかったのですが・・・。

resultA、resultB、その組み合わせの3つをそれぞれちがったムービークリップアクションに書いているため、その連携がうまくいかないのかなと、思ったりしてたのですがいかがでしょうか?


野中文雄
Åê¹ÆNo.25138
投稿日時: 2006-4-25 15:39
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 性格判断コンテンツ
気づいた点から、順につぶしていきます。

まず、以下のスクリプトで「グローバル変数」は設定されていません。新規のムービーにこのフレームアクションだけを記述して、[ムービープレビュー]で[デバッグ] > [変数のリストアップ]を行っても、グローバル変数はひとつも表示されないと思います。

等価演算子==は、両辺の比較を行うだけです。値を設定する場合には、代入演算子=を用います。もっとも、この処理は意味がないものの、必ずしも不具合の原因ではないかもしれません。
引用:
Itchyさんは書きました:
制作方法としましては、まず、メインのタイムラインに
_global.ans_A1 == ""; //2択のボタンを押したかどうかの判定
_global.ans_B1 == ""; //2択のボタンを押したかどうかの判定
_global.ans_A2 == ""; //2択のボタンを押したかどうかの判定
_global.ans_B2 == ""; //2択のボタンを押したかどうかの判定
_global.resultA == ""; //1、2問目の結果
_global.resultB == ""; //3、4問目の結果
_global.m01== ""; //1、2問目の結果01
_global.m02== ""; //3、4問目の結果02
_global.s01== ""; //3、4問目の結果01
_global.s02== ""; //3、4問目の結果02

このようなグローバル変数を立てました。

「指定のフレームに飛ばない」というのは、インスタンスresult_controller03のMovieClipアクションに定義した関数(function)getPoint03()の動作が意図どおりでないという意味だと推測します。
引用:
現在の状況としては、結果表示のMCは出るのですが
指定のフレームに飛ばない状況です。

「条件式を3つに分けてる」といわれるのが、どの処理を指すのかわかりかねます。いずれにしても、if条件で判定対象となっている値を確認することから始めるのがよいでしょう。
引用:
やはり、ポイントが加算されてないのではと思うのですが、条件式を3つに分けてる過程で引き継がれていないのでしょうか?

onClipEvent (load) {
	this.getPoint03 = function() {
		trace(_global.resultA);
		trace(_global.resultB);
		trace(_global.m01);
		trace(_global.m02);
		trace(_global.s01);
		trace(_global.s02);
		if (_global.resultA == _global.m01 && _global.resultB == _global.s01) {
			trace("A");
			_root.resMC.gotoAndPlay("A");
		}
		if (_global.resultA == _global.m01 && _global.resultB == _global.s02) {
			trace("B");
			_root.resMC.gotoAndPlay("B");
		}
		if (_global.resultA == _global.m02 && _global.resultB == _global.s01) {
			trace("C");
			_root.resMC.gotoAndPlay("C");
		}
		if (_global.resultA == _global.m02 && _global.resultB == _global.s02) {
			trace("D");
			_root.resMC.gotoAndPlay("D");
		}
	};
}


----------------
 

(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

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