TWaver初学实战——2D机房之机柜篇

前一段参与了一个2D机房的项目,但是这种“命题作文”总感觉憋屈,那就回咱这主场再发挥发挥!

第一篇,咱就从机柜下手。

……机柜似乎有点太简单了,因为

机柜就是个大灰框

    drawBorder: function(ctx) {
        ctx.fillStyle = ‘gray‘;
        ctx.fillRect(
            this._rackX,
            this._rackY,
            this._rackOuterWidth,
            this._rackOuterHeight);
        ctx.clearRect(
            this._rackX + this._rackGapLR + this._rackInnerGapLR,
            this._rackY + this._rackGapTB + this._rackInnerGapTB,
            this._rackInnerWidth,
            this._rackInnerHeight);
    },

当然我不可能到此为止啊,起码给大灰框加点过渡色吧:

        this._gradient = this._ctx.createLinearGradient(
            this._rackX,
            this._rackY,
            this._rackX + this._rackOuterWidth,
            this._rackY);
        this._gradient.addColorStop(0, ‘#888888‘);
        this._gradient.addColorStop(0.05, ‘#555555‘);
        this._gradient.addColorStop(0.2, ‘#999999‘);
        this._gradient.addColorStop(0.5, ‘#333333‘);
        this._gradient.addColorStop(0.8, ‘#999999‘);
        this._gradient.addColorStop(0.95, ‘#555555‘);
        this._gradient.addColorStop(1, ‘#888888‘);

机柜要有U位

    drawUspace: function(ctx) {
        ctx.lineWidth = 0.5;
        var uCount = this._uCount;
        while(uCount--) {
            ctx.strokeStyle = this._lineColor;
            ctx.lineWidth = 1;
            ctx.beginPath();
            ctx.moveTo(
                this._rackX + this._rackGapLR,
                this._rackY + this._rackGapTB + this._uHeight * uCount)
            ctx.lineTo(
                this._rackX + this._rackGapLR + this._uWidth,
                this._rackY + this._rackGapTB + this._uHeight * uCount)
            ctx.stroke();
        }
        ctx.lineWidth = this._lineWidth;
        ctx.strokeStyle = this._lineColor;
        ctx.strokeRect(
            this._rackX + this._rackGapLR,
            this._rackY + this._rackGapTB,
            this._uWidth,
            this._uHeight * this._uCount);
    },

U位要有编号

        if(this._element._showUscale) {
            ctx.textAlign = ‘right‘;
            ctx.fillText(
                this._uCount - uCount,
                this._rackX - 2,
                this._rackY + this._rackGapTB + this._uHeight * uCount + this._uHeight / 2);
            ctx.textAlign = ‘left‘;
            ctx.fillText(
                this._uCount - uCount,
                this._rackX + this._rackOuterWidth + 2,
                this._rackY + this._rackGapTB + this._uHeight * uCount + this._uHeight / 2);

        }

再加点小细节

    drawGarnish: function(ctx) {
        var signCount = this._uCount * 3;
        while(signCount--) {
            ctx.fillStyle = ‘#333333‘;
            ctx.fillRect(
                this._rackX + this._rackGapLR - this._uHeight / 2,
                this._rackY + this._rackGapTB + 0.5 + this._uHeight / 3 * signCount,
                this._uHeight / 3 - 1,
                this._uHeight / 3 - 1);
            ctx.fillRect(
                this._rackX + this._rackGapLR + this._uWidth + this._uHeight / 6 + 1,
                this._rackY + this._rackGapTB + 0.5 + this._uHeight / 3 * signCount,
                this._uHeight / 3 - 1,
                this._uHeight / 3 - 1);
            ctx.beginPath();
            ctx.strokeStyle = ‘#FFFFFF‘;
            ctx.lineWidth = 1;
            ctx.moveTo(
                this._rackX + this._rackGapLR + 2,
                this._rackY + this._rackGapTB + ((this._uHeight / 3 - 1) / 2 + 0.5) + this._uHeight / 3 * signCount)
            ctx.lineTo(
                this._rackX + this._rackGapLR + this._uWidth - 2,
                this._rackY + this._rackGapTB + ((this._uHeight / 3 - 1) / 2 + 0.5) + this._uHeight / 3 * signCount)
            ctx.stroke();
        }
    },

交互式细节

添加了细节虽然逼真了一些,但也会多消耗资源,还显得有点乱,尤其是多个机柜同时展示的时候。

能不能只有我关注的机柜才显示细节,而不关注的就清清爽爽的呢?当然可以,比如我们就把鼠标移入作为“关注”,鼠标移出就“不关注”:

    this.getView().addEventListener(‘mousemove‘, function(e) {
        var elements = self.getElementsAt(e) && self.getElementsAt(e)._as;
        var currentRack = getCurrentRack();
        if(currentRack) {
            if(currentRack != self._currentRack) {
                self._currentRack && self._currentRack.onMouseLeave(e);
                currentRack.onMouseEnter(e);
                self._currentRack = currentRack;
            }
        } else if (self._currentRack) {
            self._currentRack.onMouseLeave(e);
            self._currentRack = null;
        }
        function getCurrentRack() {
            if(elements && elements.length) {
                for(var i = 0; i < elements.length; i++) {
                    elements[i].onMouseMove(e);
                    if(elements[i] instanceof RackBin) {
                        return elements[i];
                    }
                }
                return null;
            }
            return null;
        }
    }, this);
    onMouseEnter: function(e) {
        this._showUscale = true;
        this._showGarnish = true;
        this._network.invalidateElementUIs();
    },
    onMouseLeave: function(e) {
        this._showUscale = false;
        this._showGarnish = false;
        this._network.invalidateElementUIs();
    },

交互式U位

如果鼠标在机柜上移动,移到不同的U位就突出显示一下当前U位,那必然是极好的。说干就干:

    onMouseMove: function(e) {
        var eLoc = this._network.zoomManager._getLogicalPoint(e);
        this.setFocusUnum(eLoc);
    },
    setFocusUnum: function(x, y) {
        if(x && (x.x || x.y || x.x == 0 || x.y == 0)) {
            y = x.y;
            x = x.x;
        }
        this._UI._focusUnum = this.getUnum(x, y);
        this._UI.checkRackUAttachment();
    },
    checkAttachments: function() {
        RackBinUI.superClass.checkAttachments.call(this);
        this.checkRackUAttachment();
    },
    checkRackUAttachment: function() {
        if(this._focusUnum) {
            var data = this._rackUdatas[this._focusUnum];
            if(data) {
                if(this._rackUAttachment) {
                    if(this._rackUAttachment._id != data.id) {
                        this._rackUAttachment.setData(data);
                        this._network.invalidateElementUI(this._element, true);
                    }
                } else {
                    this._rackUAttachment = new RackUAttachment(this, true, data);
                    this.addAttachment(this._rackUAttachment);
                    this._network.invalidateElementUI(this._element, true);
                }
            }
        } else {
            if(this._rackUAttachment) {
                this.removeAttachment(this._rackUAttachment, true);
                this._rackUAttachment = null;
            }
        }
    }

这里的“当前U位”使用了自定义附件的方式,至于为什么用这种方式……大概就是我会的太多了吧^-^

对了,我之前提到过什么来着——

多机柜展示

    arrangeRacks: function() {
        var count = this._racks.length;
        if(count) {
            var spacing = this._rackWidth + 40;
            var viewRect = this.getViewRect();
            var startX = viewRect.x + viewRect.width / 2 - this._rackWidth / 2;
            if(count > 1) {
                startX -= spacing * (count - 1) / 2;
            }
            if(startX < viewRect.x) {
                startX = viewRect.x + 20;
            }
            for(var i = 0; i < this._racks.length; i++) {
                var x = startX + spacing * i;
                var y = viewRect.y + viewRect.height / 2 + this._rackHeight / 2 - this._racks[i].getHeight();
                if(y < viewRect.y) {
                    y = viewRect.y + 10;
                }
                this._racks[i].setLocation(x, y);
            }
        }
    },

这样的机柜,可还入您的法眼?

时间: 2024-10-17 16:58:31

TWaver初学实战——2D机房之机柜篇的相关文章

TWaver初学实战——炫动2D机房之设备篇

有了机柜,下面就该上设备了.不过,这似乎也太简单,因为 设备面板就是个小灰块 --呃,还是再分几个区吧,要不实在太单调: drawPane: function(ctx) { ctx.fillStyle = this._borderColor; ctx.fillRect( this._panelData.x, this._panelData.y, this._panelData.w, this._panelData.h); ctx.fillStyle = this._centerPanelColo

TWaver初学实战——制作交互式地铁图

每天坐地铁,经常看地铁图,有一天突然想到,地铁图不也是一种拓扑结果吗?TWaver到底能与地铁图擦出怎样的火花呢? 想到就干,先到网上找幅参考图.各种风格的地铁图还挺多,甚至有大学生自主设计制作,受到地铁相关人士的认可和赞扬.不过看到他花了3周时间,我就比较同情他了,如果学会了TWaver,我保他连3天都不用就可以完成,而且还是纯矢量.可交互.有动态效果.无失真缩放的拓扑图. 我们就以上面这幅地铁图为模版来进行制作. 一.数据整理 俗话说兵马未动粮草先行,没有数据再好的创意也白搭. 数据格式,自

TWaver初学实战——如何在EasyUI中插入TWaver(续)

上次文章虽然简单易懂,但很有些小伙伴不满意:你这TWaver和EasyUI结合,只不过生硬地把TWaver图形插进去了,数据和人家EasyUI没一毛钱关系.嘿嘿,不就是想发生关系嘛,没问题啊!咱就还用原来的EasyUI的代码,看看怎么把它表格中的数据用拓扑的方式显示出来. 在本机发布web程序 这次再干咱要有新路,不能再把数据写到代码里了,乱乱乎乎的很不专业,必须原汁原味就用json文件.别小看这一改变,需要在本机搭建服务器,要是原来没接触还真得忙活一阵子.不过这些工作可不白做,那是玩网页开发的

Spring Boot 揭秘与实战(四) 配置文件篇 - 有哪些很棒的特性

文章目录 1. 使用属性文件2. YAML文件 1.1. 自定义属性 1.2. 参数引用 1.3. 随机数属性 1.4. application-{profile}.properties参数加载 3. 源代码 Spring 框架本身提供了多种的方式来管理配置属性文件.Spring 3.1 之前可以使用 PropertyPlaceholderConfigurer.Spring 3.1 引入了新的环境(Environment)和概要信息(Profile)API,是一种更加灵活的处理不同环境和配置文件

Spring Boot 揭秘与实战(五) 服务器篇 - Tomcat 代码配置

Spring Boot 内嵌的 Tomcat 服务器默认运行在 8080 端口.如果,我们需要修改Tomcat的端口,我们可以在 src/main/resources/application.properties 中配置Tomcat信息. server.port=8089 现在,你可以重新运行上面的例子,看下是不是 Tomcat 的端口变成 8089 了. 如果想直接通过代码配置 Tomcat, 可以直接定义 TomcatEmbeddedServletContainerFactory. 现在,我

机房合作——感悟篇

机房合作已经做了很长时间了,但也就是这几天正式进入状态了.看着我们的合作越来越默契,心里别提多高兴了.丹丹渐渐的能看懂我的图了,建建也不会自己加方法了,我画的图也不会丢三落四的.小伙伴们越来越有默契了,我的一点感受,与大家分享. 适当"间作套种",千万别搁置 从7月开始准备专业课考试之前,我就着手画图了.当时的感觉跟前两次画图没什么差别,一直心想着能不能偷懒少画点图,省个事儿.所以一直不慌不忙地一边看牛腩一边画图,之后就是准备专业课考试--考试--放假,画图基本上就是搁置了.等到放假回

Spring Boot 揭秘与实战(五) 服务器篇 - 其他内嵌服务器 发表于 2017-01-03 | Spring框架 | Spri

文章目录 1. Jetty 的切换 2. Undertow的使用 Spring Boot 可选择内嵌 Tomcat.Jetty 和 Undertow,因此我们不需要以 war 包形式部署项目.<Spring Boot 揭秘与实战(五) 服务器篇 - 内嵌的服务器 Tomcat剖析>一文,已经讲解了内嵌的服务器 Tomcat,那么,这篇文章大概讲解下另外两个内嵌的服务器 Jetty 和 Undertow. Jetty 的切换 Spring Boot 默认使用的是 Tomcat 作为内嵌的服务器,

时光煮雨 Unity3D实现2D人物移动-总结篇

系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现 时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率 背景 最近研究Unity3d,2d寻路的实现.所以又一次涉及到了角色坐标位移的问

机房重构-完结篇

机房重构已经结束了,自从软考开始,光顾着准备软考和三级网络等级考试就没来得急总结.软考一开始,突然觉得时间好少,时间过得好快.这节奏,有点飕飕的. ---------------------技术总结: 熟悉了对Visual Studio这一开发环境的使用,深入了解了VB.net语言基础有了一定的认识并且学会使用.这一次使用三层架构,利用分分层的思想,深入理解了各层的职责.代码规范,这一次再敲代码的时候先学了一下代码规范,也把头文件注释设计好,让自己的代码漂亮一点. 最终的要思想还是面向对象,根据