/* 回答を選択後、手動で遷移するバージョン */ enchant(); window.focus(); var _DIR_ = SwitchApps.scriptDir(); var SCREEN_W = 800; var SCREEN_H = 600; var BUTTON_AREA_H = 230; var BUTTON_AREA_W = 770; var BUTTON_SIZE = 160; // ボタンのサイズ(縦横同じ) var BUTTON_NUM = 3; // 選択肢(ボタン)の数 var BUTTON_SCALE = SCREEN_W / BUTTON_SIZE / 4; // ボタンの拡大・縮小率 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 scanner = null; var imgs = [CIRCLE_IMG, TRIANGLE_IMG, RECTANGLE_IMG]; var selectedIndex; // アニメーションの状態 resting:静止中, moving:移動中 var animationState = 'resting'; var type; // 選択方式 // スキャンの設定 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 if(scanner.scanType == "mouse" || scanner.scanType == "click") { BUTTON_SCALE = 1; BUTTON_AREA_H = 190; BUTTON_AREA_W = 730; } } // 配列をシャッフル 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 buttonReplace(buttons, imgs) { imgs = shuffle(imgs); for (var i = 0; i < BUTTON_NUM; i++) { buttons[i].image = game.assets[imgs[i]]; } } // スキャン速度変更ボタンの初期化 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 () { /*パラメータの受け取り*/ var params = (new URL(document.location)).searchParams; type = params.get("type"); // ボタンのインスタンスを格納する配列 var buttons = []; //ゲームオブジェクトの生成 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 ); //オートスキャン用オブジェクトの作成 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 / 10); target.image = game.assets[imgs[randRangeInt(0, 2)]]; game.rootScene.addChild(target); var maru = new Sprite(210, 210); maru.x=target.x+250; maru.y=target.y; maru.image=game.assets[CORRECT_EVENT_IMG]; maru.tl.hide(); var correct_se = game.assets[CORRECT_EVENT_SE]; // 選択項群の背景 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); // ボタン(選択肢)の宣言 for (var i = 0; i < BUTTON_NUM; i++) { // ボタン配置 buttons[i] = new Button((i * SCREEN_W / BUTTON_NUM) + ((SCREEN_W / BUTTON_NUM) - (BUTTON_SIZE * BUTTON_SCALE)) / 2, SCREEN_H - (BUTTON_SIZE * BUTTON_SCALE) - SCREEN_H / 15); //ボタンを表示 game.rootScene.addChild(buttons[i]); } // 初期ボタン画像を設定 buttonReplace(buttons, imgs); //オートスキャンの対象を設定 scanner.addScanTargets(buttons); // ボタン(選択肢)に関する処理 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'; console.log(selectedIndex); //正解のとき console.log(buttons[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 * SCREEN_W / BUTTON_NUM) + ((SCREEN_W / BUTTON_NUM) - (BUTTON_SIZE * BUTTON_SCALE)) / 2, SCREEN_H - (BUTTON_SIZE * BUTTON_SCALE) - SCREEN_H / 15, 1); target.tl.moveTo(SCREEN_W / 2 - BUTTON_SIZE * BUTTON_SCALE / 2, SCREEN_H / 10, 1).then(function () { // ボタンの並べ直しとお題の再設定 buttonReplace(buttons, imgs); target.image = game.assets[imgs[randRangeInt(0, 2)]]; }); // 選択肢とお題をフェードイン(表示) 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 / 10, game.fps); buttons[selectedIndex].tl.moveTo((selectedIndex * SCREEN_W / BUTTON_NUM) + ((SCREEN_W / BUTTON_NUM) - (BUTTON_SIZE * BUTTON_SCALE)) / 2, SCREEN_H - (BUTTON_SIZE * BUTTON_SCALE) - SCREEN_H / 15, 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'); game.rootScene.addChild(maru); // 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); }, });