Elixir游戏服设计三】的更多相关文章

玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义. 我们新建一个 player_server_manager app吧, 使用 mix new player_server_manager --sup, 会给我们增加sup.然后在mix.exs里增加exactor的依赖如下: defp deps do [{:exactor, "~> 2.2"}] end 跑 mix deps.get,成功了依赖就准…
在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. 比如要重置某个任务,需要花费金币和背包里某个物品,那么大概的逻辑是这样的.在玩家进程里 def reset_task(task_id) do {need_gold, need_item} = Task.reset_need with :ok = gold_enough(need_gold) #使用玩家进程的数…
在Erlang游戏服设计总结http://www.cnblogs.com/rubyist/p/5530575.html里, 我提到我想要的游戏服设计方法,希望以应用做为基础构建块.最近我在学习elixir,它有很多 方便的语法糖以及很好用的库,能够解决我在游戏中开发中碰到的很多繁琐工作.因此我决定用它来做 练手,并期望下个项目中使用它. 游戏服的设计通常涉及如下东东: 协议制定 客户端接入 各种功能 我将以一个简单的打牌游戏来当做elixir练手,希望我能够坚持写完它.我只会想到哪写到哪. 该游…
抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我没法改变.在我开始这个系列时,我也常常陷入这些细节而不知所措,感觉不把所有设施搞完备没法写代码. 但其实,这些和游戏服的逻辑关系不大.游戏服的本质就玩家建模.玩法等,有了这些就已经足够跑逻辑,跑测试了: 至于其他则属于外围的.较独立的东西,属于可以稍后考虑的.至于进程注册查找机制,由于它是分布式系统…
有了玩家模型,我们试试让玩家进程跑起来. 需要搞个PlayerSupervisor来负责启动和监控玩家进程. defmodule PlayerSupervisor do use Supervisor def start_link(_opts) do Supervisor.start_link(__MODULE__, :ok, name: __MODULE__) end def init(:ok) do Supervisor.init([PlayerServer], strategy: :simp…
写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. 游戏大体分为如下服务器 . 网关服务器(必须) . 游戏服务器(必须) . 后台管理服务器(一般必须) . 数据存储服务器(必须) . 支付服务器(安桌或者第三方回调的话,必须) Elixir umbrella 项目目录结构可大概如下 . 游戏数据模型(包括简单的获取更新逻辑) . 通讯协议 ht…
上回介绍了玩法,现在编写了玩法的简单建模. 做到现在感觉目前还没有使用umbrella的必要(也许以后会发现必要吧),model 应用完全可以合并到game_server. 代码还在https://github.com/rubyist1982/simple 上. model 应用新增 simple_poker.ex , 代码不多,做了点简单注释,可以贴下 defmodule SimplePoker do @cards for i <- 1..4, j<- 1..13, do: {i, j} @…
上回说用Registry 做本地注册(跨服可以用syn,只是稍微麻烦点,需要模拟global注册机制,写个封装模块). 修改game_server 项目的mix.exs, 增加应用启动 def application do [ extra_applications: [:logger], mod: {GameServer, []} ] end 修改game_server.ex 实现,如下应用的监控树监管PlayerRegistry进程和PlayerSupervisor.这里可以考虑 :one_f…
上章说到我们要引入syn https://github.com/ostinelli/syn/ 看过文档,它并没有直接提供{via, Module, Name} 相关的方法.我们需要封装一下. Name暂时可以用id,如果有需要再调整 以后有回调需求的话,刚好也可以做在那个模块里. 在player_server_manager项目里增加{:syn, "1.4.0"} 运行命令获取依赖 修改application 方法,增加依赖 def application do [applicatio…
搞一个例子,而没有实际的目标,做起来真是烦人.几次三番都想放弃. 后来想想,即使最后完成不了完整的服务器,把需要的知识点搞搞,摸熟悉也是好的. 这里没有完整的项目目录,主要是对需要的指点进行整理.要完整写个教材的话,话费我太多时间,恐怕我继续不下去. 先搞个建模吧.玩家数据目前如下 defmodule Player do @behavior Access defdelegate [fetch(t, key), get_and_update(t, key, list)], to: Map defs…