/* 回答を選択後、手動で遷移するバージョン */ enchant(); window.focus(); var _DIR_ = SwitchApps.scriptDir(); var SCREEN_W = 800; var SCREEN_H = 600; var BUTTON_AREA_H = 400; var BUTTON_AREA_W = 400; var BUTTON_SIZE = 90; // ボタンのサイズ(縦横同じ) var BUTTON_NUM = 9; // 選択肢(ボタン)の数 var BUTTON_SCALE = 1; // ボタンの拡大・縮小率 var CIRCLE_IMG = _DIR_ + '/image/Circle.png'; var TRIANGLE_IMG = _DIR_ + '/image/Triangle.png'; var RECTANGLE_IMG = _DIR_ + '/image/Rectangle.png'; var CORRECT_EVENT_IMG = _DIR_ + '/image/hanamaru.png'; var CORRECT_EVENT_SE = _DIR_ + '/sounds/correct1.mp3'; //ゲームオブジェクトとなる変数を宣言 var game = null; //スキャン速度設定ボタン群 var config = null; //オートスキャン用オブジェクト var scanner = null; var imgs = [CIRCLE_IMG, TRIANGLE_IMG, RECTANGLE_IMG]; var selectedIndex; // アニメーションの状態 resting:静止中, moving:移動中 var animationState = 'resting'; var type; // 選択方式 var branks_num; // 空白の数 var correct_image; // 正解の図形 var incorrect_image; // 不正解の図形 var correct_pos; // 正解の位置 var sequential; var seq; var seqIndex = 0; // スキャンの設定 function initScanner(scanner) { scanner.scanSE = 1; scanner.selectSE = 1; scanner.firstWait = 0; scanner.scanInterval = 1.0; scanner.selectWait = 1.0; scanner.frameWidth = 10; scanner.selectFrameWidth = 15; scanner.scanRepaet = -1; scanner.focusType = 'frame'; scanner.focusColor = '#ff4B00'; scanner.resumeFromNextTarget = true; //スキャン方式を読み込み if(type != null){ scanner.scanType = type; } //スキャン方式がオートスキャンならばスキャンスピード調節ボタンを表示 if(scanner.scanType == "auto"){ initScanSpeedButton(); } else { //オートスキャン以外ならスピード調節ボタンを表示せず、画面を大きくする BUTTON_AREA_H = 450; BUTTON_AREA_W = 450; BUTTON_SCALE = SCREEN_W / BUTTON_SIZE / 8; } } // 配列をシャッフル function shuffle(array) { for (var i = array.length - 1; i >= 0; i--) { var rand; rand = Math.floor(Math.random() * (i + 1)); [array[i], array[rand]] = [array[rand], array[i]]; // 配列の数値を入れ替える } console.log(array); return array; } // 範囲を指定して乱数を生成(整数) function randRangeInt(min, max) { return Math.floor(Math.random() * (max + 1 - min) + min); } // 範囲を指定して乱数を生成(少数) function randRangeDec(min, max) { return Math.random() * (max + 1 - min) + min; } // 範囲と除外する数を指定して乱数を生成(整数) function randRangeIntExcludingArray(min, max, array){ var a; do { a = Math.floor(Math.random() * (max + 1 - min) + min); } while (array.includes(a)); return a; } /* function placeButtons (buttons, correct_image, incorrect_image, branks_num) { var correct_button_index; var branks=[]; if(correct_pos!=null && correct_pos >= 0 && correct_pos <= 8) { correct_button_index = correct_pos; } else { correct_button_index = randRangeInt(0, buttons.length - 1 - branks_num); } for (var i = 0; i < branks_num; i++) { branks[i] = buttons.length - branks_num + i; } branks.sort(function(a,b){return a-b;}); console.log(branks) for (var i = 0; i < BUTTON_NUM; i++) { if (i == correct_button_index) { buttons[i].image = game.assets[correct_image]; } else if (branks.includes(i)) { buttons[i].image = null; } else { buttons[i].image = game.assets[incorrect_image]; } } return branks; } */ // ボタンの画像を配置 function placeButtons(buttons){ // 選択項の数に合わせて正解の位置を決定 if(branks_num == null) { branks_num = 0; } if(correct_pos == null || correct_pos < 0 || correct_pos > 8) { if (branks_num >= 0 && branks_num <= 2){ correct_pos = randRangeInt(3, 8-branks_num); }else if(branks_num >= 3 && branks_num <= 5){ correct_pos = randRangeInt(1, 8-branks_num); }else if(branks_num == 6){ correct_pos = randRangeInt(1, 2); }else if(branks_num == 7){ correct_pos = randRangeInt(0, 1); } } for (var i = 0; i < BUTTON_NUM - branks_num; i++) { if (i == correct_pos) { buttons[i].image = game.assets[correct_image]; } else { buttons[i].image = game.assets[incorrect_image]; } } } // スキャン速度変更ボタンの初期化 function initScanSpeedButton(){ // スキャンスピード調整ボタン var speedDown = new UIButton(SCREEN_W/10, 0,SCREEN_W / 3, SCREEN_H / 15, "遅くする"); var speedUp = new UIButton(SCREEN_W - SCREEN_W/3 - SCREEN_W/10, 0, SCREEN_W / 3, SCREEN_H / 15, "速くする"); var speedLabel = new Label(scanner.scanInterval + "秒"); speedLabel.font ="20px Palatino" speedLabel.x = SCREEN_W/2-35; speedLabel.y = 10; speedLabel.width=70; speedLabel.textAlign = "center"; speedLabel.tl.hide(); //スピードダウンボタンがクリックされたとき speedDown.ontouchstart = function () { if (scanner.scanInterval < 2) { scanner.scanInterval += 0.25; } speedLabel.text = scanner.scanInterval + "秒"; speedLabel.textAlign = "center"; speedLabel.tl.clear().show().delay(2).fadeOut(game.fps*0.5); } //スピードアップボタンがクリックされたとき speedUp.ontouchstart = function () { if (scanner.scanInterval > 0.25) { scanner.scanInterval -= 0.25; } speedLabel.text = scanner.scanInterval + "秒"; speedLabel.tl.clear().show().delay(2).fadeOut(game.fps*0.5); } config.addChild(speedDown); config.addChild(speedUp); config.addChild(speedLabel); } window.onload = function () { //ゲームオブジェクトの生成 game = new Core(SCREEN_W, SCREEN_H); config = new Group(SCREEN_W, SCREEN_H / 20); //FPSの指定 game.fps = 30; //画像読み込み game.preload( CIRCLE_IMG, TRIANGLE_IMG, RECTANGLE_IMG, CORRECT_EVENT_IMG, CORRECT_EVENT_SE ); /*パラメータの受け取り*/ var params = (new URL(document.location)).searchParams; type = params.get("type"); branks_num = Number(params.get("n")); correct_image = imgs[Number(params.get("correct"))]; incorrect_image = imgs[Number(params.get("incorrect"))]; correct_pos = Number(params.get("correct_pos")); sequential = Boolean(params.get("sequential")); switch (branks_num) { case 0: seq = [8, 7, 5, 4, 2, 1]; console.log(seq); break; case 3: seq = [5, 4, 2, 1]; console.log(seq); break; case 6: seq = [2, 1]; console.log(seq); break; case 7: seq = [2, 1]; console.log(seq); break; default: seq = [8, 7, 5, 4, 2, 1]; } console.log(branks_num); //オートスキャン用オブジェクトの作成 scanner = new SpriteScanner(); initScanner(scanner); //ロード時に呼ばれる処理 game.onload = function () { //背景色の設定 game.rootScene.backgroundColor = "#FFFFFF"; // マッチングの見本 var target = new Button(SCREEN_W / 2 - BUTTON_SIZE * BUTTON_SCALE / 2, SCREEN_H - BUTTON_AREA_H - (BUTTON_AREA_H/3)); game.rootScene.addChild(target); // 選択項群の背景 var backGround = new Sprite(BUTTON_AREA_W, BUTTON_AREA_H); backGround.originX = 0; backGround.originY = 0; backGround.x = (SCREEN_W - BUTTON_AREA_W) / 2; backGround.y = SCREEN_H - BUTTON_AREA_H - 25; var surface = new Surface(BUTTON_AREA_W, BUTTON_AREA_H); backGround.image = surface; game.rootScene.addChild(backGround); surface.context.fillStyle = "rgba(191, 228, 255, 1)"; surface.context.fillRect (0, 0, BUTTON_AREA_W, BUTTON_AREA_H); // 正解時に表示する花丸 var maru = new Sprite(210, 210); maru.x=target.x+200; maru.y=target.y; maru.image=game.assets[CORRECT_EVENT_IMG]; game.rootScene.addChild(maru); maru.tl.hide(); var correct_se = game.assets[CORRECT_EVENT_SE]; var images = imgs.concat(); // パラメータから正解・不正解の画像を決定 if(correct_image == null && incorrect_image == null) { images = shuffle(images); correct_image = images[0]; incorrect_image = images[1]; } // 見本画像を設定 target.image = game.assets[correct_image]; // ボタンのインスタンスを格納する配列 var buttons = []; // ボタン(選択肢)の宣言 var count = 0; for (var i = 0; i < BUTTON_NUM / 3; i++) { // ボタン配置 for(var j = 0; j < BUTTON_NUM / 3; j++){ buttons[count] = new Button((j * BUTTON_AREA_W / 3) + ((BUTTON_AREA_W / 3) - (BUTTON_SIZE * BUTTON_SCALE)) / 2 + (SCREEN_W - BUTTON_AREA_W)/2, (i * BUTTON_AREA_H / 3) + (SCREEN_H - BUTTON_AREA_H)); //ボタンを表示 game.rootScene.addChild(buttons[count]); count++; } } // 初期ボタン画像を設定 //var branks = placeButtons(buttons, correct_image, incorrect_image, branks_num); placeButtons(buttons); //オートスキャンの対象を設定 for (var i = 0; i < BUTTON_NUM; i++) { if(buttons[i].image != null){ scanner.addScanTargets(buttons[i]); } } // ボタン(選択肢)に関する処理 for (var i = 0; i < BUTTON_NUM; i++) { // ボタンが選択されたときのイベント buttons[i].addEventListener("scanselect", function () { // 選択した図形とお題を横に並べるアニメーション animationState = 'moving'; target.tl.moveTo(target.x - BUTTON_SIZE * BUTTON_SCALE / 2, target.y, game.fps); this.tl.moveTo(target.x + BUTTON_SIZE * BUTTON_SCALE / 2, target.y, game.fps) .then(function(){ animationState = 'resting'; if(scanner.scanTargets[selectedIndex].image == target.image){ maru.tl.delay(game.fps * 0.5).show().then(function () { correct_se.play(); }); } }); }); } // 毎フレームの処理 game.addEventListener(Event.ENTER_FRAME, function(){ if (scanner.state == 'select') { selectedIndex = scanner.scanTargetsIndex; } }); // ボタンを押した後、次の問題に遷移する処理 function next() { // 図形が選択され、選択した図形とお題を並べるアニメーションが終了したあと if (scanner.state == 'stop' && animationState == 'resting' ) { animationState = 'moving'; var selectedButtonNum = selectedIndex; //正解のとき if (buttons[selectedIndex].image == target.image) { maru.tl.hide() // 選択肢とお題をフェードアウト(隠す) for (var j = 0; j < BUTTON_NUM; j++) { buttons[j].tl.fadeOut(game.fps * 1); } target.tl.fadeOut(game.fps * 1); // ボタンとお題を元の位置に戻す(アニメーションなし) buttons[selectedIndex].tl.moveTo(((selectedIndex % 3) * BUTTON_AREA_W / 3) + ((BUTTON_AREA_W / 3) - (BUTTON_SIZE * BUTTON_SCALE)) / 2 + (SCREEN_W - BUTTON_AREA_W)/2, (Math.floor(selectedIndex / 3) * BUTTON_AREA_H / 3) + (SCREEN_H - BUTTON_AREA_H), 1); target.tl.moveTo(SCREEN_W / 2 - BUTTON_SIZE * BUTTON_SCALE / 2, SCREEN_H - BUTTON_AREA_H - (BUTTON_AREA_H/3), 1) .then(function () { // ボタンの並べ直しとお題の再設定 if (params.get("correct") == null && params.get("incorrect") == null) { images = shuffle(images); correct_image = images[0]; incorrect_image = images[1]; target.image = game.assets[correct_image]; } console.log(sequential); if (sequential == true) { console.log("seq"); seqIndex++; if (seqIndex >= seq.length) { seqIndex = 0; } correct_pos = seq[seqIndex]; } placeButtons(buttons); for (var i = 0; i < BUTTON_NUM; i++) { scanner.removeScanTarget(buttons[i]); if(buttons[i].image != null){ console.log(i, buttons[i].image, "added") scanner.addScanTargets(buttons[i]); } } }); // 選択肢とお題をフェードイン(表示) for (var j = 0; j < BUTTON_NUM; j++) { buttons[j].tl.fadeIn(game.fps * 1); } target.tl.fadeIn(game.fps * 1).then(function(){ animationState = 'resting'; // スキャン再開 scanner.scanTargetsIndex = -1; scanner.scanStart(1); }); } //不正解のとき else { // ボタンとお題を元の位置に戻す(アニメーションあり) target.tl.moveTo(SCREEN_W / 2 - BUTTON_SIZE * BUTTON_SCALE / 2, SCREEN_H - BUTTON_AREA_H - (BUTTON_AREA_H/3), game.fps); buttons[selectedButtonNum].tl.moveTo(((selectedButtonNum % 3) * BUTTON_AREA_W / 3) + ((BUTTON_AREA_W / 3) - (BUTTON_SIZE * BUTTON_SCALE)) / 2 + (SCREEN_W - BUTTON_AREA_W)/2, (Math.floor(selectedButtonNum / 3) * BUTTON_AREA_H / 3) + (SCREEN_H - BUTTON_AREA_H), game.fps).then(function(){ animationState = 'resting'; // スキャン再開 scanner.scanStart(1); }); } } } // 画面がタッチされたとき game.rootScene.addEventListener(Event.TOUCH_START, function () { next(); }); // 1,3,enter,spaceキーが押された時 game.addEventListener('abuttondown', function(){ next(); }); // スキャナーのタッチ有効領域を画面全体ではなくゲーム背景領域のみにする scanner.touchEnabled = true; $('html').off(('ontouchstart' in document) ? 'touchstart' : 'click'); // scan開始 scanner.scanStart(); //オートスキャンを表示 game.rootScene.addChild(scanner); //スキャンスピード調節ボタンを表示 game.rootScene.addChild(config); }; //ゲームの開始 game.start(); }; // 選択項ボタンのクラス var Button = Class.create(Sprite, { initialize: function (x, y) { Sprite.call(this, BUTTON_SIZE, BUTTON_SIZE); this.x = x; this.y = y; this.originX = 0; this.originY = 0; this.scaleX = BUTTON_SCALE; this.scaleY = BUTTON_SCALE; /* // このボタンが選択されたとき this.addEventListener("scanselect", function () { }); */ }, }); // UIボタンのクラス var UIButton = Class.create(Sprite, { initialize: function (x, y, width, height, text) { Sprite.call(this,width, height); this.x = x; this.y = y; this.originX = 0; this.originY = 0; var backGround = new Sprite(width, height); backGround.x = this.x; backGround.y = this.y; backGround.originX = 0; backGround.originY = 0; var bgImage = new Surface(width,height); bgImage.context.fillStyle = "rgba(250,250,250,1)"; bgImage.context.fillRect(0, 0, width, height); backGround.image = bgImage; var label = new Label(text); label.font ="16px Palatino" label.x = x + width/2 - (text.length/2)*16; label.y = y + height/2 - 8; label.color = "rgba(0,0,0,0.1)"; game.rootScene.addChild(backGround); game.rootScene.addChild(label); }, });