上回说用Registry 做本地注册(跨服可以用syn,只是稍微麻烦点,需要模拟global注册机制,写个封装模块). 修改game_server 项目的mix.exs, 增加应用启动 def application do [ extra_applications: [:logger], mod: {GameServer, []} ] end 修改game_server.ex 实现,如下应用的监控树监管PlayerRegistry进程和PlayerSupervisor.这里可以考虑 :one_f…
有了玩家模型,我们试试让玩家进程跑起来. 需要搞个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…
抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我没法改变.在我开始这个系列时,我也常常陷入这些细节而不知所措,感觉不把所有设施搞完备没法写代码. 但其实,这些和游戏服的逻辑关系不大.游戏服的本质就玩家建模.玩法等,有了这些就已经足够跑逻辑,跑测试了: 至于其他则属于外围的.较独立的东西,属于可以稍后考虑的.至于进程注册查找机制,由于它是分布式系统…
删除model.ex 创建玩家模型 player.ex, 简单化,只有唯一标识,昵称,金币,够用了. 选择 map 代表数据,是为了扩展数据结构,方便增加功能.struct也是可以的. add_num 和 cost_num 存粹是为了简化代码 一系列的get/set 是为了操作玩家数据用的(也可以减少代码吧) defmodule Player do def init do %{ id: 0, # 唯一标识 name: "", # 昵称 gold: 0, # 金币 } end def g…
上回介绍了玩法,现在编写了玩法的简单建模. 做到现在感觉目前还没有使用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} @…
反正是写到哪算哪. 创建umbrella项目 mix new simple_game --umbrella 创建model项目 cd simple_game\apps mix new model 创建 game_server 项目 同样在apps目录下 mix new game_server 最后项目结构如下 我尝试把它发布出去,结果 https://github.com/rubyist1982/simple.git 和我预期的不一样,我初始应该以项目做仓库好点.…
在<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练手,希望我能够坚持写完它.我只会想到哪写到哪. 该游…
玩家进程用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了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. 游戏大体分为如下服务器 . 网关服务器(必须) . 游戏服务器(必须) . 后台管理服务器(一般必须) . 数据存储服务器(必须) . 支付服务器(安桌或者第三方回调的话,必须) Elixir umbrella 项目目录结构可大概如下 . 游戏数据模型(包括简单的获取更新逻辑) . 通讯协议 ht…