2017年9月

c# webapi 设置输出的class属性

平时做项目的时候大多数时候喜欢用webapi+html静态页面开发
这样的话开发移动端会比较方便

webapi在直接输出类的时候,会序列化所有属性,
底层是通过Newtonsoft.Json来实现的
于是就可以通过给class设置标签来让webapi不序列化某个属性.

[JsonObject(MemberSerialization.OptOut)]
public class LoadModel
{
    [JsonIgnore]
    public HttpPostedFileBase file { get; set; }

    [JsonProperty]
    public string base64 { get; set; }

    [JsonProperty]
    public string type { get; set; }

    public string title { get; set; }
}

当class设置标签为[JsonObject(MemberSerialization.OptOut)]时,属性标签为[JsonIgnore]的不会被序列化

当class设置标签为[JsonObject(MemberSerialization.OptIn)]时,属性标签为[JsonProperty]的会被序列化

一般我喜欢用[JsonObject(MemberSerialization.OptOut)],因为基本上都是要输出的嘛,个别会不输出而已..

是男人就坚持20秒--飞机游戏制作

受朋友之托,做一个小游戏--是男人就坚持20秒.

一个很经典的exe小程序,想放到网页上做个小游戏互动.
链接如下:
是男人就撑过20秒

大致看了一下,应该也没什么难度,撸起袖子直接干了.

框架当然是用自己最熟悉的框架:createjs,
adobe公司的开源canvas框架还是不错的.

花了3 4天时间,基本功能都完成了,给个demo链接,大家可以去玩一下.
是男人就坚持20秒demo游戏链接
顺便再给几张游戏截图:
开始游戏界面

游戏界面

飞机爆炸界面

中间碰到两个小算法.
第1个是碰撞检测
这个自己写太复杂了,我用了createjs的第三方开源检测库ndgmr.Collision.sprite.js
这里提一下我在用的时候发现他会报错(官方自己的demo),虽然不影响使用,但是看到控制栏有红字就是不舒服...
这里提一下报错的主要原因是calculateIntersection里面比较两个rect,得到的宽度或者高度为0,导致后面的canvas画布为0导致的.
第2个是子弹飞行角度
这个就比较简单了,就是已知两点,求两点的角度.
本以为这个网上解决方案会有很多,结果找了一圈不知道是自己运气差还是怎么,竟然没找到!
想了想正好练练手,再重温一下三角函数...
下面是自己写的计算角度,可能有更好的算法自己没想到^_^

 function getAngle(px, py, mx, my) {
    var x = Math.abs(px - mx);
    var y = Math.abs(py - my);
    var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
    if(z == 0) return 0;
    var cos = y / z;
    var radina = Math.acos(cos); //用反三角函数求弧度

    var angle = 180 * radina / Math.PI; //将弧度转换成角度
    //因为算出来的值是[0,90),需要转成[0,360)
    if(mx >= px) {
        if(my >= py) {
            angle = 90 - angle;
        } else {
            angle = 270 + angle;
        }
    } else {
        if(my >= py) {
            angle = 90 + angle;
        } else {
            angle = 270 - angle;
        }
    }
    return angle;

}

这里的缺陷就是先算出了角度是[0,90),然后再转成了[0,360),个人感觉应该是有办法直接算成[0,360)的...
如果有人知道,请千万告诉我一声....

好了,睡觉去了...Zzz

canvas如何画出像素为1的线条

先来看一下平时我们html页面上的标签实现1px像素是怎么样的:

<p style="border-bottom: 1px solid #000000;"></p>

1px像素的线条

现在我们放一个canvas标签,画1像素宽的线条看一下:

<body>
    <p style="border-bottom: 1px solid #000000;"></p>
    <canvas id='canvas' width="300" height="100"></canvas>
</body>
<script>
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext('2d');
    ctx.lineWidth = 1;

    writeLine(0, 10, 300, 10);

    function writeLine(x1, y1, x2, y2) {
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);

        ctx.stroke();
    }
</script>

canvas画出来的线条

真的好诡异啊,竟然不是1像素的宽度,颜色也有问题....

然后就想着是不是canvas不支持1px像素?再试着画一个宽度为1像素的矩形

ctx.fillRect(0, 20, 300, 1);

画一个宽度为1像素的矩形

发现又好了....太诡异了= =

不停的查资料,后来不断尝试中想到原因:
canvas画线时,是以你的坐标点为中心,左右扩散,来画线的,也就是说他实际是画了一个0,9.5;0,10.5;300,10.5;300,9.5这样一个矩形

这个情况下,因为反锯齿的处理,画布自动帮你填充为了0,9;0,11;300,11;300,9
所以看起来就像是宽了,并且颜色变淡了...

知道原因了,那么来验证一下:

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext('2d');
    ctx.lineWidth = 1;

    writeLine(0, 10, 300, 10);

    ctx.fillRect(0, 20, 300, 1);

    writeLine(0, 30.5, 300, 30.5);

    function writeLine(x1, y1, x2, y2) {
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);

        ctx.stroke();
    }

线条4

恩,总算是正常了...那么以后,画奇数宽度的线条时就需要注意了:要不就是选点偏移0.5,要不就是整个画布偏移0.5
注意画水平线是x轴偏移,画垂直的时候就是y轴偏移了,保险起见的话,可以两个都偏移:

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext('2d');
    ctx.lineWidth = 1;
    ctx.translate(0.5, 0.5);

    writeLine(0, 10, 300, 10);

    function writeLine(x1, y1, x2, y2) {
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);

        ctx.stroke();
    }

在线五子棋对战制作

看到野狗提供的实时通信引擎,心血来潮做了一个五子棋在线对战游戏.
第一次做实时在线游戏,好多细节没有处理好...
不过总算是做完了,虽然还有好多bug懒得去处理...
样式什么的也不不想去处理了...~~(>_<)~~

demo链接:在线五子棋对战

ps:在浏览器里打开两个上面的网址,就可以自己邀战自己开始玩了.

给个游戏截图:
五子棋在线