本节的主要工作是给棋子添加鼠标事件,实现选中棋子、走子以及吃子等功能,同时将服务器端的基础搭建好。
棋盘初始化完成之后,棋盘背景、棋子位置都已经绘制完毕。这时候就需要给上层的Canvas添加鼠标事件的侦听:
me.piecesCanvas.addEventListener("click",me.onClick,false);
当鼠标在棋盘区域进行单击事件的时候,就会触发me.onClick函数的执行,下面就看一下me.onClick的定义
me.onClick = function(e) { var x = e.clientX - me.startX - me.piecesCanvas.offsetLeft; var y = e.clientY - me.startY - me.piecesCanvas.offsetTop; var lineX = x / me.xStep; var lineY = y / me.yStep; lineX = parseInt(lineX + 1.5); lineY = parseInt(lineY + 1.5); var pX = (lineX - 1) * me.xStep; var pY = (lineY - 1) * me.yStep; var dist = Math.sqrt((x - pX) * (x - pX) + (y - pY) * (y - pY)); var r = me.getPiecesR(); if (dist < r) { if (me.status == "idle") { var selectPoint = me.board[lineY][lineX]; if (selectPoint == "") { return; } else { var selectArr = selectPoint.split("-"); var position = selectArr[0]; var pieceStr = selectArr[1]; if (position == "our") { me.activePiece = pieceStr; me.piecesList["our"][pieceStr].active = true; me.status = "active"; me.reDrawPieces(); } } } else if (me.status == "active") { var selectPoint = me.board[lineY][lineX]; if (selectPoint == "") { me.pieceMoveTo("our", me.activePiece, lineX, lineY); me.piecesList["our"][me.activePiece].active = false; me.activePiece = ""; me.status = "idle"; me.reDrawPieces(); } else { var selectArr = selectPoint.split("-"); var position = selectArr[0]; var pieceStr = selectArr[1]; if (position == "opposite") { me.pieceMoveTo("our", me.activePiece, lineX, lineY); me.piecesList["our"][me.activePiece].active = false; me.activePiece = ""; me.status = "wait"; me.reDrawPieces(); } else if (position == "our") { me.piecesList["our"][me.activePiece].active = false; me.piecesList["our"][pieceStr].active = true; me.activePiece = pieceStr; me.reDrawPieces(); } } } } };
这里主要将棋局分成三个状态,idle、active和wait。在idle状态,我方可以选子,一旦选定一个棋子,状态就变成active状态,被选中棋子的active属性就变成true。active状态下,继续侦听鼠标事件,当鼠标选再次单击时判断单击的位置。如果仍然选中了我方棋子,那么就更改被选中的棋子,就是换一个棋子走。如果选中了空白棋子,就走到该位置,棋局状态变为wait状态。如果选中的是对方棋子,那么吃掉对方棋子,棋局状态变成wait状态。这里注意两点:一是还没有考虑不同棋子的走子规则,马走日字象走田嘛,这个以后添加。二是wait状态之后就需要和服务器通讯了,现在也还没有实现。
另外,服务器端使用express来处理web请求,同时使用socket.io来进行websocket通讯。服务端代码大致如下:
var express = require('express') , routes = require('./routes'); var app = module.exports = express.createServer(); var io = require('socket.io').listen(app); // Configuration app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.set('view options',{layout:false}); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + '/public')); }); app.configure('development', function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function(){ app.use(express.errorHandler()); }); // Routes app.get('/', routes.index); var conns={}; io.sockets.on('connection',function(socket){ //do something }); app.listen(3000, function(){ console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); });
最近时间太紧,以后慢慢写。