喵喵探索记

游戏意愿

主要能够让超级巨星的礼物,券等在游戏中体现,吸引玩家。让玩家感受到保护自己星系的乐趣,最后游戏本身收集和升级某些物体带给玩家乐趣

限时点

  • 有一定几率点出礼物
  • 点击之后能够获取星系积分
  • 在游戏中也有点点日常升级的物体。

游戏借鉴

喵星人的生态

玩法

  • 点击屏幕任意一处,盒子会奔出猫咪,和猫咪食物,头上的钱币也会随之增加
  • 主要是以收集各类猫咪图鉴
  • 点击升级猫咪盒子才会出现各自等级的猫咪
  • 也包含了各种诱饵,可以用诱饵来吸引猫咪

吸引点

  • 收集不同类型的猫咪成图鉴
  • 社交分享,排行对比

Tap Tycoon

玩法

  • 点击屏幕中上方会出现美元纸币,下面有小人蹦跶去捡,偶尔天空会出现小人送钱盒子
  • 用捡到的钱,盖生钱建筑物
  • 升级人物,建筑物,和各类道具

吸引点

  • 让人感觉到收集钱的乐趣,和盖成高楼的快感

tap hero

玩法

  • 通过点击屏幕左右两边,自己的角色会打击怪物防止怪物长时间站在自己的能量点而结束游戏
  • 打击怪物会出现金币,可以用来升级人物,塔,和召唤兽,技能
  • 可以通过观看广告,来赚钱和续命

吸引点

  • 生动的人物和怪物动画,画风比较好
  • 拥有打击怪物的快感 ,和保护能量塔的使命感
  • 命不是无限,也让人不会一下玩厌

自己游戏

游戏概念

  • 星球(被探索获取各种金币,道具)
  • 喵喵(探索的劳动力,不同喵喵每次能探索的实践不一致,能力有高低)喵喵拥有体力可以靠购买,或者时间恢复
  • 飞船(搭乘喵喵去其他星球探索的工具,可用金币升级),等级越高搭乘喵喵越多,在陌生星球探索就越久
  • 钻头 喵喵发掘地面获取宝藏的工具

主玩法

  • 玩法基本按照喵星大宝藏来
  • 人物题材可以汪星人,或者其他自定
  • 主线为探索其他星球,获取建造星球的材料

个人为主玩法

日常

  • 用飞船搭乘喵喵,飞出外星球进行挖掘探索(可获得进步,喵粮,积分,宝箱)
  • 对自己星球进行建设(基础建设可以加快体力增快时间,获得喵粮 等等)
  • 对各个可用物体进行升级

金币作用

  • 用于升级飞船,增加运载能力,和外观
  • 用于购买不同能力喵喵
  • 用于升级喵喵手中的钻头
  • 购买喵粮
  • 开锁下个星球

共同玩法

  • 定时共同探索自己明星星系主星球,可获得大量的喵粮,金币,特殊的钻头,喵喵
  • 为星系做出贡献
  • 获得明星相应礼物

卡卡西 草图

16011001

Enjoy!

node转载

转载自:node社区 https://cnodejs.org/topic/518b679763e9f8a5424406e9

node从他推出至今,充满赞美和饱受诟病的都是其单线程模型,所有的任务都在一个线程中完成(I/O等例外),优势的地方自然是免去了频繁切换线程的开销,以及减少资源互抢的问题等等,但是当nodejs面对cpu密集型模型的时候就力不从心了。尽管node拥有异步机制,可以把一些耗时算法丢入eventloop等待下个事件循环再做,但是因为其任然是单线程模型,所以终究会造成阻塞。

先解释一下两个名词,Fibers 和 Threads。
Fibers 又称纤程,可以理解为协同程序,类似py和lua都有这样的模型。使用Fibers可以避免对资源的互抢,减少cpu和内存的消耗,但是Fibers并不能够真正的并行执行,同一时刻只有一个Fibers在执行,如果在其中一个Fibers中执行过多的cpu操作或者写了个死循环,则整个主程序将卡死住。node中的异步事件循环模型就有点象这个。

Threads 又称线程,他可以在同一时刻并行的执行,他们共享主进程的内存,在其中某一时刻某一个threads锁死了,是不会影响主线程以及其他线程的执行。但是为了实现这个模型,我们不得不消耗更多的内存和cpu为线程切换的开销,同时也存在可能多个线程对同一内存单元进行读写而造成程序崩溃的问题。

很多让node支持多线程的方法是使用c/c++的addon来实现,在需要进行cpu密集型计算的地方,把js代码改写成c/c++代码,但是如果开发人员对c++不是很熟悉,一来开发效率会降低不少,二来也容易出bug,而且我们知道在addon中的c++代码除了编译出错外,是很难调试的,毕竟没有vs调试c++代码方便。

令人振奋的消息,我们为什么不让node也支持多线程模型呢?于是Jorge为我们开发出了一个让node支持多线程模型的模块:threads_a_gogo
github地址:https://github.com/xk/node-threads-a-gogo

有了threads-a-gogo(以下简称TAGG)这个模块之后,我们可以让node做更多的事情,我记得以前我看过一篇文章,说node只能应付i/o密集型场景,在cpu密集型场景将完败给apache,因为apache是为每一个请求起一条线程的,所以在处理cpu密集型任务时一个线程的高强度计算不会很大程度的影响其他线程,类似的还有php的fastcgi,这也是很多拿node和php进行比较时,php的拥护者们一直提出的理论。

我们先来做一个简单的测试,用我们suqian大大最喜欢的斐波那契数组来看一下,加入了多线程的node有多么的强悍:(测试机器为4CPU)
没有使用TAGG的正常情况,异步也帮不了我们应对cpu密集型任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    function fibo (n) {
return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
var n=8
function back(){
if(!--n) return console.timeEnd('no thread');
}
console.time('no thread');

process.nextTick(function(){
console.log(fibo (40));
back();
})
process.nextTick(function(){
console.log(fibo (40));
back();
})
process.nextTick(function(){
console.log(fibo (40));
back();
})
process.nextTick(function(){
console.log(fibo (40));
back();
})

process.nextTick(function(){
console.log(fibo (40));
back();
})

process.nextTick(function(){
console.log(fibo (40));
back();
})
process.nextTick(function(){
console.log(fibo (40));
back();
})
process.nextTick(function(){
console.log(fibo (40));
back();
})

我们模拟了8个异步的行为,测试用的node v0.8.16版本,所以 process.nextTick还是异步方法。最后我们输出结果为:

1
2
3
4
5
6
7
8
9
165580141
165580141
165580141
165580141
165580141
165580141
165580141
165580141
no thread: 23346ms

接下来我们使用TAGG模块来测试同样的执行8次斐波那契数组计算,看看成绩如何?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function fibo (n) {
return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
console.time('8 thread');
var numThreads= 8; //创建线程池,最大数为8
var threadPool= require('threads_a_gogo').createPool(numThreads).all.eval(fibo); //为线程池注册程序
var i=8;
var cb = function(err,data){ //注册线程执行完毕的回调函数
console.log(data);
if(!--i){
threadPool.destroy();
console.timeEnd('8 thread');
}
}
threadPool.any.eval('fibo(40)', cb); //开始向线程池中执行fibo(40)这个任务

threadPool.any.eval('fibo(40)', cb);

threadPool.any.eval('fibo(40)', cb);

threadPool.any.eval('fibo(40)', cb);

threadPool.any.eval('fibo(40)', cb);

threadPool.any.eval('fibo(40)', cb);

threadPool.any.eval('fibo(40)', cb);

threadPool.any.eval('fibo(40)', cb);
最重的结果:

165580141
165580141
165580141
165580141
165580141
165580141
165580141
165580141
8 thread: 9510ms

相比不使用多线程模型的node,使用了TAGG模块之后,我们在4CPU服务器上的测试结果要快上一倍还不止。
到这里我们看上去找到了一个比较完美的解决方案应对CPU密集型任务,但是可能有同学会说,我可以使用cluster来做相同的事情,下面我们来做一个使用cluster计算这些任务的情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var cluster = require('cluster');
var numCPUs = 8;
function fibo (n) {
return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
console.time('8 cluster');
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
var i = 8;
cluster.on('exit', function(worker, code, signal) {
if(!--i){
console.timeEnd('8 cluster');
process.exit(0);
}
});
} else {
console.log(fibo (40));
process.exit(0);
}

代码上的复杂程度比使用TAGG要高的多,而且如果是动态计算斐波那契数组的结果,编码将更加困难,需要在fork时挂上不同的参数,出错的几率也更大。同时还有更重要的一个事情,如果是创建一个http服务器,如果4个cluster都在计算fibo,那第5个请求node将无法处理,而是用TAGG则还是能够正常处理的,所以cluster并不能解决单线程模型的cpu密集计算带来的阻塞问题,我们看下测试结果:

1
2
3
4
5
6
7
8
9
165580141
165580141
165580141
165580141
165580141
165580141
165580141
165580141
8 cluster: 11925ms

TAGG模块还有其他更多的功能,比如事件触发,平滑退出,查看线程工作状态等等,总之TAGG模块给node注入了新的活力,让node一直饱受诟病的处理cpu密集任务问题得到了一个妥善的解决,就算你不擅长c++代码,也能够轻松编写出多线程的真正的非阻塞node程序了。

最后分享一篇干货文章,相当很精彩的一篇博客:
Fibers and Threads in node.js – what for?

tagg2,nodejs多线程模块,更好的api,支持nodejs原生模块,跨平台支持,windows,linux和mac

Behavior Designer加强版的playmaker

playmaker可以作为第三方集成到Behavior Designer中使用,

1
http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=8

Behavior Designer插件里,主要有四种概念节点,都称之为Task。包括:
16010501

1.Composites  组合节点,包括经典的:Sequence,Selector,Parallel

2.Decorator 装饰节点,顾名思义,就是为仅有的一个子节点额外添加一些功能,比如让子task一直运行直到其返回某个运行状态值,或者将task的返回值取反等等

3.Actions     行为节点,行为节点是真正做事的节点,其为叶节点。Behavior Designer插件中自带了不少Action节点,如果不够用,也可以编写自己的Action。一般来说都要编写自己的Action,除非用户是一个不懂脚本的美术或者策划,只想简单地控制一些物件的属性。

4.Conditinals 条件节点 ,用于判断某条件是否成立。目前看来,是Behavior Designer为了贯彻职责单一的原则,将判断专门作为一个节点独立处理,比如判断某目标是否在视野内,其实在攻击的Action里面也可以写,但是这样Action就不单一了,不利于视野判断处理的复用。一般条件节点出现在Sequence控制节点中,其后紧跟条件成立后的Action节点。

按照官方视频,实现简单的例子(http://www.opsive.com/assets/BehaviorDesigner/videos.php?id=3)

新建一个场景,一个箭头模型,和其他四个Sphere

下面代码是方向模型要移动目标的判定,继承于Conditional

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using UnityEngine;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;

public class Waitsignt : Conditional {
public float fieldofviewangle;
public string targettag;
public SharedTransform target;

private Transform[] possibletargets;

public override void OnAwake ()
{
var targets = GameObject.FindGameObjectsWithTag (targettag);
possibletargets = new Transform[targets.Length];
for (int i = 0; i < targets.Length; i++) {
possibletargets[i] = targets[i].transform;
}
}

public override TaskStatus OnUpdate ()
{
for (int i = 0; i < possibletargets.Length; ++i) {

if (withinsight (possibletargets [i], fieldofviewangle)) {

target.Value = possibletargets[i];
Debug.Log (target.Value );
return TaskStatus.Success;
}
}
return TaskStatus.Failure;
}

public bool withinsight (Transform targetTransform, float filedofViewAngle)
{
Vector3 dirction = targetTransform.position - transform.position;
return Vector3.Angle (dirction,transform.forward)<filedofViewAngle;
}
}

下面代码是方向模型要移动到目标的代码,继承于Action

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using UnityEngine;
using BehaviorDesigner.Runtime.Tasks;
using BehaviorDesigner.Runtime;

public class Eventtype : Action {
public float speed = 0;
public SharedTransform target;

public override TaskStatus OnUpdate ()
{

if (Vector3.SqrMagnitude (transform.position - target.Value.position) < 0.f) {
return TaskStatus.Success;
}
transform.position = Vector3.MoveTowards (transform.position,target.Value.position,speed*Time.deltaTime);
transform.LookAt (target.Value);


return TaskStatus.Running;
}

}

在unity打开Behavior Designer,在task中找到对应

16010501

场景中的四个Sphere tag设置成Target,在Behavior Designer Variables增加一个类型为transform名字为Target的全局值,会在代码中SharedTransform 中显示

Waitsignt 属性

16010501

Eventtype 属性

16010501

运行就可以看到官网例子效果了

在博客上面显示图片

由于编辑文章使用的是sublime无法直接插入图片,所以要在博客上面显示图片就需要找到图片位置显示
#如下

1
<!-- <img src="img/minren.jpg" alt="ナルト" height="50" width="50"> -->

#就会显示
ナルト

部署Hexo到GitHub上

本地的博客已经搭建好了,如何能让别人从网上访问到你的博客?只要将你的本地博客deploy到GitHub上就好。输入以下指令:

1
1.npm install hexo-deployer-git --save

然后打开博客目录的_config.yml文件,设置deploy的type为git,repository(repo)
为:
github.com/你的id/你的id.github.io.git(需要在type和repo后面加上一个空格再填写)。最后在你的Hexo目录中找到source文件夹,在其中新建一个文件CNAME,没有后缀名(建议使用Sublime Text新建),内容为你的域名(即XXXXXX.XXXXXX,不要加WWW之类的前缀),保存。输入以下指令:

1
2
1.hexo g
2.hexo deploy//可简写为 hexo d

在浏览器中输入你自己的域名就可以访问你自己的博客啦!