mirror of
https://github.com/Qsgs-Fans/FreeKill.git
synced 2024-11-15 19:22:25 +08:00
fc8be0ad40
控制他人/一控多相关
105 lines
3.3 KiB
ReStructuredText
105 lines
3.3 KiB
ReStructuredText
神貂蝉
|
||
======
|
||
|
||
“本回合改为由你操控。” ——神貂蝉
|
||
|
||
封装
|
||
----
|
||
|
||
先画好靶子!想一下怎么定义函数才好!
|
||
|
||
- 你来操控别的角色
|
||
- 别的角色重新操控自己
|
||
- 你同时控制自己和别人
|
||
- 询问无懈
|
||
- 老朱然
|
||
|
||
考虑中:。...
|
||
|
||
.. code:: lua
|
||
|
||
ServerPlayer:control(ServerPlayer)
|
||
ServerPlayer:observe(ServerPlayer)
|
||
|
||
两函数差不多了吧。。。
|
||
|
||
这样一来,神貂蝉就是让被控者observe,然后自己去control;回合结束后,被控者开始control。
|
||
|
||
observe
|
||
-------
|
||
|
||
对机器人:无视。
|
||
|
||
对人:发送observe消息。但这个人依然处于room.players中,无论是Lua还是cpp。
|
||
|
||
只是这个人对应的cpp层面的ServerPlayer进旁观了而已。
|
||
|
||
control
|
||
-------
|
||
|
||
控制者:发送control消息。控制者多了个可以控制的角色,仅此而已。
|
||
|
||
如果已有控制者:发送dontcontrol消息,不准打架 而这个消息最终还是走到observe消息处理
|
||
|
||
客户端实现
|
||
----------
|
||
|
||
想好了怎么发消息那消息该怎么处理?
|
||
|
||
首先dontcontrol 把可控制者-1 没有可控了就进旁观呗
|
||
|
||
然后是control加一个受控者 要是旁观直接切视角
|
||
|
||
切视角
|
||
------
|
||
|
||
先给个dashboard向下滑出并淡出消失的动画
|
||
|
||
Lua 改变 Self
|
||
|
||
根据服务端的信息填充这个新Self的信息
|
||
|
||
dashboard手牌清空
|
||
|
||
dashboard填入新Self的新手牌
|
||
|
||
dashboard重新出现
|
||
|
||
根据新Self重新安排所有photo
|
||
|
||
由于不影响烧条 这个动画效果越快越好
|
||
|
||
一控多时同时询问
|
||
----------------
|
||
|
||
怎么办呢?问题的核心在于分属不同玩家的消息,却发送给了同一个人。这个可以通过在req/noti中堆个玩家id的参数搞定。但是然后呢?
|
||
|
||
一个很严重的问题就是目前对所有req的处理函数都是直接操作roomscene的元素的。实际上,这些元素对于每个被自己控制的player,都要单独有才行。
|
||
|
||
一个想法就是多创建room页面,模拟多开。但这个是做不到的,因为很多东西都依赖Self,而Self只有一个。所以就得在单页中解决这些问题。解决方案就是把那些跟req有关的分出去几个。
|
||
|
||
换句话说,捏几个元素出来表示各个player的状态,可能保存在Lua里面。当qml想要切换视角时,从Lua读取信息。
|
||
|
||
当某个人收到req时候,就切视角到他那里。所有人烧条打开。
|
||
|
||
或者也可以让req处理函数返回一个函数,切视角时执行之就行了。
|
||
|
||
也就是说 Room中元素还是那几个 只是随着视角改变他们的值也变 而改变视角会调用函数
|
||
|
||
其实可以考虑调用从Lua传来的cmdType和jsonData,然后就直接开函数了,更舒适。
|
||
|
||
延迟执行callback
|
||
-----------------
|
||
|
||
考虑在notifyUI的时候,如果当前视角对应的玩家id和这个消息的id不同,那么就暂存到一个消息队列中,等到切视角时候就都拿出来。如果某时候,就把队列清空。
|
||
|
||
主要还是只过滤request吧。doNotify不需要过滤,换个视角也知道发生啥了。
|
||
|
||
也没必要维护队列。就一个单独的值保存最近的command和data即可。
|
||
|
||
当视角发生切换时,如果这个人有cmd和data,就执行相应的cb。
|
||
|
||
当向服务器发回答复后,cmd和data就没有了。
|
||
|
||
notify时只对看着这名角色主视角的玩家发送。
|