ButtonTest09: トップメニューを追加して、問題を3つの問題セットに区分け
新しくトップメニューを作成。 下記3パターンの問題セットの正答率も表示するようにしました。
クイズを徳川将軍、明治維新のリーダー、明治期の総理大臣の3パターンの問題セットに分けました。
それぞれの問題セットを全て解答後、「次の問題へ」ボタンでトップメニューにもどるようにしました。
テキストフィールドの扱いがけっこう難しい。。。
明治期の総理大臣の問題になるとだんだん問題が手抜に。。。
問題、解答の配列を設定しなおせば異なる問題を設定可能です。
/**
* Copyright siouxcitizen ( http://wonderfl.net/user/siouxcitizen )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/zzVz
*/
// forked from hacker_7daxapax's ButtonTest08
//新しくトップメニューを作成。 下記3パターンの問題セットの正答率も表示するようにしました。
//クイズを徳川将軍、明治維新のリーダー、明治期の総理大臣の3パターンの問題セットに分けました。
//それぞれの問題セットを全て解答後、「次の問題へ」ボタンでトップメニューにもどるようにしました。
//テキストフィールドの扱いがけっこう難しい。。。
//明治期の総理大臣の問題になるとだんだん問題が手抜に。。。
//問題、解答の配列を設定しなおせば異なる問題を設定可能です。
package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
[SWF(width="500", height="500", backgroundColor="#FFFFFF")]
public class ButtonTest extends Sprite {
private var menuBtn01 : SimpleButton;//トップメニューボタン1
private var menuBtn02 : SimpleButton;//トップメニューボタン2
private var menuBtn03 : SimpleButton;//トップメニューボタン3
private var button01 : SimpleButton;//ボタン1
private var button02 : SimpleButton;//ボタン2
private var button03 : SimpleButton;//ボタン3
private var nextBtn : SimpleButton;//「次の問題へ」ボタン
private var question : TextField;//問題文テキスト
private var questionFormat : TextFormat;//問題文テキストフォーマット
private var judge : TextField;//判定文テキスト
private var judgeFormat : TextFormat;//判定文テキストフォーマット
private var target : CustomButton; //マウスイベントでターゲット情報取得用
private var questionNo : int = 0; //問題番号
private var questionArray : Array; //問題保持用配列
private var answerArray : Array; //解答保持用配列
private var answerCnt : int = 0; //解答回数
private var atariCnt : int = 0; //当たり回数
private var hazureCnt : int = 0; //ハズレ回数
private var answered : Boolean = false; //解答チェック 1度も解答せずに次問題に遷移した場合はハズレ回数をカウントアップ
private var atariLock : Boolean = false; //「当たり」ボタン連続押下による当たり回数アップを禁止 「ハズレ」は何回でも可
private var questSet01Clear : Boolean = false; //問題セット1の正答率100%達成チェック
private var questSet02Clear : Boolean = false; //問題セット2の正答率100%達成チェック
private var questSet03Clear : Boolean = false; //問題セット3の正答率100%達成チェック
private var questSet : int = 1; //問題セット番号 デフォルト1
private var topMenuTxt : String; //問題セット番号 デフォルト1
private var txtField:Object=new Object(); //テキストフィールド用
private var txtFormat:Object=new Object();//テキストフォーマット用
public function ButtonTest() {
//トップメニューボタン初期化
topMenuInit();
//情報表示用テキストフィールドを初期化
txtFieldInit();
//問題画面を初期化
questionBtnInit();
dispTopMenuTxt();
}
public function dispTopMenuTxt():void {
addChild(txtField["clearInfo"]); //問題表示テキストフィールドを設定
constTopMenuTxt();
editLabel("clearInfo", topMenuTxt);
}
public function removeTopMenuTxt():void {
editLabel("clearInfo", "");
removeChild(txtField["clearInfo"]); //問題表示テキストフィールドを設定
}
public function constTopMenuTxt():void {
topMenuTxt = "";
topMenuTxt = "問題セット1: ";
if (questSet01Clear == true) {topMenuTxt += "クリア(正答率100%達成)\n";}
else {topMenuTxt += "正答率100%未達成\n";}
topMenuTxt += "問題セット2: ";
if (questSet02Clear == true) {topMenuTxt += "クリア(正答率100%達成)\n";}
else {topMenuTxt += "正答率100%未達成\n";}
topMenuTxt += "問題セット3: ";
if (questSet03Clear == true) {topMenuTxt += "クリア(正答率100%達成)\n";}
else {topMenuTxt += "正答率100%未達成\n";}
}
//トップメニューボタンを初期化する
public function topMenuInit():void {
//解答ボタン設定
menuBtn01 = new CustomButton("問題セット1");
menuBtn01.x = 150;
menuBtn01.y = 50;
menuBtn02 = new CustomButton("問題セット2");
menuBtn02.x = 150;
menuBtn02.y = 80;
menuBtn03 = new CustomButton("問題セット3");
menuBtn03.x = 150;
menuBtn03.y = 110;
menuBtn01.addEventListener(MouseEvent.MOUSE_DOWN,onMenuBtn01Down);
menuBtn02.addEventListener(MouseEvent.MOUSE_DOWN,onMenuBtn02Down);
menuBtn03.addEventListener(MouseEvent.MOUSE_DOWN,onMenuBtn03Down);
addChild(menuBtn01);
addChild(menuBtn02);
addChild(menuBtn03);
}
//トップメニューボタンを非表示にする
public function hideMenuBtn():void {
menuBtn01.visible = false;
menuBtn02.visible = false;
menuBtn03.visible = false;
}
//トップメニューボタンを再表示する
public function dispMenuBtn():void {
menuBtn01.visible = true;
menuBtn02.visible = true;
menuBtn03.visible = true;
}
//テキストフィールドの初期化処理
private function txtFieldInit():void{
//テキストフィールド(ラベル)の生成
txtField["clearInfo"]=Util.makeTxtField(55,150,300,170);//問題文表示用のテキストを設定
txtField["question"]=Util.makeTxtField(10,10,300,170);//問題文表示用のテキストを設定
txtField["judge"]=Util.makeTxtField(55,170,400,200);//解答判定文表示用のテキストを設定
//テキストフォーマットの生成
txtFormat["clearInfo"]=Util.makeTextFormat(15,0x000000);
txtFormat["question"]=Util.makeTextFormat(15,0x000000);
txtFormat["judge"]=Util.makeTextFormat(15,0x000000);
}
//テキストフィールドの編集
private function editLabel(key:String,text:String):void {
txtField[key].text=text;
txtField[key].setTextFormat(txtFormat[key]);
}
//問題画面を初期化を初期化する
public function questionBtnInit():void {
//解答ボタン設定
button01 = new CustomButton("1",1);
button01.x = 350;
button01.y = 50;
button02 = new CustomButton("2",2);
button02.x = 350;
button02.y = 80;
button03 = new CustomButton("3",3);
button03.x = 350;
button03.y = 110;
button01.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
button02.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
button03.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
addChild(button01);
addChild(button02);
addChild(button03);
//「次の問題へ」ボタン設定
nextBtn = new CustomButton("次の問題へ",1);
nextBtn.x = 350;
nextBtn.y = 150;
nextBtn.addEventListener(MouseEvent.MOUSE_DOWN,onNextBtnDown);
addChild(nextBtn);
//問題画面に遷移するまでボタンを非表示
hideQuestionBtn();
}
//問題画面ボタンを非表示
private function hideQuestionBtn():void {
button01.visible = false;
button02.visible = false;
button03.visible = false;
nextBtn.visible = false;
}
//問題画面ボタンを再表示
private function dispQuestionBtn():void {
button01.visible = true;
button02.visible = true;
button03.visible = true;
nextBtn.visible = true;
}
public function onMenuBtn01Down(evt:MouseEvent):void {
questSet = 1;
hideMenuBtn(); //トップメニューボタンを隠す
removeTopMenuTxt();
addChild(txtField["question"]); //問題表示テキストフィールドを設定
addChild(txtField["judge"]); //解答結果表示テキストフィールドを設定
dispQuestionBtn(); //解答選択肢ボタンを表示する
questionArray = new Array(); //問題保持用配列の初期化
answerArray = new Array(); //解答保持用配列の初期化
questionArray.push("徳川幕府初代将軍は?\n1、徳川家康\n2、織田信長\n3、豊臣秀吉\n");
answerArray.push(1);
questionArray.push("徳川幕府2代将軍は?\n1、徳川家康\n2、徳川秀忠\n3、徳川家光\n");
answerArray.push(2);
questionArray.push("徳川幕府3代将軍は?\n1、徳川家康\n2、徳川秀忠\n3、徳川家光\n");
answerArray.push(3);
questionArray.push("徳川幕府4代将軍は?\n1、徳川綱吉\n2、徳川綱家\n3、徳川家綱\n");
answerArray.push(3);
questionArray.push("徳川幕府5代将軍は?\n1、徳川綱吉\n2、生類憐みの令\n3、忠臣蔵\n");
answerArray.push(1);
questionArray.push("徳川幕府6代将軍は?\n1、徳川家宣\n2、正徳の治\n3、新井白石\n");
answerArray.push(1);
questionArray.push("徳川幕府7代将軍は?\n1、間部詮房\n2、絵島生島事件\n3、徳川家継\n");
answerArray.push(3);
questionArray.push("徳川幕府8代将軍は?\n1、暴れん坊将軍\n2、徳川吉宗\n3、マツケンサンバ\n");
answerArray.push(2);
questionArray.push("徳川幕府9代将軍は?\n1、徳川家重\n2、骨格女性説\n3、徳川重家\n");
answerArray.push(1);
questionArray.push("徳川幕府10代将軍は?\n1、徳川治家\n2、田沼意次\n3、徳川家治\n");
answerArray.push(3);
questionArray.push("徳川幕府11代将軍は?\n1、松平定信\n2、徳川家斉\n3、大塩平八郎\n");
answerArray.push(2);
questionArray.push("徳川幕府12代将軍は?\n1、徳川家慶\n2、水野忠邦\n3、黒船ペリー\n");
answerArray.push(1);
questionArray.push("徳川幕府13代将軍は?\n1、徳川家定\n2、堺雅人\n3、篤姫\n");
answerArray.push(1);
questionArray.push("徳川幕府14代将軍は?\n1、勝海舟\n2、松田翔太\n3、徳川家茂\n");
answerArray.push(3);
questionArray.push("徳川幕府15代将軍は?\n1、西郷隆盛\n2、大久保利通\n3、徳川慶喜\n");
answerArray.push(3);
initQuestion();//問題を初期化
}
public function onMenuBtn02Down(evt:MouseEvent):void {
questSet = 2;
hideMenuBtn(); //トップメニューボタンを隠す
removeTopMenuTxt();
addChild(txtField["question"]); //問題表示テキストフィールドを設定
addChild(txtField["judge"]); //解答結果表示テキストフィールドを設定
dispQuestionBtn(); //解答選択肢ボタンを表示する
questionArray = new Array(); //問題保持用配列の初期化
answerArray = new Array(); //解答保持用配列の初期化
questionArray.push("薩摩(鹿児島県)出身で(明治)維新の三傑\nの一人は?\n1、大久保利通\n2、原田泰造\n3、麻生太郎\n");
answerArray.push(1);
questionArray.push("薩摩(鹿児島県)出身で(明治)維新の三傑\nの一人は?\n1、島津斉彬\n2、西郷隆盛\n3、島津久光\n");
answerArray.push(2);
questionArray.push("長州(山口県)出身で(明治)維新の三傑の\n一人は?\n1、長州力\n2、長州小力\n3、木戸孝允\n");
answerArray.push(3);
questionArray.push("土佐(高知県)出身で仲の悪かった薩摩と\n長州の同盟をあっせんしたのは?\n1、坂本龍馬\n2、福山雅治\n3、玉木宏\n");
answerArray.push(1);
questionArray.push("奇兵隊など諸隊を創設し、長州藩を倒幕\nに方向付けたのは?\n1、大村益次郎\n2、高杉晋作\n3、山縣有朋\n");
answerArray.push(2);
questionArray.push("岩倉使節団を率いて欧米視察したのは?\n1、三条実美\n2、片岡鶴太郎\n3、岩倉具視\n");
answerArray.push(3);
initQuestion();//問題を初期化
}
public function onMenuBtn03Down(evt:MouseEvent):void {
questSet = 3;
hideMenuBtn(); //トップメニューボタンを隠す
removeTopMenuTxt();
addChild(txtField["question"]); //問題表示テキストフィールドを設定
addChild(txtField["judge"]); //解答結果表示テキストフィールドを設定
dispQuestionBtn(); //解答選択肢ボタンを表示する
questionArray = new Array(); //問題保持用配列の初期化
answerArray = new Array(); //解答保持用配列の初期化
questionArray.push("初代内閣総理大臣は?\n1、伊藤博文\n2、黒田清隆\n3、山縣有朋\n");
answerArray.push(1);
questionArray.push("第2代内閣総理大臣は?\n1、伊藤博文\n2、黒田清隆\n3、山縣有朋\n");
answerArray.push(2);
questionArray.push("第3代内閣総理大臣は?\n1、伊藤博文\n2、黒田清隆\n3、山縣有朋\n");
answerArray.push(3);
questionArray.push("第4代内閣総理大臣は?\n1、松方正義\n2、西郷隆盛\n3、大久保利通\n");
answerArray.push(1);
questionArray.push("第5代内閣総理大臣は?\n1、伊藤博文\n2、木戸孝允\n3、高杉晋作\n");
answerArray.push(1);
questionArray.push("第6代内閣総理大臣は?\n1、松方正義\n2、大久保利通\n3、西郷隆盛\n");
answerArray.push(1);
questionArray.push("第7代内閣総理大臣は?\n1、伊藤博文\n2、高杉晋作\n3、木戸孝允\n");
answerArray.push(1);
questionArray.push("第8代内閣総理大臣は?\n1、大隈重信\n2、早稲田大学\n3、大蔵省\n");
answerArray.push(1);
questionArray.push("第9代内閣総理大臣は?\n1、山縣有朋\n2、木戸孝允\n3、高杉晋作\n");
answerArray.push(1);
questionArray.push("第10代内閣総理大臣は?\n1、伊藤博文\n2、高杉晋作\n3、木戸孝允\n");
answerArray.push(1);
questionArray.push("第11代内閣総理大臣は?\n1、桂太郎\n2、木戸孝允\n3、高杉晋作\n");
answerArray.push(1);
questionArray.push("第12代内閣総理大臣は?\n1、西園寺公望\n2、岩倉具視\n3、三条実美\n");
answerArray.push(1);
questionArray.push("第13代内閣総理大臣は?\n1、桂太郎\n2、高杉晋作\n3、木戸孝允\n");
answerArray.push(1);
questionArray.push("第14代内閣総理大臣は?\n1、西園寺公望\n2、三条実美\n3、岩倉具視\n");
answerArray.push(1);
initQuestion();//問題を初期化
}
//配列から問題を取り出して問題を初期化
private function initQuestion():void {
//問題文テキスト設定
var questTxt : String = "問題 " + (questionNo+1) + "\n"
+ "\n"
+ questionArray[questionNo];
editLabel("question", questTxt);
atariLock = false;//次問題のために当たり回数カウントアップができるようにする
}
//マウスダウンイベントの処理
private function onMouseDown(evt:MouseEvent):void {
if (questionNo > (questionArray.length-1)) return;//全問終了後は処理を行わない
var judgeTxt : String;
answered = true; //解答(解答ボタンがクリック)された場合はtrueを設定
target = CustomButton(evt.currentTarget);
//当たりボタンは1問につき1回しかカウントされない
if (target.getBtnNo() == answerArray[questionNo]) {
judgeTxt = "当たり";
if (atariLock == false) {//同一問題の「当たり」ボタン連続押下時の当たり回数カウントアップを禁止
answerCnt++;//解答回数をカウントアップ
atariCnt++;//当たり回数をカウントアップ
atariLock = true;
}
//ハズレボタン押下時は何度でもカウントアップされる
} else {
answerCnt++;//解答回数をカウントアップ
judgeTxt = "ハズレ";
hazureCnt++;//ハズレ回数をカウントアップ
}
editLabel("judge", judgeTxt);
}
//「次の問題へ」ボタンのマウスダウンイベントの処理
private function onNextBtnDown(evt:MouseEvent):void {
if (questionNo > (questionArray.length-1)) return;//全問終了後は処理を行わない
if (answered == false) { //前問題が一度も回答されなかった場合は自動で解答回数とハズレ回数をカウントアップ
answerCnt++;
hazureCnt++;
}
answered = false; //次問題のために初期化
if (questionNo < (questionArray.length-1)) {
questionNo++; //次問題へ遷移するためにカウントアップ
editLabel("question", "");
editLabel("judge", "");
initQuestion();
} else {
questionNo++; //終了処理のためにカウントアップ
editLabel("question", "");
endQuestion();
nextBtn.removeEventListener(MouseEvent.MOUSE_DOWN,onNextBtnDown); //「次の問題へ」ボタンのイベントリスナ無効化
nextBtn.addEventListener(MouseEvent.MOUSE_DOWN,onNextBtnDownToTop); //「次の問題へ」ボタンにトップ画面遷移イベントリスナ設定
}
}
//「次の問題へ」ボタンの問題セット終了時マウスダウンイベントの処理(問題画面→トップメニュー画面)
private function onNextBtnDownToTop(evt:MouseEvent):void {
answerCnt = 0; //解答回数の初期化
hazureCnt = 0; //ハズレ回数の初期化
atariCnt = 0; //当たり回数の初期化
questionNo = 0; //問題番号の初期化
nextBtn.removeEventListener(MouseEvent.MOUSE_DOWN,onNextBtnDownToTop); //「次の問題へ」ボタンのトップ画面遷移イベントリスナを無効化
nextBtn.addEventListener(MouseEvent.MOUSE_DOWN,onNextBtnDown); //「次の問題へ」ボタンに基本機能の問題遷移イベントリスナを設定
hideQuestionBtn(); //問題画面ボタンを非表示
dispMenuBtn(); //トップメニュー画面のボタンを表示
editLabel("question", ""); //表示文字列初期化
editLabel("judge", ""); //表示文字列初期化
removeChild(txtField["question"]); //トップメニューのボタンオブジェクトと重ならないようremoveする
removeChild(txtField["judge"]); //トップメニューのボタンオブジェクトと重ならないようremoveする
dispTopMenuTxt();
}
//全問終了後の処理
private function endQuestion():void {
//全問終了後メッセージ設定
//正答率を計算
var rate : int = 0;
if ((answerCnt != 0) && (atariCnt != 0)) {//解答回数と当たり回数がどちらも0でない場合のみ計算
rate = atariCnt/answerCnt*100;
}
//解答結果をテキストフィールドに表示
var result : String = "\n解答結果\n\n"//問題文テキストへ解答結果を設定
+ "解答回数: " + answerCnt + "回\n"
+ "当たり回数: " + atariCnt + "回\n"
+ "ハズレ回数: " + hazureCnt + "回\n"
+ "正答率: " + rate + "%\n";
editLabel("question", result);
//終了情報をテキストフィールドに表示
var lastMess : String = "クイズ終了です\nお疲れ様でした\n";//判定文テキストへ設定
editLabel("judge", lastMess);
//正答率100%時はその問題セットをクリア
if (rate == 100) {
switch (questSet) {
case 1:
questSet01Clear = true;
break;
case 2:
questSet02Clear = true;
break;
case 3:
questSet03Clear = true;
break;
default:
break;
}
}
}
}
}
import flash.display.*;
import flash.system.*;
import flash.text.*;
//カスタムボタン
class CustomButton extends SimpleButton {
private var btnName : String = "";//ボタン名
private var btnNo : int = 0;//ボタン番号
//コンストラクタ
public function CustomButton(label:String="",no:int=0) {
btnName = label;
btnNo = no;
//状態
upState = makeSprite(label,0x00FF00);
overState = upState;
downState = makeSprite(label,0x0000FF);
hitTestState = upState;
}
public function getBtnName():String {
return btnName;
}
public function getBtnNo():int {
return btnNo;
}
//ボタン用スプライト作成
private function makeSprite(text:String,color:uint):Sprite{
//ボタン用ラベル作成
var label : TextField = new TextField();
label.text = text;
label.autoSize = TextFieldAutoSize.CENTER;
label.selectable = false;
//ボタン用スプライト作成
var sp:Sprite = new Sprite();
sp.graphics.beginFill(color);
sp.graphics.drawRoundRect(0, 0, 100, 20, 15);
sp.graphics.endFill();
sp.alpha = 0.8;
sp.addChild(label);
//ラベル用フォーマット設定
var format:TextFormat=new TextFormat();
format.font = "Courier New";
format.bold = true;
format.size = 13;
label.setTextFormat(format);
return sp;
}
}
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.AntiAliasType;
import flash.text.TextFormatAlign;
//ユーティリティ
class Util
{
//テキストフィールドの生成
public static function makeTxtField(posX:int,posY:int,width:int,height:int):TextField {
var label:TextField=new TextField();
label.selectable=false;
label.x =posX;
label.y =posY;
label.width =width;
label.height =height;
label.antiAliasType=AntiAliasType.ADVANCED;
return label;
}
//テキストフォーマットの生成
public static function makeTextFormat(size:uint,color:uint,
align:String=TextFormatAlign.LEFT):TextFormat {
var format:TextFormat=new TextFormat();
format.font ="Courier New"; // 等幅フォント
format.size =size;
format.color=color;
format.bold =true;
format.align=align;
return format;
}
}