对应的js
1.封装操作dom的js:
(function (document) {
//游戏的实例
var gameInst;
/**封装一个返回原型的DOM对象 */
function DomObject(dom){
this.dom=dom;
}
/**返回真正的dom元素 */
DomObject.prototype.get=function () {
return this.dom;
};
/**分装事件的注册 */
DomObject.prototype.on=function (eventName,eventHandler) {
this.get().addEventListener(eventName,eventHandler);
};
/**分装操作CSS样式的方法 */
DomObject.prototype.css=function (stylekey,styleValue){
this.get().style[stylekey]=styleValue;
};
/**能够操作以上对象的作法的方法 */
function $(selector,context) {
return new DomObject((context||document).querySelector(selector));
};
/**启动游戏的方法 */
function startGame() {
//注册一个时间 OK时 启动游戏
ResourceManager.onResourceLoaded = function () {
// new Board(); 调用游戏的计时方法
gameInst = new Tetris();
gameInst.startGame();
};
ResourceManager.init();
}
/**初始化的一个方法 */
function _init() {
$('#btn-start').on('click',function (ev) {
$('.start-container').css('display','none');
$('.game-container').css('display', 'block');
/**调用游戏启动的方法 */
startGame();
});
$('#btn-setting').on('click', function(ev){
// alert('You clicked the setting button.');
$('.modal-dialog').css('display','block');
});
$('#btn-dialog-close').on('click',function () {
$('.modal-dialog').css('display','none');
gameInst && gameInst.resume();
});
$('#ck-sound').on('click',function () {
var enable=$('#ck-sound').get().checked;
window.TetrisConfig.config.enableSound=enable;
});
$('#btn-game-setting').on('click',function () {
$('.modal-dialog').css('display','block');
gameInst.pause();
});
//暂停和继续
$('#btn-game-pause').on('click', function (evt) {
var el = evt.target;
if (el.innerText === '暂停') {
el.innerText = '继续';
gameInst.pause();
} else {
el.innerText = '暂停';
gameInst.resume();
}
});
}
/**监听事件的方法 */
document.addEventListener('DOMContentLoaded',function (ev) {
_init();
});
})(document);
全局的配置:
(function (window) {
window.TetrisConfig = {
rows: 20,
cols: 13,
speed: 1000,
constSpeed:1000,
intervalId: 0,
config:{
}
};
})(window);
绘制方块的js:
(function (window) {
'use strict';
function Block(blockType) {
this.blockType = blockType;
this.size = 30;
this.originalSize = 32;
this.sprite = window.ResourceManager.getResource('blocks');
}
Block.prototype = {
constructor: Block,
draw: function (context, x, y,blockType,size) {
size=size || this.size;
context.drawImage(this.sprite, ((blockType || this.blockType) -1) * this.originalSize, 0, this.originalSize, this.originalSize, x * size, y * size, size, size);
}
};
window.Block = Block;
})(window);
放置游戏主元素的面板:
/**放置游戏主元素的面板 */
(function (window) {
'use strict';
function Board(gameInst) {
//传递游戏的实例
this.gameInst=gameInst;
this.blockSize=30;
this.rows=TetrisConfig.rows;
this.cols=TetrisConfig.cols;
/**拿到Canvas对象 */
this.canvas = new Canvas('c_game_main', this.cols * this.blockSize, this.rows * this.blockSize);
this.context=this.canvas.context;
/**生成画布二维数组的数据 */
this.boardList=[];
//绘制方块的属性
this.shape = new window.Shape();
this._init();
//验证是否成功
var b = ResourceManager.getResource('blocks');
console.log(b);
}
/**操作_init方法 */
Board.prototype={
constructor:Board,
_init:function(){
this._buildGridData();
this._initGrid();
//初始化的时候绘制方块
this.shape.draw(this.context);
var self=this;
setTimeout(function(){
//调用构建下一步方块的方法
self._buildNextShape();
});
},
//构建下一步方块的方法
_buildNextShape: function () {
this.nextShape = new window.Shape();
this.nextShape.setPosition(this.gameInst.nextshape.cols, this.gameInst.nextshape.rows);
//找到面板
this.gameInst.nextshape.render(this.nextShape);
},
/**_init中的两个方法*/
_buildGridData(){
var i,j;
for(i=0;i<this.rows;i++){
this.boardList[i]=[];
for(j=0;j<this.cols;j++){
this.boardList[i][j]=0;
}
}
// console.log(this.boardList);
},
/**绘制表格数据 */
_initGrid(){
/**设置画笔 */
var i;
this.context.strokeStyle='green';
this.context.linewidth=0.5;
//绘制线条的 笔迹
for(i=0;i<this.rows;i++){
/**找到起始点 ()*/
this.context.moveTo(0,i*this.blockSize);
this.context.lineTo(this.canvas.width,i*this.blockSize);
}
for(i=0;i<=this.cols;i++){
this.context.moveTo(i*this.blockSize,0);
this.context.lineTo(i*this.blockSize,this.canvas.height);
}
//绘制 线条
this.context.stroke();
//把数据进行缓存
this.gridImageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);
},
tick:function(){
//跳动一次加一个数
if(this.validMove(0,1)){
this.shape.y+=1;
}else{
//不能向下移动添加
this.addShapeToBoardList();
//游戏
if(this.gameInst._state==='over'){
this.gameInst.endGame();
return;
}
//执行清理方法
this.clearFullRows();
this.shape=this.nextShape;
this.shape.setPosition(this.cols,this.rows,true);
this._buildNextShape();
//添加后重新实例化
// this.shape=new window.Shape();
}
//画布刷新一次
this.refresh();
//画出方块
this.shape.draw(this.context);
},
refresh:function(){
this.canvas.clear();
//把图像数据推送到Canvas中
this.context.putImageData(this.gridImageData,0,0);
//绘制方块
this.drawBlocks();
},
//边际的检查算法
validMove:function(moveX,moveY){
//下一步的位置
var nextX=this.shape.x+moveX;
var nextY=this.shape.y+moveY;
//循环检查有没有越界 (越界的算法)
for(var y=0;y<this.shape.layout.length;y++){
for(var x=0;x<this.shape.layout[y].length;x++){
//判断有没有方块
if(this.shape.layout[y][x]){
if (typeof this.boardList[nextY + y] === 'undefined' //找不到行
|| typeof this.boardList[nextY + y][nextX + x] === 'undefined' //找不到列
||this.boardList[nextY+y][nextX+x] //当前位置已有方块
||nextX+x<0 //超出左边界
||nextX+x>=this.cols //超出右边界
||nextY+y>=this.rows //超出上边界
){
return false;
}
}
}
}
return true;
},
//添加堆积容器
addShapeToBoardList:function(){
for(var y=0;y<this.shape.layout.length;y++){
for(var x=0;x<this.shape.layout[y].length;x++){
if(this.shape.layout[y][x]){
var boardX=this.shape.x+x;
var boardY=this.shape.y+y;
if(this.boardList[boardY][boardX]){
//说明已经有了 状态的变化
this.gameInst._state='over';
return;
}else{
//没有碰上默认等于1 让他显示出来
this.boardList[boardY][boardX]=this.shape.blockType;
}
}
}
}
},
//绘制方块
drawBlocks:function(){
for(var y=0;y<this.rows;y++){
for(var x=0;x<this.cols;x++){
if(this.boardList[y][x]){
this.shape.block.draw(this.context,x,y,this.boardList[y][x]);
}
}
}
},
//创建空行
createEmptyRow(){
var emptyArr=[];
for(var i=0;i<this.cols;i++){
emptyArr.push(0);
}
return emptyArr;
},
//消除行的方法
clearFullRows:function(){
var self=this;
var lines=0;
//重下往上判断
for(var y=this.rows-1;y>=0;y--){
//全部填充
var filled=this.boardList[y].filter(function(item){return item>0;}).length===this.cols;
//做移除操作
if(filled&&y){
this.boardList.splice(y,1);
//追加一行 用创建的新行进行填充
this.boardList.unshift(this.createEmptyRow());
lines++;
y++;
}
}
//计算出得分
var score=lines*100*lines; //清楚的行数 * 单行得分 * 倍数
//调用得分的方法
var totalScore= this.gameInst.score.addScore(score);
//最高分
this.gameInst.highscore.checkScore(totalScore);
//当前的级别
var currentLevel= this.gameInst.level.checkLevel(totalScore);
if(currentLevel){
//升级算法速度的变化
window.TetrisConfig.speed= Math.floor(window.TetrisConfig.constSpeed *(1-(currentLevel-1) /10 ));
//提示用户 1.暂停游戏
this.gameInst.pause();
setTimeout(function() {
window.alert('恭喜您升级了!');
self.gameInst.resume();
});
}
}
};
window.Board = Board;
})(window);
绘制面板:
/**
* @param canvasId Canvas元素的ID 属性
* @param width Canvas宽度
* @param height Canvas高度
*/
(function (window){
'user strict';
function Canvas(canvasId, width, height) {
this.canvasId = canvasId;
this.el = document.getElementById(canvasId);
if(!this.el) {
throw new Error ('Must provider a right canvas id.');
}
/**获取Canvas的上下文 */
this.context=this.el.getContext('2d');
this.width=width||window.innerWidth;
this.height=height||window.innerHeight;
this._init();
}
/**操作原型 */
Canvas.prototype={
constructor:Canvas,
_init :function(){
/**style 中的宽高 赋值给参数中的值 */
this.el.width=this.width;
this.el.height=this.height;
},
clear:function(fromX,fromY,toX,toY){
fromX=fromX||0;
fromY=fromY||0;
toX=toX||this.width;
toY=toY||this.height;
this.context.clearRect(fromX,fromY,toX,toY)
},
//绘制文本
drawText: function (text, x, y) {
//清理画布
this.clear(0, 0);
//设置画笔
this.context.font = '25px Arial';
this.context.fillStyle = 'purple';
this.context.textAlign = 'center';
this.context.fillText(text, x === undefined ? (this.width / 2) : x, y === undefined ? 45 : y);
}
};
window.Canvas=Canvas;
})(window);