回 帖 发 新 帖 刷新版面

主题:一个简单的游戏外挂的实现

[url]http://my.dongua.com/flashgame/blog!entry/7552.entry[/url]
这两天在玩这个游戏,到第3关要摇那个电风扇,摇得我手都抽筋了,才勉强过了这关.
哪知道今天玩到第10关,一看傻眼了,全关都是摇风扇的,摇慢了马上挂掉,要重新来过,试了N次,手几乎抽筋了还是过不了.

想想我等coder,用鼠标画圈不是很在行,敲键盘才是自己所长
于是,打开Visual Studio 2008,新建一个基于对话框的MFC工程:CircleCursor,调整一下对话框大小,就开始写代码.
在BOOL CCircleCursorDlg::OnInitDialog()里插入一行代码:
[code=c]
//注册一个热键
RegisterHotKey(m_hWnd, 1, 0, 'X');
[/code]

在对话框属性窗口的消息分栏里找到WM_HOTKEY,点右方添加WM_HOTKEY的处理过程OnHotKey,写代码:
[code=c]
void CCircleCursorDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
    if (nHotKeyId == 1)
    {
        //获取当前光标位置
        POINT pt;
        GetCursorPos(&pt);

        while (true)
        {
            const double PI = 3.1415926;    //PI
            const int RADIUS = 15;            //半径

            //按弧度0-2PI循环移动光标
            for (double angle = 0; angle < (2*PI); angle += 0.1)
            {
                int x = cos(angle) * RADIUS;
                int y = sin(angle) * RADIUS;

                SetCursorPos(pt.x + x, pt.y + y);
                Sleep(5);
            }

            //检查左键,如果已经释放则退出
            SHORT key = GetAsyncKeyState(VK_LBUTTON);
            if ((key && 0x8000) == 0)
                break;
        }

        //还原光标位置
        SetCursorPos(pt.x, pt.y);
    }

    CDialog::OnHotKey(nHotKeyId, nKey1, nKey2);
}
[/code]

OK,运行,把光标定位到摇柄的中心,按下鼠标左键(别放), 按一下'X'键,摇柄马上摇了起来,哈哈,速度飞快的.三下两下就过关了

数了一下自己写的代码,才20行左右,是不是很简单?

大家有空玩下,第3关和第10关别用挂,看下自己有没有抓狂的感觉?

哈哈.

回复列表 (共9个回复)

沙发

LZ何苦要用VS2008。VS6不挺好的么。

板凳

[quote]LZ何苦要用VS2008。VS6不挺好的么。[/quote]
1 编译器诸多问题,不符合C++标准.最明显的是for变量作用域.
2 IDE粗糙落后.字体难看 界面难看 调试麻烦 智能提示落后 错误提示难看 定位错误麻烦

等你对C熟悉了,你会发现用VC6会给别人鄙视的。

3 楼

[quote]等你对C熟悉了,你会发现用VC6会给别人鄙视的[/quote]
呵呵,那用VB6岂不是别人都懒得鄙视了。

4 楼

经典的游戏,经典的动画效果,经典的背景及背景音乐,作者是谁?

工人对使用工具的感觉....

5 楼

再好的工具没有好的工人也是白费!

6 楼

我按了x好一会儿然后松开才发现鼠标转个不停,Alt+F4也被忽略,无奈地等它转了2分钟才关掉。。。。
不过按着鼠标左键在按X则可以松手即停

7 楼

[quote]我按了x好一会儿然后松开才发现鼠标转个不停,Alt+F4也被忽略,无奈地等它转了2分钟才关掉。。。。
不过按着鼠标左键在按X则可以松手即停[/quote]
哈哈,我不是写明了按"一下"了吗?
不过这种情况我自己也遇到过,那是因为一直按着,windows会发无数次WM_HOTKEY给程序,都积压在消息队列了,所以处理起来要很久.
可以尝试把判断鼠标左键状态的代码放到前面,这样就ok了.

8 楼

用个线程处理不好过吗?

9 楼

[quote]用个线程处理不好过吗?[/quote]
小程序没必要搞得那么复杂,就把判断鼠标状态代码提前到while前就OK了.

我来回复

您尚未登录,请登录后再回复。点此登录或注册