在 Stack Overflow 上回答了一个问题: How can I use an enum class in a boolean context?,记录下。
C++ 11 的 explicit operator bool()
可以让类类型的值使用在条件语句中,但无法对 enum
类型提供支持。
下面是我使用的一种方法:
1 | struct Error { |
使用:
1 | Error lastError(); |
在 Stack Overflow 上回答了一个问题: How can I use an enum class in a boolean context?,记录下。
C++ 11 的 explicit operator bool()
可以让类类型的值使用在条件语句中,但无法对 enum
类型提供支持。
下面是我使用的一种方法:
1 | struct Error { |
使用:
1 | Error lastError(); |
每个全局功能(需要和其他玩家交互的功能,例如聊天,公会,副本和场景等)都作为一个独立服务来做,方便扩展。这个服务可以是逻辑服务器内嵌的(如果没有与其他服务器交互的需求),也可以是一个单独的服务器,甚至一个服务器集群。
在分区游戏中,很多时候某些全局功能都作为一个功能模块内嵌到逻辑上去了,这样在某些需要服务器间玩家交互的功能时,就会很难做。例如: 如果聊天/好友服务内嵌到逻辑服务器上时,玩家如果需要与其他服务器上的好友(在跨服功能中加为好友的)通信时就会很麻烦。
大多可能有很大压力的全局功能都采用服务器集群的做法,集群中的成员:
实现:
gate
登入
一个或多个在线统计服务器:
多个逻辑服务器:
client 在 gate 完成登录认证,由 gate 向在线统计服务器发送请求选择逻辑服务器 [id: xxx, ref: yyy] , gate 向逻辑服务器发送玩家的登入请求 [player: zzz, ref: yyy] ,玩家进入游戏。
Lua coroutine 是协作式多任务的一种实现。coroutine 经常被 C/C++ 这类没用原生轻量级多任务实现的宿主语言通过异步方式实现 Lua 层的同步调用。
这种同步调用的流程:
val, err = synchronous_call_in_lua(...) -- function call in lua coroutine
==> coroutine.yield
==> C/C++ 发起异步请求会话
==| (time consumed)
==| C/C++ 异步会话完成(消息/回调)
<== coroutine.resume
val, err = ... -- <== return from function
do_someting(...)
这个流程很像阻塞式的系统调用:
n = read(fd, buf, len) // system call in userland
==> syscallenter(...) // in kernel mode
|=> sys_read(...) // in system call
|== kernel activity // asynchronous wait if data is not available yet
|==
<== syscallret(...) // return from syscall
n = ... // return from read in userland
async/await 是 C# 5 引入的,用来简化异步编程的设施,其本质是由编译器实施的 CPS 变换。
C# 5.0 introduces the async and await keywords. These keywords let you write asynchronous code that has the same structure and simplicity as synchronous code, as well as eliminating the “plumbing” of asynchronous programming. The await keyword simplifies the attaching of continuations.
即将如下代码:
C++11 的 auto 和 decltype 可以做 “返回值类型推断”。
我写了个两参数版本的 std::accumulate 。
1 | #include <numeric> |
配上点测试代码。
1 | #include <vector> |
EOF
游戏中各种怪物都会有自己的掉落物品列表。
最原始的掉落列表设计可能就是,掉落金钱,掉落经验,掉落物品1(id + 数量),掉落物品2 …… 。我觉得这样的掉落表设计不够灵活,不能很好的对不同种类(分类?)的物品做不同的处理。
一种更好的掉落表可能是这样的:掉落分类1,掉落 id 1,掉落数量1,掉落分类2,掉落 id 2,掉落数量2,……
这样程序可以对不同的掉落分类进行不同的处理,并且 id 的含义可以局限于分类之下,例如:可以将“分类1”视为虚拟物品,“分类2”视为普通物品,“分类3”视为某种特殊物品,等等。