Javascriptでゲームを作ってみよう⑰
Javascriptでゲームを作ってみよう⑰
GameEnd.ts
の組み込み
いよいよゲーム制作も佳境。GameEnd.ts
を組み込めば一通りの仕組みが完成する。
まずGameTable.ts
のプライベートなメンバとして_gameend
を定義し、constructor
の中でインスタンス化、初期化はinit
の中で行えばいいだろう。
表示は最終的な勝ち負け判定(3回勝った)をしているnext
で行う。
next(jude:boolean) {
if (3 <= this._life.count() || !jude) {
this._result.setup()
this._gameend.show(jude)
return
}
// 略
}
next
で引数を取るように変更し、その結果を判定及び_gameend
の表示内容に反映させている。
ところで判定を意味する「judge」を思いっきり間違えて「jude」と記述していたことに今更ながらに気がついた。まぁいいや。
next
で引数を取るようになるとそれを(間接的に)呼び出すResult.ts
を修正する必要がある。
show(jude:boolean) {
let msg:PIXI.Text = jude ? this._win : this._lose
gsap.to(msg, {pixi: {y: 240}, duration: 2.5,ease: "elastic.out(1, 0.3)",
onComplete: () => {
if (this.parent) this.parent.emit(Result.SHOWED, jude)
}
})
}
emit
の第二引数としてjude
をそのまま渡してやればOKだ。
再プレイ可能にする
今の段階では、_gameend
が表示されたらリロードしなければ再プレイができない。
そこで再プレイが可能になるよう、修正を加える。
まずGameEnd
に、表示の処理が終わったことをGameTable
に伝えるようemit
を追加する。
clear() {
// 略
if (1.5 < this._scale) {
// 略
if (this.parent) this.parent.emit(GameEnd.GAME_END)
}
}
fail() {
// 略
if (1 <= this._fail.alpha) {
this._alpha *= -1
} else if (this._fail.alpha <= 0) {
// 略
if (this.parent) this.parent.emit(GameEnd.GAME_END)
}
}
今度は、GameTable
にGameEnd.GAME_END
を受け取るための処理を追加する。
まずconstructer
に以下を追加。
this.on(GameEnd.GAME_END, this.restart)
そしてrestart
メソッドを追加する。
restart() {
this._pad.interactive = true
this._pad.once('pointerdown', e => {
this._pad.interactive = false
this.init()
})
}
内容はこの通りしごく簡単。_pad
をクリックされたらゲーム全体を初期化するよう支持するメソッドを追加した。
そうそう、init
内でも_field
のremoveChildren
を実行するようにした。
既知のバグ
現在のところ、以下の2つのバグを確認している。
ボタンのscale
変更がinteractive
がtrue
でないと反映されない
これはオブジェクトの親子関係が影響しているような気がする。
ハートが2つ追加になる場合がある
ダブルクリックでもしちゃってるのかしらん。
まぁここで詳しく見る気はない。
今作っているゲームをそのままパクろうと考えてくれてる人がいれば、そこを解決して私に教えてほしい。
さあ、次回はいよいよelectron
でアプリ化を行う!