堆疊 (Stack)
佇列 (Queue)
復原功能比較像是走迷宮,一定是先從最後一步開始復原,因此這邊我們採用堆疊的方式。堆疊最簡單的實作方式就是使用array,並用pop以及push來塞入、取出資料。
首先先創建一個類別名為RevertBtn.ts
import { ButtonBase } from "./ButtonBase";
import { eventEmitter } from "../Main";
import { GameFlowEvent } from "../core/Event";
export class RevertBtn extends ButtonBase {
constructor() {
super('Button','Revert',50,345);
}
public trigger(){
eventEmitter.emit(GameFlowEvent.RevertBackRequest);
}
}
接著在GameScene.ts加入RevertBtn這個按鈕
export class GameScene {
public static draw(){
//加入背景
application.stage.addChild(PIXI.Sprite.from(Loader.resources["background"].texture));
//加入按鈕
application.stage.addChild(new SoundBtn());
application.stage.addChild(new RevertBtn());
//加入連連看牌面
application.stage.addChild(new GameBoard());
application.stage.addChild(LinkedLine.instance);
//角色動畫
application.stage.addChild(new Character());
}
}
然後去GameBoard.ts註冊GameFlowEvent.RevertBackRequest
這個事件
constructor() {
super();
this.createNewGame();
this.x = 175;
this.y = 20;
eventEmitter.on(GameFlowEvent.RevertBackRequest,this.revertBoard.bind(this));
}
並新增revertBoard的方法
revertBoard = ()=>{
let value = this.valueHistory.pop();
let path = this.pathHistory.pop();
if(value != null && path != null){
board.board[path.point1.x][path.point1.y] = value;
board.board[path.point2.x][path.point2.y] = value;
this.drawBoardIcon();
SoundMgr.play('Back');
}
}ack');
}
}
然後在每次成功連線時,將成功連線的方塊的值和位置存進陣列裡
createIcon = (id, x, y)=>{
let icon = new GameIcon(id,x,y);
this.addChild(icon);
let iconClickHandler = ()=>{
if (this.selected) {
let selectCorrect = false;
this.select2 = new Point(x, y);
this.iconSelected(this.select2);
setTimeout(()=>{
if (board.hasSameValue(this.select1, this.select2)) {
if (! (this.select1.x == x && this.select1.y == y) ) {
let path = new Path(this.select1, this.select2, board);
if(path.canLinkInLine()){
this.pathHistory.push(path);//存入選擇的點
this.valueHistory.push(board.getValue(this.select1));//存入消掉的符號id
LinkedLine.instance.drawPath(path);
this.clearIcon(this.select1);
this.clearIcon(this.select2);
eventEmitter.emit(GameFlowEvent.LinkedLineSuccess);
selectCorrect = true;
//判斷還有沒有路走
if(board.gameRoundEnd()){
alert("恭喜完成遊戲!");
this.createNewGame();
}else if(board.getFirstExistPath() == null){
this.reloadTimes--;
board.rearrangeBoard();
}
}
}
}
if(selectCorrect){
SoundMgr.play('Sound_select_crrect');
}else{
SoundMgr.play('Sound_select_error');
this.iconUnSelected(this.select1);
this.iconUnSelected(this.select2);
}
this.selected = false;
},0);
} else {
this.select1 = new Point(x, y);
this.iconSelected(this.select1);
this.selected = true;
SoundMgr.play('Sound_select_1');
}
};
icon.on("click", iconClickHandler);
icon.on("tap", iconClickHandler);
}
線上展示:http://claire-chang.com/ironman2018/1107
今日成果下載: ironman20181107