【在 MT5 图表上玩游戏,按左键图表却被拖走了?】这篇讲面板怎么处理键盘

| 发表于 1 小时前 | 显示全部楼层 |复制链接

如果你在 MT5 图表上玩过游戏,多半遇到过这个事:想按左键挪方块,图表却整个往右拖了一截。

原因不复杂。MT5 图表自己也用方向键拖动,面板又要用方向键控制方块。两边都想要键盘,系统不会替你分配。

这篇记一下我怎么处理的,中间踩过哪些坑。

article2-body-1.png

最崩溃的,是把界面做漂亮

做这个面板最让我崩溃的,不是某一个 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 面板只能收到按键按下的事件,收不到松开。系统的按键重复,是靠"按住就连续触发"实现的,程序没法判断两个键是不是同时按着。

所以你没法同时按左和旋转。在俄罗斯方块里这不算致命,但手感确实受影响。

解决办法是加了一个屏幕按键模式。打开设置后,棋盘下面出现五个圆按钮:左移、旋转、右移、软降、直落。用鼠标点,就不存在同时按键的问题。默认关着,有需要再开。

article2-body-2.png

只在该重画的时候画

很多面板的做法是定时刷新,不管有没有变化,整个界面每隔一会儿画一遍。写起来省事,但很浪费。

这里是给界面状态算一个签名,内容包括方块位置、分数、消行数、等级、暂存、连击这些。签名没变就不重画。方块不动、没人操作的时候,基本不占资源。

只有消行动画例外。那几帧要逐帧画,白光才能扫过去。

缩放会增加成本。界面越大,每次重画越慢。所以缩放到 1.75 时,我把彩带关掉了,只留"新纪录"标签。这时动画会比 1.25 略顿,使用说明里也建议用 1.25 或 1.00。

最后

键盘、焦点、重绘、缩放,每一块单看都不难。麻烦的是它们互相牵着,动一处,另一处就可能出问题。

如果你也在做 MT5 面板,碰到过键盘冲突,可以在留言区说说你是怎么解决的。


下一篇:回到盯盘本身。在等信号的那十分钟里,一局小游戏能怎么用,以及怎么让它不耽误正事。

最近访问 头像模式
举报

评论 使用道具

精彩评论1

yuchenkeji
DD
 楼主 | 发表于 半小时前 | 显示全部楼层
见第一篇可免费下载
https://www.eahub.cn/thread-227963-1-1.html
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

Fast跟单EA