123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462 |
- import Support from "./base/support";
- // import Animation from "./base/animation";
- //
- let support = new Support()
- // let animation = new Animation()
- var board = new Array();
- var score = 0;
- var topScore = 0;
- var hasConflicted = new Array();
- var direction = {
- left: 1,
- up: 2,
- down: 3,
- right: 4
- };
- // import Player from './player/index'
- // import Support from '../js/base/support'
- /**
- * 底层背景, 读取屏幕的宽高, 设置棋盘边长
- */
- let context = canvas.getContext('2d')
- var bgw = canvas.width
- var bgh = canvas.height
- console.log(bgw, bgh)
- var bdsl = 0.92 * bgw
- let startX //触摸时的坐标
- let startY
- let x //滑动的距离
- let y
- let aboveY = 0 // 设一个全局变量记录上一次内部块滑动的位置
- /**
- * 游戏主函数
- */
- export default class Main {
- constructor() {
- this.backGround()
- // 维护当前requestAnimationFrame的id
- this.aniId = 0
- this.restart()
- }
- backGround() {
- context.fillStyle = '#F0F0F0'
- context.fillRect(0, 0, bgw, bgh)
- context.fillStyle = '#8F7A66'
- context.fillRect(0.05 * bgw, 50, 0.2 * bgw, 0.16 * bgw)
- context.fillStyle = '#BAAB9E'
- context.fillRect(0.3 * bgw, 50, 0.3 * bgw, 0.16 * bgw)
- context.fillStyle = '#F7921E'
- context.fillRect(0.65 * bgw, 50, 0.3 * bgw, 0.16 * bgw)
- context.fillStyle = 'white'
- context.font = "30px Arial"
- context.fillText("重玩", 0.07 * bgw, 50 + 0.1 * bgw);
- context.font = "20px Arial"
- context.fillText("最高分数", 0.35 * bgw, 50 + 0.06 * bgw);
- context.fillText("当前分数", 0.7 * bgw, 50 + 0.06 * bgw);
- // 棋盘背景
- context.fillStyle = '#BBADA0'
- context.fillRect(0.04 * bgw, 0.45 * bgw, bdsl, bdsl)
- }
- restart() {
- //初始化棋盘格
- this.init();
- //在随机两个格子生成数字
- this.generateOneNumber();
- this.generateOneNumber();
- this.updateBoardView();
- score = 0;
- // canvas.removeEventListener(
- // 'touchstart',
- // this.touchHandler
- // )
- // this.bg = new BackGround(ctx)
- // this.player = new Player(ctx)
- // this.gameinfo = new GameInfo()
- // this.music = new Music()
- // this.bindLoop = this.loop.bind(this)
- this.hasEventBind = false
- // 清除上一局的动画
- // window.cancelAnimationFrame(this.aniId);
- // this.aniId = window.requestAnimationFrame(
- // this.bindLoop,
- // canvas
- // )
- // 监听滑动事件
- canvas.addEventListener('touchstart', this.touchStart.bind(this), false);
- canvas.addEventListener('touchmove', this.touchMove.bind(this), false);
- canvas.addEventListener('touchend', this.touchEnd.bind(this), false);
- }
- init() {
- for (var i = 0; i < 4; i++) {
- for (var j = 0; j < 4; j++) {
- context.fillStyle = '#CCC0B3'
- context.fillRect(support.getPostionLeft(i, j) + 0.03 * bgw, support.getPostionTop(i, j) + 0.44 * bgw, 0.214 * bdsl, 0.214 * bdsl)
- }
- }
- //初始化棋盘
- for (var i = 0; i < 4; i++) {
- board[i] = new Array();
- hasConflicted[i] = new Array();
- for (var j = 0; j < 4; j++) {
- board[i][j] = 0;
- hasConflicted[i][j] = false;
- }
- }
- console.log(board);
- //更新面板
- this.updateBoardView();
- }
- updateBoardView() {
- // context.clearRect(0.04*bgw, 0.45*bgw, bdsl, bdsl) //更新之前先删除元素
- // context.fillRect(0.04*bgw, 0.45*bgw, bdsl, bdsl)
- for (var i = 0; i < 4; i++) {
- for (var j = 0; j < 4; j++) {
- //重新生成16个矩形, 并添加到容器中
- var offScreenCanvas = wx.createCanvas()
- var offContext = offScreenCanvas.getContext('2d')
- if (board[i][j] == 0) {
- offContext.fillStyle = '#CCC0B3'
- offContext.fillRect(support.getPostionLeft(i, j) + 0.04 * bgw, support.getPostionTop(i, j) + 0.44 * bgw, 0.214 * bdsl, 0.214 * bdsl)
- // 绘制无字空图
- context.drawImage(offScreenCanvas, 0, 0)
- } else {
- //根据数字颜色设置器背景色
- offContext.fillStyle = support.getBackgroundColorByNum(board[i][j])
- offContext.fillRect(support.getPostionLeft(i, j) + 0.04 * bgw, support.getPostionTop(i, j) + 0.44 * bgw, 0.214 * bdsl, 0.214 * bdsl)
- //设置前景字颜色
- offContext.fillStyle = support.getPreColorByNum(board[i][j])
- //显示数字(文字)
- offContext.font = "18px Arial"
- offContext.fillText(support.getShowTextByNum(board[i][j]), support.getPostionLeft(i, j) + 0.05 * bgw, support.getPostionTop(i, j) + 0.55 * bgw);
- context.drawImage(offScreenCanvas, 0, 0)
- hasConflicted[i][j] = false;
- }
- }
- }
- }
- generateOneNumber() {
- if (support.isNoSpace(board)) {
- return false;
- }
- //随机一个位置
- var randx = parseInt(Math.floor(Math.random() * 4));
- var randy = parseInt(Math.floor(Math.random() * 4));
- //判断生成的坐标是否合理(无值,位置即可使用)
- while (true) {
- if (board[randx][randy] === 0)
- break;
- //若果该坐标存在了值,即不合理,继续生成随机一个位置
- randx = parseInt(Math.floor(Math.random() * 4));
- randy = parseInt(Math.floor(Math.random() * 4));
- }
- //随机一个数字
- var randNum = Math.random() < 0.4 ? 2 : 4;
- board[randx][randy] = randNum;
- showNumberWithAnimation(randx, randy, randNum);
- return true;
- }
- /**
- * 滑动处理 1, 左滑; 2, 上滑, 3, 右滑; 4, 下滑
- */
- slideDirection(numm) {
- switch (numm) {
- case 1: //left
- if (this.moveLeft()) {
- setTimeout(this.generateOneNumber, 210);
- setTimeout(this.isGameOver, 300);
- }
- break;
- case 2: //up
- if (this.moveUp()) {
- setTimeout(this.generateOneNumber, 210);
- setTimeout(this.isGameOver, 300);
- }
- break;
- case 3: //right
- if (this.moveRight()) {
- setTimeout(this.generateOneNumber, 210);
- setTimeout(this.isGameOver, 300);
- }
- break;
- case 4: //down
- if (this.moveDown()) {
- setTimeout(this.generateOneNumber, 210);
- setTimeout(this.isGameOver, 300);
- }
- break;
- default:
- break;
- }
- }
- moveLeft() {
- if (!support.canMove(board, direction.left))
- return false;
- //左移
- for (var i = 0; i < 4; i++) {
- for (var j = 1; j < 4; j++) {
- if (board[i][j] !== 0) {
- for (var k = 0; k < j; k++)
- //可以一次移动多个格子
- if (board[i][k] == 0 && support.noBlockHorizontal(i, k, j, board)) {
- //move
- // showMoveAnimation(i, j, i, k);
- board[i][k] = board[i][j];
- board[i][j] = 0;
- continue;
- } else if (board[i][k] == board[i][j] && support.noBlockHorizontal(i, k, j, board) && !hasConflicted[i][k]) {
- //move
- // showMoveAnimation(i, j, i, k);
- //add
- board[i][k] += board[i][j];
- board[i][j] = 0;
- // var element = $("#grid-cell-" + i + k);
- // anp(element, board[i][k])
- score += board[i][k];
- this.updateScore(score);
- // updateTopScore(score);
- continue;
- }
- }
- }
- }
- setTimeout(this.updateBoardView, 200); //等待200在执行更新面板操作,避免动画效果被冲掉
- return true
- }
- moveRight() {
- if (!support.canMove(board, direction.right))
- return false;
- //右移
- for (var i = 3; i >= 0; i--) {
- for (var j = 2; j >= 0; j--) {
- //该位置不等于0即可进行移动
- if (board[i][j] != 0)
- for (var k = 3; k > j; k--) {
- //如果可以一次移动多个格子
- if (board[i][k] == 0 && support.noBlockHorizontal(i, j, k, board)) {
- //move
- // showMoveAnimation(i, j, i, k);
- board[i][k] = board[i][j];
- board[i][j] = 0;
- continue;
- } else if (board[i][k] == board[i][j] && support.noBlockHorizontal(i, j, k, board) && !hasConflicted[i][k]) {
- //move
- // showMoveAnimation(i, j, i, k);
- //add
- board[i][k] += board[i][j];
- board[i][j] = 0;
- score += board[i][k];
- // var element = $("#grid-cell-" + i + k);
- // anp(element, board[i][k])
- this.updateScore(score);
- // updateTopScore(score);
- continue;
- }
- }
- }
- }
- setTimeout(this.updateBoardView, 200); //等待200在执行更新面板操作,避免动画效果被冲掉
- return true
- }
- /**
- 先判断第一列*/
- moveUp() {
- if (!support.canMove(board, direction.up))
- return false;
- for (var i = 0; i < 4; i++) {
- for (var j = 1; j < 4; j++) {
- //该位置不为0即可进行移动
- if (board[j][i] != 0) {
- for (var k = 0; k < j; k++) {
- if (board[k][i] == 0 && support.noBlockVectal(i, k, j, board)) {
- //move
- // showMoveAnimation(j, i, k, i);
- board[k][i] = board[j][i];
- board[j][i] = 0;
- continue;
- } else if (board[k][i] == board[j][i] && support.noBlockVectal(i, k, j, board) && !hasConflicted[k][i]) {
- //move
- // showMoveAnimation(j, i, k, i);
- board[k][i] += board[j][i];
- board[j][i] = 0;
- score += board[k][i];
- // var element = $("#grid-cell-" + k + i);
- // anp(element, board[k][i])
- this.updateScore(score);
- continue;
- }
- }
- }
- }
- }
- setTimeout(this.updateBoardView, 200); //等待200在执行更新面板操作,避免动画效果被冲掉
- return true
- }
- /**
- 先判断第一列*/
- moveDown() {
- if (!support.canMove(board, direction.down))
- return false;
- for (var i = 3; i >= 0; i--) {
- for (var j = 2; j >= 0; j--) {
- //该位置不为0即可进行移动
- if (board[j][i] != 0) {
- for (var k = 3; k > j; k--) {
- if (board[k][i] == 0 && support.noBlockVectal(i, j, k, board)) {
- //move
- // showMoveAnimation(j, i, k, i);
- board[k][i] = board[j][i];
- board[j][i] = 0;
- continue;
- } else if (board[k][i] == board[j][i] && support.noBlockVectal(i, j, k, board) && !hasConflicted[k][i]) {
- //move
- // showMoveAnimation(j, i, k, i);
- board[k][i] += board[j][i];
- board[j][i] = 0;
- score += board[k][i];
- // var element = $("#grid-cell-" + k + i);
- // anp(element, board[k][i])
- this.updateScore(score);
- continue;
- }
- }
- }
- }
- }
- // this.updateBoardView()
- setTimeout(this.updateBoardView, 200); //等待200在执行更新面板操作,避免动画效果被冲掉
- return true
- }
- isGameOver() {
- if (support.isNoSpace(board) && !support.canMoveALL(board)) {
- this.gameOver();
- }
- }
- gameOver() {
- alert("游戏结束!");
- }
- touchStart(e) { //触摸开始
- e.preventDefault();
- var touch = e.touches[0];
- startX = touch.pageX; //刚触摸时的坐标
- startY = touch.pageY; //刚触摸时的坐标
- }
- touchMove(e) { //滑动
- e.preventDefault();
- var touch = e.touches[0];
- x = touch.pageX - startX; //滑动的距离
- y = touch.pageY - startY; //滑动的距离
- }
- touchEnd(e) { //手指离开屏幕
- // console.log(x);
- // console.log(y);
-
- var xy = Math.abs(x) - Math.abs(y);
- var d = 0;
- if (xy > 0) {
- if (x >= 0) {
- d = 3;
- } else {
- d = 1;
- }
- } else {
- if (y >= 0) {
- d = 4;
- } else {
- d = 2;
- }
- }
- this.slideDirection(d);
- }
- /**
- *
- * 更新最新分数和最高分数
- */
- updateScore(score) {
- // $("#score").text(score);
- if (topScore < score) {
- // $("#top_score").text(score);
- topScore = score;
- return true;
- } else {
- return true;
- // $("#top_score").text(topScore);
- }
- }
- // 游戏结束后的触摸事件处理逻辑
- // touchEventHandler(e) {
- // e.preventDefault()
- // let x = e.touches[0].clientX
- // let y = e.touches[0].clientY
- // let area = this.gameinfo.btnArea
- // if (x >= area.startX &&
- // x <= area.endX &&
- // y >= area.startY &&
- // y <= area.endY)
- // this.restart()
- // }
- }
- /********************* animation */
- function showNumberWithAnimation(randx, randy, randNum) {
- var offScreenCanvas = wx.createCanvas()
- var offContext = offScreenCanvas.getContext('2d')
- offContext.fillStyle = support.getBackgroundColorByNum(randNum)
- offContext.fillRect(support.getPostionLeft(randx, randy) + 0.03 * bgw, support.getPostionTop(randx, randy) + 0.44 * bgw, 0.22 * bdsl, 0.214 * bdsl)
- offContext.fillStyle = support.getPreColorByNum(randNum)
- offContext.font = "18px Arial"
- //显示数字
- offContext.fillText(support.getShowTextByNum(randNum), support.getPostionLeft(randx, randy) + 0.05 * bgw, support.getPostionTop(randx, randy) + 0.55 * bgw)
- context.drawImage(offScreenCanvas, 0, 0)
- // numberCell.animate({
- // width: cellSideLength,
- // height: cellSideLength,
- // top: getPostionTop(randx, randy),
- // left: getPostionLeft(randx, randy)
- // }, 100);
- }
|