先日、スマホで操作できる将棋盤プログラムを作りました。
↑ こちらから動かせます。
1. phina.jsライブラリ
プログラミング言語は JavaScriptで、phina.jsというライブラリを利用しました。
せっかくなので、駒を自分でkeynoteでデザインしました。
けっこう、図形の結合なんかを組み合わせるだけで、それっぽくできるんだね。
1-1. すぐにコードを動かせるのが魅力
言語にJavaScriptを選んだのは、スマホで動作させたかったからです。ウェブアプリなら、パソコンでもスマホでも同じように動作できます。
「JavaScript ゲーム開発」で検索した中から、シンプルなゲームライブラリとして、phina.js を選びました。
C++やJava、Ruby、Pythonをメインに使っていましたが、最近は JavaScript に興味があります。
実際に、phina.jsでプログラムを組んでみると、すぐに画面や画像が表示できました。
1-2. 意外と機能やドキュメントの未実装があった
ただ、phina.jsは、すでに開発が停滞している点が落とし穴でした(最新版:v0.2.3 / 2018年1月23日)。バージョン1になる前に終了しているので、機能のドキュメントが整備されていなかったり、未実装の機能(例えば、スプライトのz座標)があったりして、困る点もありました。
ライブラリには、旬があるんだよね。
ブラウザの更新で、古い機能がうまく動作しなかったりします。
2. phina.jsでのプログラム流れ
phina.jsプログラムの基本的な流れは、
(1)枠組みとなるシーンを表示する。
(2)スプライトを生成して、親オブジェクトに追加する。
(3)イベント時の動作を記述する(更新やタッチなど)。
の3段階です。
スプライトは、オブジェクト・モデルをそのまま動作させるのには簡単ですが、描画とモデルを分離しようと思うと、ちょっと手間がかかる気もしました。
個人で遊ぶ程度なら、さっと形になる点はメリットでもあるよね。
2-1. ファイル構成は通常のHTMLと同じ
通常のHTMLと同じで、画像とスクリプトがあれば、プログラムが実行できます。
「main.jp」を見てみると、1152行になっていました。
これだけ分量が多くなると、ファイルを分割したり、クラスごとにメソッドを管理しないと、わけがわからなくなるね。
例えば、SFEN形式の盤面情報を読み込むコード。
なるべく全体像を把握できるように、Atomエディタを使って、JavaScript用のパッケージを追加しました。
// phina.js をグローバル領域に展開
phina.globalize();
let ASSETS = {
image:{
k1:"img/gyoku.png",
r1:"img/hi.png",
b1:"img/kaku.png",
g1:"img/kin.png",
s1:"img/gin.png",
n1:"img/kei.png",
l1:"img/kyo.png",
p1:"img/fu.png",
r1a:"img/ryu.png",
b1a:"img/uma.png",
s1a:"img/ngin.png",
n1a:"img/nkei.png",
l1a:"img/nkyo.png",
p1a:"img/to.png",
k2:"img/gyoku2.png",
r2:"img/hi2.png",
b2:"img/kaku2.png",
g2:"img/kin2.png",
s2:"img/gin2.png",
n2:"img/kei2.png",
l2:"img/kyo2.png",
p2:"img/fu2.png",
r2a:"img/ryu2.png",
b2a:"img/uma2.png",
s2a:"img/ngin2.png",
n2a:"img/nkei2.png",
l2a:"img/nkyo2.png",
p2a:"img/to2.png"
},
};
var SCREEN_WIDTH = 640; //640
var SCREEN_HEIGHT = 960; //960
var BOARD_PADDING = 10;
var BOARD_SIZE = SCREEN_WIDTH - BOARD_PADDING*2;
var SQUARE_SIZE = BOARD_SIZE / 9;
var BOARD_OFFSET_X = BOARD_PADDING;
var BOARD_OFFSET_Y = (SCREEN_HEIGHT-BOARD_SIZE) / 2;
var MAX_PER_LINE = 9;
var TOTAL_LINE = MAX_PER_LINE + 2;
var BLOCK_NUM = MAX_PER_LINE*MAX_PER_LINE;
const SOUND_ENCODE = {
put:"data:audio/mpeg;base64,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",
move: "data:audio/mpeg;base64,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SqgBQw6aehDQBwTgrGve3FwjP2J8Atg02UJ0mZtMrBEGHmyZRbVWKQtNp6Y/FinAlhwWBcbSaVKoAqpR1f1DimhVFANK+0eV9ncXFbYcXcRV5R8sgrt33CC7V391t66Lrs9dP9P4I002/f/6MsA+FqyAB9B/H4xgySDzDyNxhI0gCaYfuqZUQAGeX+AkOjvkiAAjlZcHdM8Rud/hSs4xhjE1VU12of/Io9EktugJxtNtMoAAi0w5YCqXj9mcN4w3UBU7h5iA6fev/YPSQfZHfl0CSSOR1AAFZ+IkmiUQNNJGXjLHPpRNSsi31VtmSzPbDN////////////////////////4f3/P/+jDAGG6xgAc8eRuMMKkA1Aqj8YeY4CAAAXlZzBrmNYchohAZarmFBM154SASCv/pYAAFd9TqeLZ7MMrs7dfMn2fzDAGS6///////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLAG7C8gAbgPRuHvSbA4xdjcYSJaP/////8COONwBAAAZZoFCJQe6fMgD/1pQAI5JGEAAH0ixcOFBwoFAmn/oI///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywAb5x4AFQE8bJhinAI8GI/AjGJz////////+A2xI2wgABl0WgY2Ilq0O/x0AAAEAfKw+4zR////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMCQ9uOABlxjIYMYSSBnhiPkUYyc////////////////////////////Yu9a/ZSLp//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDXjf+ADlhhHyEIqShMAGRwEAAE////////////////////////////9dVA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLAv8P/gA6cAyOAgAAgRAAkcAAABP/////////////////////////////////71/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywCvy/4AQRAMWgAAAIA4AYsAAAAT///////////////////////////////76P//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMClmf+AEDgBFgAAACALgGLAAAAE///////////////////////////////+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA4r3/gBC8AxYAAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywJlF/4AQuAEUAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMAipf+AEKABLgAAACAAACXAAAAE///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMAipf+AEKABLgAAACAAACXAAAAE///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMAipf+AEKABLgAAACAAACXAAAAE///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////owwCKl/4AQoAEuAAAAIAAAJcAAAAT///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////owwCKl/4AQoAEuAAAAIAAAJcAAAAT///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////owwCKl/4AQoAEuAAAAIAAAJcAAAAT///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////owwCKl/4AQoAEuAAAAIAAAJcAAAAT///////////////////+wBLH/////cv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT///////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/6MsDqNv+AEMABLgAAACAAACXAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+jDAPef/gA+gAS4AAAAgAAAlwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+jLA6jb/gBDAAS4AAAAgAAAlwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
hit: "data:audio/mpeg;base64,SUQzAwAAAAAfdlBSSVYAAAAOAABQZWFrVmFsdWUAIQAAAFBSSVYAAAARAABBdmVyYWdlTGV2ZWwAewQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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Me8lj6zVwRR36W3VfBTN6rnPRXOcnG3Y2LAR+BFv//syxJODRzybGCCZjtDkj+JAECRgUqWr3LW/rWToaYkv3Snxkh0oPI6oUXs5vMj6XhFDpJGs699aCoKXhuyVSwYrrWs/eigotCcZQ0OrspP6tczhyT1JyeNHHrP9eZm3OREpIgkJEhkZS6Xj5m7NDmJDf/f+16yjuRpmZmZlpae+D5+AAA6OfEppSFxTfT2gsIhW1W9mB+KChS+KB//7MsSeA0ekhQ4gjSsA65AhBBMmUQHgfi4jj6CMklBLZtoidDxr5UsVcbVfp+PIiZMZf9Y+Ijm37u+RtzU68NfP//8xX//3lQDo6/wxocC/Bh6B1U9A1dxAsJBlaa6tSBMDQlH1jxKOy8pFgiodZ1GKVgauMZSMIxciQPRGCxQrcv5XFI4myGiNpDFEjZIJRqUv+sKdJAhFGcJhslH/+zLEpgAHfIkIFBMACbijHsMYwACZWNiIaFVxVqUr/C8zf///5tUVf///3FV5AAwm/Y0HQG/IGBMCv8iABhN+YogBULGv+woQMAqFjQC//qChhAKAsfAULN//9hAKGEAoAURNgFIl///2BQKGBQKGACkS4BSI6AX///igUOFBJgoJMRFQCrFQCyEIBf///+GCTP///5CEEf////////swxJUACaEvBjgUAAG0Jd3DDJAA//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxHuADWEY3hiUgAAAADSDgAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsSKA8AAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLEzgPEoAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxP+D0QABpAAAAAAAADSAAAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVf///////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zDE/4PQ4AGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0f/+zLE/4PRAAGkAAAAAAAANIAAAABPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVf///////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zDE/4PQ4AGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0f/+zLE/4PRAAGkAAAAAAAANIAAAABPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVf///////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zDE/4PQ4AGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0f/+zLE/4PRAAGkAAAAAAAANIAAAABPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVf///////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zDE/4PQ4AGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsT/g9EAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsT/g9EAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsT/g9EAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsT/g9EAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxP+D0QABpAAAAAAAADSAAAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxP+D0QABpAAAAAAAADSAAAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxP+D0QABpAAAAAAAADSAAAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVVRBRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAM",
get: "data:audio/mpeg;base64,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K6I6MjI+e05MbnJi60ZXHECJ8yYresuXPFgaKhpQdqBoBA1DX+o8Iv//////////////+zLE54FInHserDDUARCQI4GDPHD//////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxOcByEx/Hww9hcESkSPWnvAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxOcADv0ZEhmqAAD0i1nLnsAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsTQg8VAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1U=",
};
class Sound {
constructor(key) {
this.audio = [];
this.index = 0;
this.data_uri = SOUND_ENCODE[key];
for(let i=0;i<8;i++){
this.audio.push(new Audio(this.data_uri));
}
}
play() {
this.audio[this.index%this.audio.length].play();
this.audio[this.index%this.audio.length] = new Audio(this.data_uri);
this.index += 1;
}
}
const SE = {
dataObj: {
put: new Sound("put"),
move: new Sound("move"),
hit: new Sound("hit"),
get: new Sound("get"),
},
move: function() {
this.dataObj.put.play();
}
};
var myScenes = [
{
lable: 'title',
className: 'TitleScene',
nextLabel:'',
},
{
lable: 'main',
className: 'MainScene',
nextLabel:'',
}
];
/*
* シーン01
*/
var INIT_SFEN = "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1";
var sfens = [
["hirate",
"lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1"],
["up2",
"lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B+5R+1/LNSGKGSNL w - 1"],
["up3",
"lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPP+PPPP/1B+5R+1/LNSGKGSNL w - 1"],
["up5",
"lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PP+PPP+PPP+P/1B+5R+1/LNSGKGSNL w - 1"],
["handicap-2",
"lnsgkgsnl/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1"],
["handicap-4",
"1nsgkgsn1/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1"],
["handicap-6",
"2sgkgs2/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1"],
];
phina.define("TitleScene", {
// 継承
superClass: 'DisplayScene',
// 初期化
init: function() {
// 親クラス初期化
this.superInit();
// 背景色
this.backgroundColor = 'white';
var scene = this;
this.setting = {};
this.setting.sfenIdx = 0;
this.setting.sfen = sfens[0][1];
this.setting.freeMode = false;
//var gridX = Grid(BOARD_SIZE, MAX_PER_LINE);
var items = [
"menu",
//"status",
"start",
"change",
"mode",
];
var ys = Grid(BOARD_SIZE, items.length+4);
var idx = 2;
var labels = {};
items.forEach(item => {
var lab = Label({
text: item,
fontSize: 48,
fill: 'black',
}).addChildTo(this)
.setPosition(this.gridX.center(), ys.span(idx));
labels[item] = lab;
idx++;
});
labels["start"].setInteractive(true);
labels["start"].on("pointstart", function() {
scene.exit(scene.setting);
});
labels["change"].setInteractive(true);
labels["change"].on("pointstart", function() {
scene.setting.sfenIdx = (scene.setting.sfenIdx + 1) % sfens.length;
scene.setting.sfen = sfens[scene.setting.sfenIdx][1];
});
labels["change"].update = function() {
this.text = (scene.setting.sfenIdx + 1)+ ": " + sfens[scene.setting.sfenIdx][0];
};
labels["mode"].setInteractive(true);
labels["mode"].on("pointstart", function() {
scene.setting.freeMode = ! scene.setting.freeMode;
});
labels["mode"].update = function() {
this.text = "[ "+(scene.setting.freeMode ? "free" : "normal")+" ]";
};
},
});
var SENTE = 1;
var GOTE = 2;
var BLANK = -1;
var WALL = 0;
var PIECE_DIRECTIONS = {
k1:"12346789",
r1:"",
b1:"",
g1:"123468",
s1:"12379",
n1:"",
l1:"",
p1:"2",
r1a:"1379",
b1a:"2468",
s1a:"123468",
n1a:"123468",
l1a:"123468",
p1a:"123468",
k2:"12346789",
r2:"",
b2:"",
g2:"246789",
s2:"13789",
n2:"",
l2:"",
p2:"8",
r2a:"1379",
b2a:"2468",
s2a:"246789",
n2a:"246789",
l2a:"246789",
p2a:"246789"
};
var PIECE_STRAIGHT_DIRECTIONS = {
k1:"",
r1:"2468",
b1:"1379",
g1:"",
s1:"",
n1:"",
l1:"2",
p1:"",
r1a:"2468",
b1a:"1379",
s1a:"",
n1a:"",
l1a:"",
p1a:"",
k2:"",
r2:"2468",
b2:"1379",
g2:"",
s2:"",
n2:"",
l2:"8",
p2:"",
r2a:"2468",
b2a:"1379",
s2a:"",
n2a:"",
l2a:"",
p2a:""
};
const PIECE_RANK = {
k:0, r:7, b:6, g:5, s:4, n:3, l:2, p:1, length:8,
};
const PIECE_BY_RANK = "kplnsgbr";
const PHASE = {
erabu:1,
sasu:2,
utsu:3,
naru:4,
};
// MainScene クラスを定義
phina.define('MainScene', {
superClass: 'DisplayScene',
init: function(args) {
this.superInit();
var sfen = args.sfen;
this.freeMode = args.freeMode;
this.teban = SENTE; // 1:sen, 2:go
this.initTebanBackGround();
// 背景色を指定
this.backgroundColor = '#000';
// ラベルを生成
this.teban_label = Label('Design Shogi!').addChildTo(this);
this.teban_label.x = this.gridX.center(); // x 座標
this.teban_label.y = 100; // y 座標
this.teban_label.fill = '#000'; // 塗りつぶし色
// グループ
this.initBoardSquares();
this.phase = PHASE.erabu;
this.senteHand = new Array(PIECE_RANK.length);
this.senteHand.fill(0);
this.goteHand = new Array(PIECE_RANK.length);
this.goteHand.fill(0);
this.loadSFEN(sfen);
this.pieces = [];
this.displayPieces = DisplayElement().addChildTo(this);
this.refresh();
},
initBoardSquares: function() {
var self = this;
this.boardBG = RectangleShape().addChildTo(this);
this.boardBG.fill = '#FFF';
this.boardBG.width = SCREEN_WIDTH;
this.boardBG.height = BOARD_SIZE;
this.boardBG.x = this.gridX.center();
this.boardBG.y = this.gridY.center();;
this.boardBG.alpha = 1;
this.stroke = null;
this.displayBoard = DisplayElement().addChildTo(this);
this.squares = [];
//配列を2重ループで初期化する場合
this.board = new Array((MAX_PER_LINE+2)*(MAX_PER_LINE+2));
this.lastIndex = [];
this.selectedSquare=null;
this.selectedPiece=null;
(BLOCK_NUM).times(function(i) {
// グリッド上でのインデックス
var xIndex = i%MAX_PER_LINE;
var yIndex = Math.floor(i/MAX_PER_LINE);
var square = Square(xIndex, yIndex).addChildTo(this.displayBoard);
this.squares.push(square);
square.setInteractive(true);
square.on('pointstart', function() {
var piece = self.getPiece(xIndex,yIndex);
var square = this
var selectSquare = function() {
self.clearSelect();
self.lastIndex.push(square);
self.selectedSquare = square;
square.selecting(true, true);
var spr = self.getPieceSpriteByPosition(square.xIndex, square.yIndex);
spr.selecting(true,true);
self.lastIndex.push(spr);
var movs = self.getMovements(xIndex, yIndex, true);
//alert(movs);
movs.forEach(pos => {
var target = self.getSquare(pos[0], pos[1]);
target.selecting(true, false);
self.lastIndex.push(target);
});
};
if (self.phase == PHASE.erabu) {
if (piece !== "" && self.movablePiece(piece)) {
selectSquare();
self.phase = PHASE.sasu;
}
} else if (self.phase == PHASE.sasu) {
if (self.selectedSquare == this) {
self.clearSelect();
self.phase = PHASE.erabu;
} else if (self.lastIndex.includes(this)) {
if (self.canUpgradeByPosition(self.selectedSquare.xIndex, self.selectedSquare.yIndex, xIndex, yIndex)) {
self.showUpgradeWindow(self.selectedSquare.xIndex, self.selectedSquare.yIndex, xIndex, yIndex);
self.phase = PHASE.naru;
} else {
self.moveFromTo(self.selectedSquare.xIndex, self.selectedSquare.yIndex, xIndex, yIndex);
self.changeTurn();
self.clearSelect();
self.refresh();
self.phase = PHASE.erabu;
}
} else if (piece !== "" && self.movablePiece(piece)) {
self.clearSelect();
selectSquare();
self.phase = PHASE.sasu;
} else {
self.clearSelect();
self.phase = PHASE.erabu;
}
//getEffectiveArea(xIndex, yIndex);
} else if (self.phase == PHASE.utsu) {
if (self.lastIndex.includes(this)) {
self.setPiece(xIndex, yIndex, self.selectedSquare.name);
self.loseHand(self.selectedSquare.name);
SE.move();
self.changeTurn();
self.clearSelect();
self.phase = PHASE.erabu;
self.refresh();
} else if (piece !== "" && self.movablePiece(piece)) {
self.clearSelect();
selectSquare();
self.phase = PHASE.sasu;
} else {
self.clearSelect();
self.phase = PHASE.erabu;
}
}
});
}, this);
},
loseHand: function(piece) {
var rank = PIECE_RANK[piece[0]];
if (this.sideByPiece(piece) == SENTE) {
this.senteHand -= 1;
} else {
this.goteHand -= 1;
}
},
canUpgradeByPosition: function(x1,y1,x2,y2) {
var p1 = this.getPiece(x1, y1);
return this.canUpgrade(y2,p1) || this.canUpgrade(y1,p1);
},
showUpgradeWindow: function(x1,y1,x2,y2) {
var p1 = this.getPiece(x1, y1);
var p2 = this.getPiece(x2, y2);
var self = this;
var upgradeBackGround = Square(x2,y2);
upgradeBackGround.width = upgradeBackGround.width * 2.2;
upgradeBackGround.height = upgradeBackGround.height * 1.2;
upgradeBackGround.selecting(true,true);
upgradeBackGround.addChildTo(this.displayPieces);
this.pieces.push(upgradeBackGround);
this.selectedSquare.selecting(true,false)
var upgradeSprite = Piece(p1+"a",x2-0.5,y2);
upgradeSprite.addChildTo(this.displayPieces);
this.pieces.push(upgradeSprite);
upgradeSprite.setInteractive(true);
upgradeSprite.on('pointstart', function() {
self.moveFromTo(x1, y1, x2, y2);
self.setPiece(x2, y2, p1+"a");
self.changeTurn();
self.clearSelect();
self.refresh();
self.phase = PHASE.erabu;
});
var originalSprite = Piece(p1,x2+0.5,y2);
originalSprite.addChildTo(this.displayPieces);
this.pieces.push(originalSprite);
originalSprite.setInteractive(true);
originalSprite.on('pointstart', function() {
self.moveFromTo(x1, y1, x2, y2);
self.changeTurn();
self.clearSelect();
self.refresh();
self.phase = PHASE.erabu;
});
},
moveFromTo: function(x1,y1,x2,y2) {
var p1 = this.getPiece(x1, y1);
var p2 = this.getPiece(x2, y2);
if (p2 !== "") {
var rank = PIECE_RANK[p2[0]];
if (this.sideByPiece(p1) == SENTE) {
this.senteHand += 1;
} else {
this.goteHand += 1;
}
SE.move();
} else {
SE.move();
}
this.setPiece(x2, y2, p1);
this.setPiece(x1, y1, "");
},
canUpgrade: function(y,p){
if (p[2] === "a") {
return false;
}
switch (p[0]) {
case "k":
case "g":
return false;
}
var side = this.sideByPiece(p);
if (side == SENTE) {
return y <= 2;
} else {
return y >= 6;
}
},
refresh: function() {
while(this.pieces.length > 0) {
var p = this.pieces.pop();
p.hide();
p.remove();
}
for (var index =0 ; index < BLOCK_NUM; index++) {
var xIndex = index%MAX_PER_LINE;
var yIndex = Math.floor(index/MAX_PER_LINE);
var piece_name = this.getPiece(xIndex,yIndex);
if (piece_name !== "") {
var p = Piece(piece_name, xIndex, yIndex);
p.addChildTo(this.displayPieces);
this.pieces.push(p);
}
}
var i = 0;
var self = this;
this.senteHand.forEach((h,idx) => {
if (h>0) {
var p = Piece(PIECE_BY_RANK[idx]+"1", i, MAX_PER_LINE+0.2);
p.addChildTo(this.displayPieces);
this.pieces.push(p);
p.setInteractive(true);
p.on('pointstart', function() {
if (self.movableSide(SENTE)) {
var lastSelected = self.selectedSquare;
if (self.phase == PHASE.utsu) {
self.clearSelect();
self.phase = PHASE.erabu;
} else if (self.phase == PHASE.sasu) {
self.clearSelect();
self.phase = PHASE.erabu;
}
if (self.phase == PHASE.erabu) {
if (lastSelected != this) {
self.selectedSquare = this;
this.selecting(true);
self.phase = PHASE.utsu;
var movs = self.getUchigomaArea(p.name);
movs.forEach(pos => {
var target = self.getSquare(pos[0], pos[1]);
target.selecting(true, false);
self.lastIndex.push(target);
});
}
}
}
});
if (h>=2) {
var num = NumberLabel(h, i+0.3, MAX_PER_LINE+0.2-0.3);
num.addChildTo(this.displayPieces);
this.pieces.push(num);
}
i = i+1;
}
});
var i = MAX_PER_LINE -1;
this.goteHand.forEach((h,idx) => {
if (h>0) {
var p = Piece(PIECE_BY_RANK[idx]+"2", i, -1.2);
p.addChildTo(this.displayPieces);
this.pieces.push(p);
p.setInteractive(true);
p.on('pointstart', function() {
if (self.movableSide(GOTE)) {
var lastSelected = self.selectedSquare;
if (self.phase == PHASE.utsu) {
self.clearSelect();
self.phase = PHASE.erabu;
} else if (self.phase == PHASE.sasu) {
self.clearSelect();
self.phase = PHASE.erabu;
}
if (self.phase == PHASE.erabu) {
if (lastSelected != this) {
self.selectedSquare = this;
self.phase = PHASE.utsu;
var movs = self.getUchigomaArea(p.name);
movs.forEach(pos => {
var target = self.getSquare(pos[0], pos[1]);
target.selecting(true, false);
self.lastIndex.push(target);
});
}
}
}
});
if (h>=2) {
var num = NumberLabel(h, i+0.3, -1.2-0.3);
num.addChildTo(this.displayPieces);
this.pieces.push(num);
}
i = i-1;
}
});
this.refreshKikiArea();
},
refreshKikiArea:function() {
var senteKiki = new Array((MAX_PER_LINE)*(MAX_PER_LINE));
var goteKiki = new Array((MAX_PER_LINE)*(MAX_PER_LINE));
var x;
var y;
//initialize
for (x=0; x<MAX_PER_LINE; x++) {
for (y=0; y<MAX_PER_LINE; y++) {
var idx = x + y*MAX_PER_LINE;
senteKiki[idx] = 0;
goteKiki[idx] = 0;
}
}
for (x=0; x<MAX_PER_LINE; x++) {
for (y=0; y<MAX_PER_LINE; y++) {
var piece = this.getPiece(x,y);
var movs = this.getMovements(x,y,false);
var side = this.sideByPiece(piece);
movs.forEach(p => {
var idx = p[0] + p[1]*MAX_PER_LINE;
if (side === SENTE) {
senteKiki[idx] += 1;
} else {
goteKiki[idx] += 1;
}
});
}
}
for (x=0; x<MAX_PER_LINE; x++) {
for (y=0; y<MAX_PER_LINE; y++) {
var idx = x + y*MAX_PER_LINE;
var s = senteKiki[idx];
var g = goteKiki[idx];
var square = this.getSquare(x,y);
if (s == 0 && g == 0) {
square.setColor("#999");
} else if (s>0 && g == 0) {
if (s>=3) {
square.setColor("#fdd");
} else if (s == 2) {
square.setColor("#fbb");
} else {
square.setColor("#d99");
}
} else if (g>0 && s == 0) {
if (g>=3) {
square.setColor("#aef");
} else if (g == 2) {
square.setColor("#8cf");
} else {
square.setColor("#69c");
}
} else if (s==g) {
square.setColor("#94b");
} else if (s>g) {
square.setColor("#E55");
} else {
square.setColor("#37E");
}
}
}
},
getFuLines: function(piece) {
var ret = [];
for (var x=0; x<MAX_PER_LINE; x++){
for (var y=0; y<MAX_PER_LINE; y++) {
if(this.getPiece(x,y) === piece) {
ret.push(x);
}
}
}
return ret;
},
getUchigomaArea: function(piece) {
var ret = [];
var fuLines = this.getFuLines(piece);
for (var x=0; x<MAX_PER_LINE; x++){
for (var y=0; y<MAX_PER_LINE; y++) {
if(this.getPiece(x,y) === "") {
//todo: Piece
if (piece === "p1") {
if(fuLines.includes(x) === false && y != 0) {
ret.push([x,y]);
}
} else if (piece === "p2") {
if(fuLines.includes(x) === false && y != MAX_PER_LINE -1) {
ret.push([x,y]);
}
} else {
ret.push([x,y]);
}
}
}
}
return ret;
},
clearSelect: function() {
if (this.selectedSquare) {
this.selectedSquare.selecting(false);
this.selectedSquare = null;
}
while (this.lastIndex.length > 0) {
var s = this.lastIndex.pop();
s.selecting(false);
}
},
update: function() {
this.teban_label .text = "teban is " + this.teban;
if (this.movableSide(SENTE)) {
this.tebanBG.alpha = 1;
this.gotebanBG.alpha = 0.5;
this.teban_label .y = SCREEN_HEIGHT - 100;
} else {
this.tebanBG.alpha = 0.5;
this.gotebanBG.alpha = 1;
this.teban_label .y = 100;
}
if (this.senteHand[0] >= 1) {
this.teban_label.text = "Winner is SENTE";
this.teban_label .y = SCREEN_HEIGHT - 100;
this.teban = 0;
} else if (this.goteHand[0] >= 1) {
this.teban_label.text = "Winner is GOTE";
this.teban_label .y = 100;
this.teban = 0;
}
},
getPieceSpriteByPosition: function(x,y) {
var ret = this.pieces.find(p => p.xIndex == x && p.yIndex == y);
return ret;
},
getMovements:function(xIndex, yIndex, real_move) {
var ret = [];
var piece = this.getPiece(xIndex,yIndex);
if (piece === "") {
return ret;
}
var s = PIECE_DIRECTIONS[piece];
for (i = 0; i<s.length; i++) {
ret.push(this.getPositionByDirection(xIndex,yIndex, parseInt(s[i])));
}
if (piece === "n1" && yIndex - 2 >= 0) {
ret.push([xIndex-1, yIndex-2]);
ret.push([xIndex+1, yIndex-2]);
}
if (piece === "n2" && yIndex + 2 < MAX_PER_LINE) {
ret.push([xIndex-1, yIndex+2]);
ret.push([xIndex+1, yIndex+2]);
}
var side = this.sideByPiece(piece);
var sdir = PIECE_STRAIGHT_DIRECTIONS[piece];
for (i = 0; i<sdir.length; i++) {
ret = ret.concat(this.getStraightMovements(xIndex,yIndex, parseInt(sdir[i]), real_move, side));
}
if (real_move) {
var self = this;
var isMovable = function(pos) {
var enemy = self.enemySide(piece);
var side = self.sideByPiece(self.getPiece(pos[0], pos[1])) ;
return side === BLANK || side === enemy;
};
ret = ret.filter(isMovable);
}
var self = this;
var isInnner = function(pos) {
return self.outRange(pos[0],pos[1]) === false;
};
ret = ret.filter(isInnner);
return ret;
},
getPositionByDirection: function(xIndex,yIndex,dirInt){
switch(dirInt) {
case 1: return [xIndex-1, yIndex-1];
case 2: return [xIndex , yIndex-1];
case 3: return [xIndex+1, yIndex-1];
case 4: return [xIndex-1, yIndex ];
case 6: return [xIndex+1, yIndex ];
case 7: return [xIndex-1, yIndex+1];
case 8: return [xIndex , yIndex+1];
case 9: return [xIndex+1, yIndex+1];
default: return undefined;
}
},
getStraightMovements: function(x,y,dirInt, real_move, side){
var ret = [];
var pos = this.getPositionByDirection(x,y,dirInt);
ret.push(pos);
var target = this.getPiece(pos[0], pos[1]);
if (target === "") {
return ret.concat(this.getStraightMovements(pos[0],pos[1],dirInt, real_move, side));
} else {
if (real_move) {
return ret;
} else if (this.sideByPiece(target) == side) {
var dirStr = dirInt.toFixed();
if (PIECE_STRAIGHT_DIRECTIONS[target].includes(dirStr)) {
return ret.concat(this.getStraightMovements(pos[0],pos[1],dirInt, real_move, side));
} else if (PIECE_DIRECTIONS[target].includes(dirStr)) {
ret.push(this.getPositionByDirection(pos[0],pos[1],dirInt));
//return ret;
}
return ret;
} else {
return ret;
}
}
},
loadSFEN: function(str){
for(var i = 0; i < (MAX_PER_LINE+2)*(MAX_PER_LINE+2); i++) {
if (this.outRangeByIdx(i)) {
this.board[i] = "w0";
} else {
this.board[i] = "";
}
}
var index = 0;
for (var i = 0; i < str.length; i++) {
var pierce_name = "";
var ch = str[i];
if (index < 81) {
switch (ch) {
case 'k': pierce_name="k2"; break;
case 'r': pierce_name="r2"; break;
case 'b': pierce_name="b2"; break;
case 'g': pierce_name="g2"; break;
case 's': pierce_name="s2"; break;
case 'n': pierce_name="n2"; break;
case 'l': pierce_name="l2"; break;
case 'p': pierce_name="p2"; break;
case 'K': pierce_name="k1"; break;
case 'R': pierce_name="r1"; break;
case 'B': pierce_name="b1"; break;
case 'G': pierce_name="g1"; break;
case 'S': pierce_name="s1"; break;
case 'N': pierce_name="n1"; break;
case 'L': pierce_name="l1"; break;
case 'P': pierce_name="p1"; break;
case '1': case '2': case '3':
case '4': case '5': case '6':
case '7': case '8': case '9':
index+=parseInt(ch);
break;
case '/':
break;
default:
break;
}
if (pierce_name !== "") {
if (str[i+1] == "+") {
i++;
pierce_name += "a";
}
var xIndex = index%MAX_PER_LINE;
var yIndex = Math.floor(index/MAX_PER_LINE);
this.setPiece(xIndex, yIndex, pierce_name);
index+=1;
}
} else {
if (ch == "b") {
this.teban = SENTE;
}
if (ch == "w") {
this.teban = GOTE;
}
}
}
},
getSquare: function(x,y) {
return this.squares[x+y*MAX_PER_LINE];
},
pos2Idx: function(x,y) {
return (x+1) + (y+1) * (TOTAL_LINE);
},
idx2Pos: function(index) {
var xIndex = index%(TOTAL_LINE) - 1;
var yIndex = Math.floor(index/(TOTAL_LINE)) -1;
return [xIndex, yIndex];
},
outRange:function(x,y) {
if (x < 0) {
return true;
} else if (x >= MAX_PER_LINE) {
return true;
} else if (y < 0) {
return true;
} else if (y >= MAX_PER_LINE) {
return true;
}
return false;
},
outRangeByIdx: function(index) {
var ar = this.idx2Pos(index);
return this.outRange(ar[0],ar[1]);
},
getPiece: function(x,y) {
return this.board[this.pos2Idx(x,y)];
},
setPiece: function(x,y,piece) {
this.board[this.pos2Idx(x,y)] = piece;
},
sideByPiece: function(str){
if (str === "") {
return -1;
} else {
return parseInt(str[1]);
}
},
enemySide: function(str){
return this.opposite( this.sideByPiece(str));
},
opposite: function(v) {
if (v == SENTE) {
return GOTE;
} else {
return SENTE;
}
},
changeTurn:function(){
if (this.freeMode == true) {
return;
} else {
this.teban = this.opposite(this.teban);
}
},
movablePiece: function(piece) {
return this.movableSide(this.sideByPiece(piece));
},
movableSide: function(value) {
if (this.freeMode == true) {
return true;
} else {
return value == this.teban;
}
},
initTebanBackGround: function() {
this.tebanBG = RectangleShape().addChildTo(this);
this.tebanBG.fill = "#ccc";//'#F88';
this.tebanBG.width = SCREEN_WIDTH;
this.tebanBG.height = BOARD_OFFSET_Y;
this.tebanBG.x = this.gridX.center();
this.tebanBG.y = SCREEN_HEIGHT - this.tebanBG.height / 2;
this.tebanBG.alpha = 0.7;
this.stroke = null;
this.gotebanBG = RectangleShape().addChildTo(this);
this.gotebanBG.fill = "#ccc";//'#8CF';
this.gotebanBG.width = SCREEN_WIDTH;
this.gotebanBG.height = BOARD_OFFSET_Y;
this.gotebanBG.x = this.gridX.center();
this.gotebanBG.y = this.gotebanBG.height / 2;
this.gotebanBG.alpha = 0.7;
this.stroke = null;
},
});
phina.define('Square', {
superClass: 'RectangleShape',
init: function(xIndex, yIndex) {
this.superInit({
width: SQUARE_SIZE,
height: SQUARE_SIZE,
fill: "#aaa",
stroke: "#000",
cornerRadius: 8,
strokeWidth: 2,
});
this._xIndex = xIndex;
this._yIndex = yIndex;
this.color = "#aaa";
this.r = 255;
this.g = 255;
this.b = 0;
this.tweening = false;
this.setPosition(xIndex, yIndex);
this.getter('xIndex', function() {return this._xIndex;});
this.getter('yIndex', function() {return this._yIndex;});
},
setColor: function(col) {
this.color = col;
this.fill = col;
},
setPosition: function(xIndex, yIndex) {
this._xIndex = xIndex;
this._yIndex = yIndex;
var gridX = Grid(BOARD_SIZE, MAX_PER_LINE);
var gridY = Grid(BOARD_SIZE, MAX_PER_LINE);
this.x = gridX.span(xIndex) + BOARD_OFFSET_X + SQUARE_SIZE / 2;
this.y = gridY.span(yIndex)+BOARD_OFFSET_Y + SQUARE_SIZE / 2;
},
selecting: function(on_off, center) {
if (on_off) {
//this.alpha = 0.4;
if (center) {
this.tweener.to({r:0.8* 255, g:0.8* 255, b:0},600)
.to({r:1* 255, g:1* 255, b:0},400).setLoop(true).play();
this.tweening = true;
this.strokeWidth = 2;
} else {
this.tweening = false;
this.alpha = 0.4;
//this.stroke = "#888";
//this.strokeWidth = 2;
}
} else {
this.tweening = false;
this.alpha = 1;
//this.tweener.to({alpha:1},50).setLoop(false).play();
this.fill = this.color;
this.stroke = "#000";
this.strokeWidth = 2;
}
},
update:function() {
if (this.tweening) {
this.fill = 'rgb({0}, {1}, {2})'.format(this.r, this.g, this.b);
}
}
});
phina.define('Piece', {
superClass: 'Sprite',
init: function(piece_name, xIndex, yIndex) {
var piece_size = SQUARE_SIZE* 0.88;
switch (piece_name) {
case "k1":
case "r1":
case "b1":
case "r1a":
case "b1a":
case "k2":
case "r2":
case "b2":
case "r2a":
case "b2a":
piece_size = SQUARE_SIZE* 0.98;
break;
case "p1":
case "p1a":
case "p2":
case "p2a":
piece_size = SQUARE_SIZE* 0.75;
break;
default:
}
this.superInit(piece_name, piece_size, piece_size);
this._name = piece_name;
this.setPosition(xIndex, yIndex);
this.getter('xIndex', function() {return this._xIndex;});
this.getter('yIndex', function() {return this._yIndex;});
this.getter('name', function() {return this._name;});
},
setPosition: function(xIndex, yIndex) {
this._xIndex = xIndex;
this._yIndex = yIndex;
var gridX = Grid(BOARD_SIZE, MAX_PER_LINE);
var gridY = Grid(BOARD_SIZE, MAX_PER_LINE);
this.x = gridX.span(xIndex) + BOARD_OFFSET_X + SQUARE_SIZE / 2;
this.y = gridY.span(yIndex)+BOARD_OFFSET_Y + SQUARE_SIZE / 2;
},
selecting: function(on_off, center) {
var gridY = Grid(BOARD_SIZE, MAX_PER_LINE);
if (on_off) {
this.y = -10 + gridY.span(this.yIndex)+BOARD_OFFSET_Y + SQUARE_SIZE / 2;;
} else {
this.y = gridY.span(this.yIndex)+BOARD_OFFSET_Y + SQUARE_SIZE / 2;;
}
}
});
phina.define('NumberLabel', {
superClass: 'Label',
init: function(num, xIndex, yIndex) {
this.superInit();
this.text = num;
this.fontWeight= "bold";
this.height = SQUARE_SIZE / 5;
this.stroke = "#fff";
this.strokeWidth = 5;
this.setPosition(xIndex, yIndex);
this.getter('xIndex', function() {return this._xIndex;});
this.getter('yIndex', function() {return this._yIndex;});
},
setPosition: function(xIndex, yIndex) {
this._xIndex = xIndex;
this._yIndex = yIndex;
var gridX = Grid(BOARD_SIZE, MAX_PER_LINE);
var gridY = Grid(BOARD_SIZE, MAX_PER_LINE);
this.x = gridX.span(xIndex) + BOARD_OFFSET_X + SQUARE_SIZE / 2;
this.y = gridY.span(yIndex)+BOARD_OFFSET_Y + SQUARE_SIZE / 2;
},
});
// メイン処理
phina.main(function() {
// アプリケーション生成
var app = GameApp({
startLabel: 'title', // メインシーンから開始する
scens: myScenes,
width: SCREEN_WIDTH,
height: SCREEN_HEIGHT,
assets: ASSETS,
});
// アプリケーション実行
app.run();
});
こちらもどうぞ