如果你在 MT5 图表上玩过游戏,多半遇到过这个事:想按左键挪方块,图表却整个往右拖了一截。 原因不复杂。MT5 图表自己也用方向键拖动,面板又要用方向键控制方块。两边都想要键盘,系统不会替你分配。 这篇记一下我怎么处理的,中间踩过哪些坑。
最崩溃的,是把界面做漂亮做这个面板最让我崩溃的,不是某一个 bug,而是想把界面做漂亮这件事本身。 MT5 的机制决定了它很难做出好看的界面,付出的心血比想象中多得多。所以你在图表上见过的大多数 MT5 面板,界面都很丑,经常变形,有的拖不动,有的还特别卡。我想做一个不一样的,结果发现每一步都要硬碰硬。 下面说的键盘和重绘,很多都是在这种反复折腾里摸索出来的。 谁拿着键盘规则很简单:面板有焦点,图表就不接收键盘;面板没焦点,键盘还给图表。 焦点切换的核心逻辑大概是这样(节选,做了简化): void SetFocus(const bool f)
{
if(f == g_focus) return;
g_focus = f;
// 有焦点:图表不吃方向键
ChartSetInteger(0,
CHART_KEYBOARD_CONTROL, !f);
// 标题旁的小绿点
g_dot.SetOn(f);
// 失焦:暂停
if(!f && !g_auto_on) PauseGame(true);
}
标题旁那个小绿点是我加的。开发的时候很有用,一看就知道键盘现在在谁手里,不用猜。 程序启动和退出时,会把键盘控制强制设回打开。这样就算中途出了问题,图表也不会一直被锁着。 失焦就暂停点了图表别处、点了最小化、或者关了窗口,游戏就暂停。点回面板,接着玩。 这个设计是给盯盘的人用的。你随时可能去看一眼 K 线,方块要是还在往下掉,一分神就结束了。游戏得跟着你的注意力走,不能跟着时钟走。 按键只有"按下",没有"松开"这里有个限制要说明白。 MT5 面板只能收到按键按下的事件,收不到松开。系统的按键重复,是靠"按住就连续触发"实现的,程序没法判断两个键是不是同时按着。 所以你没法同时按左和旋转。在俄罗斯方块里这不算致命,但手感确实受影响。 解决办法是加了一个屏幕按键模式。打开设置后,棋盘下面出现五个圆按钮:左移、旋转、右移、软降、直落。用鼠标点,就不存在同时按键的问题。默认关着,有需要再开。
只在该重画的时候画很多面板的做法是定时刷新,不管有没有变化,整个界面每隔一会儿画一遍。写起来省事,但很浪费。 这里是给界面状态算一个签名,内容包括方块位置、分数、消行数、等级、暂存、连击这些。签名没变就不重画。方块不动、没人操作的时候,基本不占资源。 只有消行动画例外。那几帧要逐帧画,白光才能扫过去。 缩放会增加成本。界面越大,每次重画越慢。所以缩放到 1.75 时,我把彩带关掉了,只留"新纪录"标签。这时动画会比 1.25 略顿,使用说明里也建议用 1.25 或 1.00。 最后键盘、焦点、重绘、缩放,每一块单看都不难。麻烦的是它们互相牵着,动一处,另一处就可能出问题。 如果你也在做 MT5 面板,碰到过键盘冲突,可以在留言区说说你是怎么解决的。
下一篇:回到盯盘本身。在等信号的那十分钟里,一局小游戏能怎么用,以及怎么让它不耽误正事。 |