/* * おまじない */ enchant(); var _DIR_ = SwitchApps.scriptDir(); /* * 定数 */ // パラメータ var SCREEN_W = screen.width; // 幅 var SCREEN_H = screen.width; // 幅 var SCREEN_WIDTH = screen.width; // 幅 var SCREEN_HEIGHT = screen.height; // 高さ var SCALE = Math.min(screen.width / 1068, screen.height / 820); // 各画像・要素の拡大率 var ROAD_SIZE = 124 * SCALE; // 道の大きさ // 画像 var IMAGE = _DIR_ + "/images/Graphic.png"; var DOWNBUTTON = _DIR_ + "/images/DownButton.png"; var RIGHTBUTTON = _DIR_ + "/images/RightButton.png"; var TREASURE = _DIR_ + "/images/Treasure.png"; var IIYO = _DIR_ + "/sounds/iiyo.mp3"; var DEKITA = _DIR_ + "/sounds/dekita.mp3"; var TIGAUYO = _DIR_ + "/sounds/tigauyo.wav"; var RIGHT_SE = _DIR_ + "/sounds/step0.wav"; var DOWN_SE = _DIR_ + "/sounds/step1.wav"; // アセットリスト var ASSETS = [ IMAGE, DOWNBUTTON, RIGHTBUTTON, TREASURE, IIYO, DEKITA, TIGAUYO, RIGHT_SE, DOWN_SE ]; /* * グローバル変数 */ var logger = null; var game = null; var scanner = null; var button1, button2, treasure; var roadW, roadH; var beforeW, beforeH; var beforeInput = 1; var map = 0; var virtualMap = 0; var ballWidth = 1; var ballHeight = 1; var searchWidth = 1; var searchHeight = 1; var isIndicating = false; var isChanging = false; var isEnding = false; var color; var count = 0; // オプション変数の設定 $(document).ready(function () { logger = new SwitchApps.Logger(SwitchApps.app.id, null); LOG_switch = logger.addHeader('スイッチ入力'); LOG_scan = logger.addHeader('スキャン入力'); LOG_touch = logger.addHeader('タッチ/クリック入力'); LOG_count = logger.addHeader('スキャン入力%d回目'); //LOG_move = logger.addHeader('ボールを%sに移動'); LOG_moveri = logger.addHeader('ボールを右に移動'); LOG_movedo = logger.addHeader('ボールを下に移動'); //LOG_miss = logger.addHeader('%sへの移動に失敗'); LOG_missri = logger.addHeader('右への移動に失敗'); LOG_missdo = logger.addHeader('下への移動に失敗'); LOG_start = logger.addHeader('ゲームスタート'); LOG_goal = logger.addHeader('ゲームクリア'); STAGE_STYLE = { set: 1, targetname: ["road_length", "test_a"], targetvalue: [1, 1], }; ROAD_LENGTH = { set: 5 }; BACKGROUND_COLOR = { set: 1 }; INPUT_TYPE = { set: 3, targetname: ["scan_speed"], targetvalue: [1,] }; SCAN_SPEED = { set: 2 }; createSettingBox("迷路の形", "stage_style", STAGE_STYLE, 10, "ランダム", "縦のみ", "横のみ"); createSettingBoxException1("迷路の縦横の長さ", "road_length", ROAD_LENGTH, 101, 1, 6); createSettingBox("背景の色", "background_color", BACKGROUND_COLOR, 11, "くろ", "あか", "あお", "みどり"); createSettingBox("入力の形式", "input_type", INPUT_TYPE, 12, "オートスキャン", "矢印ボタンクリック", "2スイッチ(1, 3)"); createSettingBox("スキャンの速さ", "scan_speed", SCAN_SPEED, 121, "0.5秒", "1秒", "2秒", "3秒"); }); /* * 汎用処理 */ // ランダム値生成 var randfloat = function (min, max) { return Math.random() * (max - min) + min; }; var initGame = function () { ballWidth = 1; ballHeight = 1; searchWidth = 1; searchHeight = 1; isIndicating = true; isEnding = false; initRoad(); reflectRoad(0, 0); makeRoad(1, 1); map[ballWidth - 1][ballHeight - 1] = 2; for (var i = 1; i <= roadW; i++) { for (var j = 1; j <= roadH; j++) { var field = new Field(i, j); game.rootScene.addChild(field); } } isChanging = false; }; var initRoad = function () { map = new Array(roadW + 1); virtualMap = new Array(roadW + 1); for (var i = 0; i <= roadW; i++) { map[i] = new Array(roadH + 1); virtualMap[i] = new Array(roadH + 1); } for (var i = 0; i <= roadW; i++) { for (var j = 0; j <= roadH; j++) { map[i][j] = 0; virtualMap[i][j] = 0; } } }; var makeRoad = function (width, height) { virtualMap[width - 1][height - 1] = 1; if (width == roadW && height == roadH) return 0; else { if (width == roadW) { makeRoad(width, height + 1); } else if (height == roadH) { makeRoad(width + 1, height); } else { if (randfloat(1, -1) <= 0) { makeRoad(width + 1, height); } else { makeRoad(width, height + 1); } } } }; var reflectRoad = function (width, height) { if (width == 0 && height == 0) { for (var i = 0; i <= roadW; i++) { for (var j = 0; j <= roadH; j++) { map[i][j] = virtualMap[i][j]; } } } else { map[width - 1][height - 1] = virtualMap[width - 1][height - 1]; if (width == roadW && height == roadH) { isIndicating = false; game.assets[IIYO].play(true); LOG_start(); } } }; var searchRoad = function () { if (searchWidth == roadW) { searchHeight++; game.assets[DOWN_SE].play(true); } else if (searchHeight == roadH) { searchWidth++; game.assets[RIGHT_SE].play(true); } else if (virtualMap[searchWidth][searchHeight - 1] == 1) { searchWidth++; game.assets[RIGHT_SE].play(true); } else { searchHeight++; game.assets[DOWN_SE].play(true); } }; var moveRight = function () { if (!isIndicating) { if (ballWidth == roadW && ballHeight == roadH) goal(); else if (map[ballWidth][ballHeight - 1] == 1) { map[ballWidth - 1][ballHeight - 1] = 1; ballWidth++; map[ballWidth - 1][ballHeight - 1] = 2; //LOG_move('右'); LOG_moveri(); if (ballWidth == roadW && ballHeight == roadH) goal(); else game.assets[RIGHT_SE].play(true); } else { game.assets[TIGAUYO].play(true); //LOG_miss('右'); LOG_missri(); } } } var moveDown = function () { if (!isIndicating) { if (ballWidth == roadW && ballHeight == roadH) goal(); else if (map[ballWidth - 1][ballHeight] == 1) { map[ballWidth - 1][ballHeight - 1] = 1; ballHeight++; map[ballWidth - 1][ballHeight - 1] = 2; //LOG_move('下'); LOG_movedo(); if (ballWidth == roadW && ballHeight == roadH) goal(); else game.assets[DOWN_SE].play(true); } else { game.assets[TIGAUYO].play(true); //LOG_miss('下'); LOG_missdo(); } } } var goal = function () { if (!isEnding) { game.rootScene.removeChild(treasure); for (var i = 0; i <= roadW; i++) { for (var j = 0; j <= roadH; j++) { if (map[i][j] == 2) { LOG_goal(); game.assets[DEKITA].play(); map[i][j] = 3; isEnding = true; } else map[i][j] = 0; } } } }; var bind2switch = function() { //2スイッチ操作対応 game.keybind(49, 'a'); // 1キー game.keybind(32, 'a'); // spaceキー game.keybind(40, 'a'); // 右矢印キー game.keybind(123, 'a'); // F12キー game.keybind(51, 'b'); // 3キー game.keybind(10, 'b'); // Enterキー game.keybind(13, 'b'); // Enterキー windows game.keybind(39, 'b'); // 下矢印キー game.addEventListener("abuttondown", function () { if (INPUT_TYPE.set == 3) { LOG_switch(); moveDown(); } }); game.addEventListener("bbuttondown", function () { if (INPUT_TYPE.set == 3) { LOG_switch(); moveRight(); } }); }; /* * メイン処理 */ window.onload = function () { // ゲームオブジェクトの生成 game = new Core(SCREEN_WIDTH, SCREEN_HEIGHT); // 画像の読み込み game.preload(ASSETS); //オートスキャン用オブジェクトの作成 scanner = new SpriteScanner(); //ゲーム開始時の処理 game.onload = function () { stage = STAGE_STYLE.set; roadW = ROAD_LENGTH.set; roadH = ROAD_LENGTH.set; beforeW = roadW; beforeH = roadH; beforeStage = stage; var scene = game.rootScene; //スキャンの設定 //スキャン時のSE(0:OFF, 1:ON) scanner.scanSE = 1; //決定時のSE(0:OFF, 1:ON) scanner.selectSE = 1; //最初のスキャンまでの待ち時間[秒] scanner.firstWait = 2; //オートスキャンの間隔[秒] scanner.scanInterval = 1.0; //選択後の待ち時間[秒] scanner.selectWait = 1.0; //スキャン枠の太さ[px] scanner.frameWidth = 10; //選択時のスキャン枠の太さ[px] scanner.selectFrameWidth = 15; //何周スキャンして停止するか(-1で無限リピート) scanner.scanRepeat = -1; //フォーカスの種類(frame:枠線、background:背景色変更) scanner.focusType = 'frame'; //フォーカスの色 scanner.focusColor = '#ff00ff'; /* 旧版操作方法 game.keybind(10, 'Enter'); game.keybind(16, 'LeftShift'); game.keybind(13, 'WinEnter'); game.keybind(39, 'RightArrow'); game.keybind(40, 'DownArrow'); game.addEventListener('Enterbuttondown', function(){ if(INPUT_TYPE.set == 3) { LOG_switch(); moveDown(); } }); game.addEventListener('LeftShiftbuttondown', function(){ if(INPUT_TYPE.set == 3) { LOG_switch(); moveRight(); } }); game.addEventListener('WinEnterbuttondown', function(){ if(INPUT_TYPE.set == 3) { LOG_switch(); moveDown(); } }); game.addEventListener('RightArrowbuttondown', function(){ if(INPUT_TYPE.set == 3) { LOG_switch(); moveRight(); } }); game.addEventListener('DownArrowbuttondown', function(){ if(INPUT_TYPE.set == 3) { LOG_switch(); moveDown(); } }); */ //ボタンオブジェクトの作成 button1 = new Sprite(124, 124); //ボタンの画像を設定 button1.image = game.assets[RIGHTBUTTON]; //ボタンオブジェクトの座標を設定 button1.x = 760 * SCALE; button1.y = 80 * SCALE; //ボタンオブジェクトの拡大縮小地点の設定 button1.originX = 0; button1.originY = 0; //ボタンオブジェクトの拡大縮小倍率の設定 button1.scaleX = SCALE; button1.scaleY = SCALE; button1.addEventListener("scanselect", function () { LOG_scan(); LOG_count(++count); moveRight(); //オートスキャンの再開 if (INPUT_TYPE.set == 1 && !isIndicating) scanner.scanStart(1); }); button1.addEventListener("touchstart", function () { if (INPUT_TYPE.set == 2) { LOG_touch(); moveRight(); } }); //ボタンオブジェクトの作成 button2 = new Sprite(124, 124); //ボタンの画像を設定 button2.image = game.assets[DOWNBUTTON]; //ボタンオブジェクトの座標を設定 button2.x = 760 * SCALE; button2.y = 280 * SCALE; //ボタンオブジェクトの拡大縮小地点の設定 button2.originX = 0; button2.originY = 0; //ボタンオブジェクトの拡大縮小倍率の設定 button2.scaleX = SCALE; button2.scaleY = SCALE; button2.addEventListener("scanselect", function () { LOG_scan(); LOG_count(++count); moveDown(); //オートスキャンの再開 if (INPUT_TYPE.set == 1 && !isIndicating) scanner.scanStart(1); }); button2.addEventListener("touchstart", function () { if (INPUT_TYPE.set == 2) { LOG_touch(); moveDown(); } }); treasure = new Sprite(124, 124); treasure.image = game.assets[TREASURE]; treasure.originX = 0; treasure.originY = 0; treasure.scaleX = SCALE; treasure.scaleY = SCALE; treasure.frame = 0; //オートスキャンの対象を設定 scanner.addScanTargets([button1, button2]); //scan開始 //scanner.scanStart(); //オートスキャンを表示 game.rootScene.addChild(scanner); //ボタンを表示 game.rootScene.addChild(button1); game.rootScene.addChild(button2); initGame(); scene.onenterframe = function () { switch (BACKGROUND_COLOR.set) { case 1: scene.backgroundColor = "black"; break; case 2: scene.backgroundColor = "red"; break; case 3: scene.backgroundColor = "blue"; break; case 4: scene.backgroundColor = "green"; break; default: break; } switch (SCAN_SPEED.set) { case 1: scanner.scanInterval = 0.5; break; case 2: scanner.scanInterval = 1.0; break; case 3: scanner.scanInterval = 2.0; break; case 4: scanner.scanInterval = 3.0; break; default: break; } if (isEnding) { if (++count == 30) { count = 0; initGame(); } } if (isIndicating) { if (game.frame % 8 == 0) { searchRoad(); reflectRoad(searchWidth, searchHeight); if (searchWidth == roadW && searchHeight == roadH) { treasure.x = (roadW - 1) * ROAD_SIZE; treasure.y = (roadH - 1) * ROAD_SIZE; scene.addChild(treasure); } } } if (beforeStage != STAGE_STYLE.set) { switch (STAGE_STYLE.set) { case 1: break; case 2: roadW = 1; roadH = 5; break; case 3: roadW = 5; roadH = 1; break; default: break; } isChanging = true; game.rootScene.removeChild(treasure); for (var i = 1; i <= beforeW; i++) { for (var j = 1; j <= beforeH; j++) { var field = new Field(i, j); game.rootScene.removeChild(game.rootScene.lastChild); } } beforeW = roadW; beforeH = roadH; initGame(); } if (beforeInput != INPUT_TYPE.set) { if (INPUT_TYPE.set == 1) scanner.scanStart(1); if(INPUT_TYPE.set == 3){ scanner.keyUnBind(); bind2switch(); console.log("unbind"); } else{ scanner.initialKeyBind(); console.log("bind"); } } if (STAGE_STYLE.set == 1 && (beforeW != ROAD_LENGTH.set || beforeH != ROAD_LENGTH.set)) { //scanner.scanStop(); isChanging = true; roadW = ROAD_LENGTH.set; roadH = ROAD_LENGTH.set; game.rootScene.removeChild(treasure); for (var i = 1; i <= beforeW; i++) { for (var j = 1; j <= beforeH; j++) { var field = new Field(i, j); game.rootScene.removeChild(game.rootScene.lastChild); } } beforeW = roadW; beforeH = roadH; initGame(); } beforeStage = STAGE_STYLE.set; beforeInput = INPUT_TYPE.set; beforeW = roadW; beforeH = roadH; } }; game.start(); }; var Field = Class.create(Sprite, { // 初期化処理 initialize: function (width, height) { Sprite.call(this, 124, 124); var game = Game.instance; this.w = width; this.h = height; this.image = game.assets[IMAGE]; this.x = (width - 1) * ROAD_SIZE; this.y = (height - 1) * ROAD_SIZE; this.originX = 0; this.originY = 0; this.scaleX = SCALE; this.scaleY = SCALE; this.frame = map[width - 1][height - 1]; }, // 更新処理 onenterframe: function () { if (!isChanging) this.frame = map[this.w - 1][this.h - 1]; } });