[菜鸟前端]Canvas 推箱子小游戏,找回童年时的快乐~

简介

以前闲的无聊就喜欢写一写H5小游戏,前几天整理了一下这个推箱子的代码,就放到了git仓库里,欢迎大家玩耍。

玩玩试试

代码仓库

主要逻辑

  1. 整个界面就是一个canvas,首先读取level.js文件获得地图信息,并据此在画布中画出地图信息。其中每一关地图信息是这样的。 1 代表围墙,2代表灰太狼,4代表小绵羊,8代表笼子。
    
           "map":[[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], 
    		[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ], 
    		[ 1, 0, 0, 0, 8, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1 ],
    		[ 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 ],
    		[ 1, 0, 0, 0, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 ],
    		[ 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 ],
    		[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 ],
    		[ 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1 ],
    		[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1 ],
    		[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
    		[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
    		[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]]
    	
    复制代码

var data = datas.myarray; // datas是定义在level.js中的地图信息数据
var wi,wj; // 灰太狼位置
var score = 0; // 当前分数
var level = 1; // 当前关卡
var cage_num = 0; // 箱子总数
var c = document.getElementById("c");// 获取canvas标签
var ctx = c.getContext('2d');
var tree = new Image();
gameinit();
function gameinit() {
   tree.src = "img/tree.png";
   tree.onload = function () {
   	for (var i = 0; i < map.length; i++) {
   		for (var j = 0; j < map[i].length; j++) {
   			//画树、
   			if (map[i][j] == 1) {
   				ctx.drawImage(tree, j * 50, i * 50, 50, 50);
   			}
   		}
   	}
   }
   //... 其他元素绘制同理,需要注意的是在绘制灰太狼的同时,需要保存灰太狼的位置信息,绘制笼子的同时,记录笼子的总数和(用于判断是否过关)。
}
复制代码
  1. 监听键盘WASD和上下左右点击事件,会重新绘制画布。
window.onkeydown = function () {
   		var keycode = event.keyCode;
   		// 通关关卡后会出现提示标语,这时再次按键会绘制新地图。
   		if (score >= cage_num) {
   			level++;
   			score = 0;
   			cage_num = 0;
   			ctx.clearRect(0, 0, 800, 600);
   			map = data[level].map;
   			gameinit();
   		} else {
   			switch (keycode) {
   				case 38://按键:上
   				case 87://按键:w
   					wolf.src = "img/wolf-sm.png";
   					if (map[wi - 1][wj] == 0) { // 向上走, 上边是草地
   						ctx.clearRect(wj * 50, wi * 50, 50, 50);
   						ctx.drawImage(wolf, wj * 50, wi * 50 - 50, 50, 50);
   						map[wi][wj] = 0;
   						map[wi - 1][wj] = 2;
   						wi = wi - 1;
   					} else if (map[wi - 1][wj] == 4 && map[wi - 2][wj] == 0) { // 向上走, 上边是羊,羊上面是草地。
   						//羊往上走
   						ctx.clearRect(wj * 50, wi * 50 - 50, 50, 50);
   						ctx.drawImage(sheep, wj * 50, wi * 50 - 100, 50, 50);
   						//狼往上走
   						ctx.clearRect(wj * 50, wi * 50, 50, 50);
   						ctx.drawImage(wolf, wj * 50, wi * 50 - 50, 50, 50);
   						//变更数组
   						map[wi][wj] = 0;
   						map[wi - 1][wj] = 2;
   						map[wi - 2][wj] = 4;
   						wi = wi - 1;
   					} else if (map[wi - 1][wj] == 4 && map[wi - 2][wj] == 8) { // 向上走, 上边是羊,羊上面是空笼子。
   						//羊往上走
   						ctx.clearRect(wj * 50, wi * 50 - 50, 50, 50);
   						ctx.drawImage(sheep, wj * 50, wi * 50 - 100, 50, 50);
   						//狼往上走
   						ctx.clearRect(wj * 50, wi * 50, 50, 50);
   						ctx.drawImage(wolf, wj * 50, wi * 50 - 50, 50, 50);
   						//变更数组
   						map[wi][wj] = 0;
   						map[wi - 1][wj] = 2;
   						map[wi - 2][wj] = 12;
   						wi = wi - 1;
   						score++;
   					} else {
   						// 走不动, 重新绘制(必须存在,否则在墙角等地方会有bug,尝试便知)
   						ctx.clearRect(wj * 50, wi * 50, 50, 50);
   						ctx.drawImage(wolf, wj * 50, wi * 50, 50, 50);
   					}
   					break;
   					// 其他按键同理
   			}
   		}
   			
   		// 判断是否通关,给出通关标语。
   		if (score >= cage_num && cage_num != 0) {
   			ctx.font = "bolder 50px Arial";
   			ctx.fillStyle = "red";
   			ctx.fillText("YOU WIN!!!", 200, 200);
   			ctx.fillText("NEXT,GO!!!", 200, 300);
   		}
复制代码

转载于:https://juejin.im/post/5c341987f265da61137f720b

你可能感兴趣的:([菜鸟前端]Canvas 推箱子小游戏,找回童年时的快乐~)