背景

自从发现红警除了 ddraw 补丁可以在最新的系统里玩后,就开始怀旧了。但是由于手残,遇到别人抢地盘基本上直接崩了。偶然有一次发现像 08 这样的高手点 30 个坦克使用工具的。那么,我开局用工具造兵营、碉堡,是不是显得不那么可耻了呢?

说干就干,我有支持 lua 脚本的溪流 WayKey,理论上都能做到。

实现一次性点 30 个坦克

这个场景没有手速要求,只是为了不麻烦,所以我们实现地简单些:要求先把鼠标放好位置,然后设定快捷键,直接给点击 N 次。

实现很简单,30 次这个次数作为参数传进来,主函数里就是 PressMouseButton(Mouse.LBUTTON)、ReleaseMouseButton(Mouse.LBUTTON) 来 30 下:

Extension =
{
Application = "xlWarKey",
Version = "3.0",
NameSpace = "http://www.streamlet.org/Software/xlWarKey/", ExtensionName = "鼠标连点",
Author = "溪流",
Description = "该脚本可以用来在红警2中一次性造多个单位。", Configuration =
{
Count =
{
Type = "number",
Desc = "连点次数"
}
}, Entrance = function (id) local config = Extension.Configuration;
--config.Count 就是用户在软件界面上设置的连点次数 for i = 1, config.Count, 1
do
PressMouseButton(Mouse.LBUTTON);
ReleaseMouseButton(Mouse.LBUTTON);
end return true;
end
};

(脚本文档见 https://www.streamlet.org/software/xlwarkey/)

保存为 .lua 文件放到溪流 WarKey 目录下的 Scripts 下,退出溪流 WarKey 重新打开,即可看到脚本生效。

因为溪流 WarKey 本是为魔兽写的,因此默认会勾上“仅在魔兽争霸中应用”,要去掉它。

然后改键动作选择“鼠标连点”脚本,并配置参数 Count 为 30 即可:

实现快速造兵营、碉堡

难点主要是在定位按钮的位置。

我们在不同分辨率下截几张图,发现一个规律:不管分辨率如何,面板宽度总是固定为 168 像素,面板内部的各个组件大小也是固定的。这就好办了。经过测量,得出如下结论:

  • 顶部到按钮区域高度:227
  • 面板宽度 168,左右空隙 20、22,按钮区域宽度126
  • 按钮大小 63x50

所以,对于第 r 行、第 c 列(r、c 均从 0 开始)的按钮,其中心坐标的计算公式为

x = WIDTH - 168 + 20 + 63 * c + 63/2
y = 227 + r * 50 + 50/2

点击面板按钮可以组织成一个函数:

ClickPanel = function(row, column, count)
if count == nil then
count = 1
end
local width, height = GetClientSize()
local target_x = width - 168 + 20 + 63 * column + 32
local target_y = 227 + row * 50 + 25
MoveMouse(target_x, target_y)
for i = 1, count, 1
do
ClickMouse()
Delay(10)
end
end

有了 ClickPanel,我们可以写出造任何东西的代码了。完整脚本如下:

Extension =
{
Application = "xlWarKey",
Version = "3.0",
NameSpace = "http://www.streamlet.org/Software/xlWarKey/", ExtensionName = "红警开局快速操作",
Author = "溪流",
Description = "帮助红警手残党不要一开始就被抢死,提高游戏体验", Configuration =
{
Type =
{
Type = "number",
Desc = "1=造电厂,2=造兵营,3=造矿场碉堡1工程师,4=造碉堡,5=造3条狗,6=造10个兵"
}
}, Entrance = function (id) ClickKey = function (key)
PressKey(key)
ReleaseKey(key)
end ClickMouse = function ()
PressMouseButton(Mouse.LBUTTON)
ReleaseMouseButton(Mouse.LBUTTON)
end ClickPanel = function(row, column, count)
if count == nil then
count = 1
end
local width, height = GetClientSize()
-- 红警面板总是在右侧固定宽度位置 168 像素,其中
-- 内边框左侧 20 像素,右侧 22 像素,中间 126 像素为按钮,分两列,每列 63px
-- 顶部到按钮高度 227 像素,按钮高度 50 像素
local target_x = width - 168 + 20 + 63 * column + 32
local target_y = 227 + row * 50 + 25
MoveMouse(target_x, target_y)
for i = 1, count, 1
do
ClickMouse()
Delay(10)
end
end local config = Extension.Configuration
local start_x, start_y = GetCursorPosition() if config.Type == 1 then
-- 造电厂
ClickKey(Keys.VK_Q)
ClickPanel(0, 0)
MoveMouse(start_x, start_y)
elseif config.Type == 2 then
-- 造兵营
ClickKey(Keys.VK_Q)
ClickPanel(1, 0)
MoveMouse(start_x, start_y)
elseif config.Type == 3 then
-- 造矿场
ClickKey(Keys.VK_Q)
ClickPanel(0, 1)
MoveMouse(start_x, start_y)
elseif config.Type == 4 then
-- 造碉堡
ClickKey(Keys.VK_W)
ClickPanel(0, 1)
MoveMouse(start_x, start_y)
elseif config.Type == 5 then
-- 造3条狗
ClickKey(Keys.VK_Q)
ClickPanel(1, 0, 3)
MoveMouse(start_x, start_y)
elseif config.Type == 6 then
-- 造10个兵
ClickKey(Keys.VK_Q)
ClickPanel(0, 0, 10)
MoveMouse(start_x, start_y)
end return true
end
}

因为面板按钮会随着游戏进行而会有变化,所以上述脚本只适用于开局。

用溪流 WarKey 辅助红警开局快捷操作的更多相关文章

  1. 红警大战JAVA简单版

    代码结构: 相关源码: 武器类: 属性:武器,攻击力,子弹数量. 方法:给属性赋值(set属性()方法) 获取属性值(get属性()方法) package 红警大战简单版; public class ...

  2. win10红警黑屏和无法打开的处理

    原因:win10或者win7无法打红警的原因,除开软件本身坏了等情况,多半是因为显示比率不对不上和系统不兼容导致的处理方法是: 1.将快捷方式发送到桌面(只是为了方便打开,当然你也可以不发送到桌面,关 ...

  3. vista/win7系统 红警/CS/星际争霸 局域网连接方法

    昨晚,闲来无事,忽然想起打红警来,于是和宿舍舍友商量一起联机打红警, 可是在win7下不能联机红警,网上很多人都这么说,昨晚我折腾了2小时,终于解决了这个问题. win7系统是可以联机打红警的!!!! ...

  4. Linux+Proton without Steam玩红警3指南

    首先你需要Proton5.13 without Steam,使用说明和下载链接看这里https://www.cnblogs.com/tubentubentu/p/16716612.html 然后在/e ...

  5. Debian玩红警2

    Debian玩红警2 1. 安装wine sudo apt update sudo apt install wine wine --version wine-5.0.3 (Debian 5.0.3-3 ...

  6. Sublime Text 2 快捷操作

    Sublime Text 2 包含了大量快捷操作,而且还很方便修改和追加自己喜欢的快捷键. 查看快捷键的方式也很简单: 点击菜单栏:Preferences->Key Bindings –Defa ...

  7. windows系统快捷操作の进阶篇

    上次介绍了windows系统上一些自带的常用快捷键,有些确实很方便,也满足了我们的一部分需求.但是我们追求效率的步伐怎会止步于此?这一次我将会进一步介绍windows上提升效率的方法. 一:运行 打开 ...

  8. windows系统快捷操作の基础篇

    从网上汇总了一些windows系统上常用的快捷键,结合自己的使用经验,将平时使用电脑时最常用的快捷键记录在此.注意这里罗列的是平时最常用到的,其他的一般来说不怎么用到的并不在此列,如果想要完整列表,请 ...

  9. 3D Touch介绍:电子秤App与快捷操作

    随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...

  10. 三星galaxy s4问题解决及快捷操作

    http://blog.csdn.net/pipisorry/article/details/38474827 三星galaxy s4更改锁屏方式时出现故障 屏幕锁定设置除password以外,其它锁 ...

随机推荐

  1. IDEA中Java项目创建lib目录并生成依赖

    首先介绍说明一下idea在创建普通的Java项目,是没有lib文件夹的,下面我来带大家来创建一下1.右键点击项目,创建一个普通的文件夹 2.取名为lib 3.把项目所需的jar包复制到lib文件夹下 ...

  2. Springboot数据库的配置问题

    mysql时区问题 先前的代码如下 spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: ...

  3. 永久解决Ubuntu下adb权限问题

    在Linux环境下使用adb链接手机,经常会遇到全下问题,如下: adb: unable to connect for root: insufficient permissions for devic ...

  4. centos使用lftp备份文件

    一直以来项目的文件没有备份,最近需要增加备份,本来以为备份是IT的工作,结果IT说工作忙,拖了半个月给分配完ftp服务器后说不给备份,需要我们开发自己备份...我特么*** 对于ftp备份,咱是没有经 ...

  5. [C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异

    最近做一个C++开源项目发现一个奇怪问题,通过clang编译链接执行程序每到有一个就崩溃了,gcc下则没有此问题. 后来通过调试,发现原因是bool返回的方法是没有return语句!问题是为啥还能通过 ...

  6. <二>掌握构造函数和析构函数

    构造函数 和类名相同,可以带参数,参数可以有多个 构造函数执行完成后,内存开辟完成,同时可以完成初始化工作. 析构函数 ~Test(); 析构函数可以自己调用,析构函数调用后,对象不存在了.自己调了析 ...

  7. C#和Open eVision Studio图像库联合编程-读取图像

    OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image Files (*.t ...

  8. Java:String、StringBuilder、StringJoiner学习笔记

    String创建的俩种方式 1.直接赋值 String str = "Hello World!"; 当使用直接赋值的方式去创建字符串的时候,虚拟机会去串池里去检查字符串是否存在,如 ...

  9. PHP 代码解一元二次方程

    1 function php_getSolutionOVQE($a,$b,$c=0){ 2 $x1=0; 3 $x2=0; 4 $detal=0; 5 if($a==0 && $b== ...

  10. CPU体系(2):ARM Store Buffer

    本文主要翻译自 Arm Cortex-M7 Processor Technical Reference Manual r1p2 其中章节 Memory System / L1 caches / Sto ...