我画你猜(二)

上一篇已经写好了两个类实现了画画功能,这次加上websocket实现广播

用到node组件ws

npm install ws --save

建立个连接池实现广播

const WebSocket = require(‘ws‘);

const wss = new WebSocket.Server({ port: 4000 });

// 连接池
let clients = [];

let myWs = () =>{
    wss.on(‘connection‘, function connection(ws) {
        clients.push(ws);
        ws.on(‘message‘, function incoming(message) {
            // 广播消息
            clients.forEach(function(ws1){
                if(ws1 !== ws) {
                    ws1.send(message);
                }
            });
        });
        ws.on(‘close‘, function(message) {
            // 连接关闭时,将其移出连接池
            clients = clients.filter(function(ws1){
                return ws1 !== ws
            })
        });
    });
}

module.exports = myWs;

  

前端增加socket类

//清空画布
Draw.prototype.clearAll = function(){
    this.cvx.clearRect(0,0,this.cvs.clientWidth,this.cvs.clientHeight);
}

/*****socket类*****/
function Socket(doSome){
    this.server = ‘ws://localhost:4000‘;
    this.isOpen = true;
    this.websocket = new WebSocket(this.server);
    this.doSome = doSome;
}

Socket.prototype.init = function(){
    var that = this;
    this.websocket.onopen = function (evt) {
        that.isOpen = true;
    }
    this.websocket.onclose = function (evt) {
        alert(‘连接已经断开‘);
        that.isOpen = false;
    };
    this.websocket.onerror = function (evt) {
        alert(‘连接已经断开‘);
        that.isOpen = false;
    };
    this.websocket.onmessage = function (evt) {
        that.doSome && that.doSome(evt);
    };
}

Socket.prototype.send = function(msg,cb){
    this.websocket.send(msg);
    cb && cb();
}

  

改造一下元素类,发送数据

/*****元素类*****/
function DrawElement(cavId,clearId,eraserId){
    this.ele = document.getElementById(cavId);
    this.clearBnt = document.getElementById(clearId);
    this.eraserBnt = document.getElementById(eraserId);
    //是否是橡皮擦模式
    this.isEraser = false;
    this.draw = new Draw(this.ele);
    var that = this;
    //获取画笔的x和y
    this.getXY = function(xOrY){
        if(xOrY === ‘x‘) return this.pageX - that.ele.offsetLeft;
        return this.pageY - that.ele.offsetTop;
    }

    //建立socket连接
    this.socket = new Socket();
}

DrawElement.prototype.init = function(){
    var ele = this.ele;
    var draw = this.draw;
    var getXY = this.getXY;
    var that = this;
    ele.onmousedown = function(e){
        var ev = e || window.event;
        var x = getXY.call(ev,‘x‘);
        var y = getXY.call(ev);
        draw.drawBegin(x,y);
        that.socket.send(JSON.stringify({
            type: ‘drawBegin‘,
            x: x,
            y: y
        }));
    };
    ele.onmousemove = function(e){
        var ev = e || window.event;
        var x = getXY.call(ev,‘x‘);
        var y = getXY.call(ev);
        if(that.isEraser){
            draw.clear(x,y);
            that.socket.send(JSON.stringify({
                type: ‘clear‘,
                x: x,
                y: y
            }));
        }else{
            if(draw.drawMiddle(x,y)){
                that.socket.send(JSON.stringify({
                    type: ‘draw‘,
                    x: x,
                    y: y
                }));
            }
        }
    };
    ele.onmouseup = function(){
        draw.drawEnd();
        that.socket.send(JSON.stringify({
            type: ‘drawEnd‘
        }));
    };
    ele.onmouseleave = function(){
        draw.drawEnd();
        that.socket.send(JSON.stringify({
            type: ‘drawEnd‘
        }));
    };
    //清除画布
    this.clearBnt.onclick = function(){
        draw.clearAll();
        that.socket.send(JSON.stringify({
            type: ‘clearAll‘
        }));
    };
    //进入橡皮擦模式
    this.eraserBnt.onclick = function(e){
        var ev = e || window.event;
        that.isEraser = !that.isEraser;
        ev.target.innerText = that.isEraser?"继续画画":"橡皮擦"
    };
}

  

增加“你猜”页面

<!DOCTYPE html>
<html>
  <head>
    <title>你猜</title>
    <link rel=‘stylesheet‘ href=‘/stylesheets/style.css‘ />
  </head>
  <body>
    <canvas width="600" height="600" id="cvs"></canvas>
    <script src="/javascripts/index.js"></script>
    <script>
      window.onload = function(){
        var draw = new Draw(document.getElementById(‘cvs‘),true);
        new Socket(function(evt){
          let data = JSON.parse(evt.data);
          switch(data.type){
            case ‘drawBegin‘:
              draw.drawBegin(data.x,data.y);
            break;
            case ‘draw‘:
              draw.drawMiddle(data.x,data.y);
            break;
            case ‘drawEnd‘:
              draw.drawEnd();
            break;
            case ‘clear‘:
              draw.clear(data.x,data.y);
            break;
            case ‘clearAll‘:
              draw.clearAll();
            break;
            default:
            break;
          }
        }).init();
      }
    </script>
  </body>
</html>

  

启动服务最终得到效果

源码地址:https://github.com/longorYang/draw-guess

时间: 2024-10-16 19:04:55

我画你猜(二)的相关文章

我画你猜(一)

----- 最近同事老拉着玩一个游戏<我画你猜>,非常好玩,于是作为码农尝试着自己做个. 先实现画布的简单功能:简单的把功能封装了两个类 (1)元素类,也是整个画画功能的进入点 /*****元素类*****/ function DrawElement(cavId,clearId,eraserId){ this.ele = document.getElementById(cavId); this.clearBnt = document.getElementById(clearId); this.

4种方法生成二维码 (js 控制canvas 画出 二维码)

随着网络的迅速发展 发展 发展,二维码的应用将会越来越多.同时很多只是很平凡的二维码,请拿起你的手 把这个二维码 设计起来吧.下面分享了几个非常好的二维码设计.  二维码原理: 二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码. 堆叠式/行排式二维条码形态上是由多行短截的一维5条码堆叠而成:矩阵式二维条码以矩阵的形式组成,在矩阵相应元素位置上用“点”表示二进制“1”, 用“空”表示二进制“0”,“点”和“空”的排列组成代码. 最近对二维码产生了兴趣 研究了一下二维码 这里生出的术语

关于如何使用VC6.0+Graphics图形库画出二维图形全教程

首先是安装VC6.0,网上各种版本很多,参差不齐,在这里给出一个非常好用的VC6.0(提取码:1bn9) 不支持win10,8,如果非得使用,请用虚拟机或者重装win7系统 按照提示安装就好了,不行就多装几遍(c盘不行就装载d盘),没什么需要特殊配置的 然后就是关于Graphics图形库了,这个更简单,也是有脚本软件,可以直接安装使用,记得安装完VC6.0之后重启一下 可执行软件是:EasyX(提取码:9v9w) 安装完成直接打开后会有提示,可以点击自动添加Graphics图形库,如果不行就手动

Cpp调用Python3,使用matplotlib画(二维)图----1.配置(Clion,mingW64, python, matplotlib)

To my knowledge so far, Cpp画图是真滴捉急, 那就调用python帮帮忙吧. 百度了好久,试了好几次,终于走完了配置的过程.我要记录一下. 1.0 配置:(操作系统)64位Win7, (Cpp的IDE是)Clion. 1.1 安装Clion 官网下载就可以了,地址 https://www.jetbrains.com/clion/ 1.2 安装,配置mingW64 1.2.1:Clion需要我们安装Toolchain,我用的是mingW64(因为我用的是64位系统),附上

Cpp调用Python3,使用matplotlib画(二维)图----2. CPP编写

---恢复内容开始--- 直接上代码吧 # include <iostream># include <Python.h> int main(){ Py_SetPythonHome(L"D:\\ProgramFiles\\Python37"); Py_Initialize(); // 按照上一篇博客,到这一步应该是成功的 PyRun_SimpleString("import matplotlib.pyplot as plt"); /*调用pyt

java实现生成二维码

                                                     java实现生成二维码 二维码vs条形码 最大的区别就是:二维码具有容错功能,当二维码图片被遮挡一部分后,仍可以扫描出来.容错的原理是二维码在编码过程中进行了冗余,就像是123被编码成123123,这样只要扫描到一部分二维码图片,二维码内容还是可以被全部读到. 二维码容错率即是指二维码图标被遮挡多少后,仍可以被扫描出来的能力.容错率越高,则二维码图片能被遮挡的部分越多. 二维码容错率用字母表

二维码生成及读取方法

二维码的制作主要是引用第三方的程序集ThoughtWorks.QRCode.dll,调用QRCodeEncoder的Encode方法得到一个Bitmap图:相反,解析二维码就是用的Decode方法. 如下示例生成二维码的方法: /// <summary> /// 生成不带logo的二维码图片 /// </summary> /// <param name="data">要生成二维码的字符串</param> /// <returns&g

CSS+DIV布局(二)

布局的三种方式 一.常规流 以前没有学布局的时候,属于常规流 元素按照常规显示方式显示,块级元素垂直排列.行内元素就是水平排列 二.浮动 float:left; float:right: float:none; 典型应用两个div水平排列 **************************布局步骤************************************** 一.画效果图 二.使用DIV进行分割 三.使用CSS来控制DIV进行布局 遵循盒模型 四. 使用以上三步进行细分 ****

小米开源监控系统Open-Falcon安装使用笔记

前言 近期爆出Zabbix有严重bug,加上一直对zabbix的性能.UI不满.所以这次想钻研一下最近很火的open-falcon,源于小米公司的开源项目,赞一个. 一.官网介绍 监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题.监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择.当公司刚刚起步,业务规模较小,运维团队也刚刚建立的初期,选择一款开源的监控系统,是一个省时省力,效率最高的方案.之后,随着业务规模的持续快速