• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[技术交流] 【院刊】-【201409期】纯API,教你画射击游戏的准心 [复制链接]

1#

纯API,教你画射击游戏的准心




供稿人:[backcolor=rgb(229, 237, 242)]风__琪仙
有的时候,玩枪击游戏,不想一直使用脚本。想偶尔手动,但是又因为没有准心时常打不准,锵锵锵~那为什么不自己画一个准心呢?我们一起来学习下这个准心要如何画吧~

首先,我们先来简单了解下,要用到的几个Api函数,吼吼~欢迎表格君上场~



SetROP2
声明 Declare Function SetROP2 Lib "gdi32" Alias "SetROP2" (ByVal hdc As Long, ByVal nDrawMode As Long) As Long
功能主要用于设定当前前景色的混合模式。R2_NOT就是取反的意思,即前景色为背景色的反色,经常用R2_NOT来画橡皮线,因为两次取反可以还原背景色
参数1.设备场景的句柄 2.设备场景的新绘图模式
返回值如执行成功,返回前一个绘图模式;零表示出错


GetWindowDC
声明Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long
功能获取整个窗口(包括边框、滚动条、标题栏、菜单等)的设备场景
参数窗口句柄
返回值设备句柄


CreatePen
声明Declare Function CreatePen Lib "gdi32" Alias "CreatePen" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
功能用指定的样式、宽度和颜色创建一个画笔
参数画笔类型
返回值如函数执行成功,就返回指向新画笔的一个句柄;否则返回零

SelectObject
声明 Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc As Long, ByVal hObject As Long) As Long
功能 每个设备场景都可能有选入其中的图形对象。其中包括位图、刷子、字体、画笔以及区域等等。一次选入设备场景的只能有一个对象。选定的对象会在设备场景的绘图操作中使用。例如,当前选定的画笔决定了在设备场景中描绘的线段颜色及样式
参数1.一个设备场景的句柄 2.一个画笔、位图、刷子、字体或区域的句柄
返回值 与以前选入设备场景的相同hObject类型的一个对象的句柄,零表示出错。如选定的对象是一个区域(Region),结果就是下列常数之一:SIMPLEREGION, COMPLEXREGION 或 NULLREGION 对区域进行描述, GDI_ERROR 表示出错


MoveToEx
声明Declare Function MoveToEx Lib "gdi32" Alias "MoveToEx" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
功能为指定的设备场景指定一个新的当前画笔位置。前一个位置保存在lpPoint中
参数1.指向一个设备场景的句柄 2.采用逻辑坐标表示的新画笔位置 3.前一个画笔位置
返回值 非零表示成功,零表示失败


LineTo
声明 Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
功能 用当前画笔画一条线,从当前位置连到一个指定的点。这个函数调用完毕,当前位置变成x,y点
参数 1设备场景的句柄 2.线段终点位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部分
返回值 非零表示成功,零表示失败


DeleteObject
声明 Declare Function DeleteObject Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long
功能用这个函数删除GDI对象,比如画笔、刷子、字体、位图、区域以及调色板等等。对象使用的所有系统资源都会被释放
参数 一个GDI对象的句柄
返回值 非零表示成功,零表示失败



我们拿桌面窗口做例子,在桌面窗口上画一个准心,准心随着鼠标移动而移动。

脚本大致过程:
1、获取当前鼠标坐标,以鼠标坐标作为画笔位置
2、取设备句柄,这里设置取屏幕设备句柄
3、创建一个画笔对象
4、将创建的画笔对象载入到设备场景里(当前屏幕即是设备场景)。
5、清屏一次,消除之前画笔对象画的准心
6、指定好画笔开始的位置,(设置鼠标所在的坐标)
7、 以鼠标坐标为中心,画一条横线。以鼠标坐标为中心,画一条竖线
8、加入Do……Loop 循环,画一个准心删除一个准心,这样就实现了准心跟随鼠标移动而移动

代码:



  1. Declare Function 取设备句柄 Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long
  2. Declare Function 创建画笔对象 Lib "gdi32" Alias "CreatePen" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
  3. Declare Function 选入场景 Lib "gdi32.dll" Alias "SelectObject" (ByVal hwnd As Long,ByVal hwnd As Long) As Long
  4. Declare Function 指定画笔位置 Lib "gdi32" Alias "MoveToEx" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal x As Long) As Long
  5. Declare Function 画直线 Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
  6. Declare Function 删除对象 Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long
  7. //取设备句柄(窗口句柄)[返回设备句柄,整数型]
  8. //创建画笔对象(类型,宽度,颜色)[返回对象句柄]
  9. //选人场景(设备句柄,场景句柄)
  10. //指定画笔位置(设备句柄,X,Y,坐标结购)
  11. //画直线(设备句柄,终点X,终点Y)
  12. //删除对象(对象句柄)

  13. Do

  14. GetCursorPos x, y
  15. 设备句柄 =取设备句柄(0)//窗口句柄为0时,取屏幕设备句柄,如在指定窗口画就填写窗口句柄
  16. 对象句柄 = 创建画笔对象(1, 2, 255)//参数1为类型,参数2为线条粗细,参数3为10进制的颜色值(255是红色)
  17. TracePrint 设备句柄
  18. TracePrint 对象句柄
  19. TracePrint 选入场景(设备句柄, 对象句柄)//此操作相当于windows画图时鼠标选择了画笔按钮。
  20. Call Plugin.Msg.HideScrTXT()
  21. TracePrint 指定画笔位置(设备句柄,x-50,y,坐标结构)//坐标结构不要使用,按键不支持此数据类型
  22. TracePrint 画直线(设备句柄, x + 50, y )//画横线

  23. TracePrint 指定画笔位置(设备句柄,x,y-50,坐标结构)//坐标结构不要使用,按键不支持此数据类型
  24. TracePrint 画直线(设备句柄, x, y + 50)//画竖线


  25. loop

  26. TracePrint 删除对象(对象句柄)'画完以后记得释放对象
复制代码




另一种方法,通过 SetROP2 函数实现。





前一种方法,是使用屏幕刷新 [backcolor=rgb(247, 247, 247)]Call Plugin.Msg.HideScrTXT() 用屏幕刷新来实现,画完一个准心刷新一次屏幕,把前面的画的准心清除掉。 SetROP2 函数是使用反色来覆盖掉前一次画的准心。



脚本大致思路:


1、画准心前,先取屏幕背景色的反色作为画笔的颜色,并且记录好当前鼠标坐标。


2、画一个准心


3、画完之后,再次取反色,第一次获取屏幕背景色的反色,然后第二次再取反色,那这次取到的就是屏幕的背景色了。然后利用原来记录好的鼠标坐标,画一个准心,相当于把之前画的准心用屏幕背景色再画一次进行覆盖。


4、循环画准心,达到鼠标移动,准心跟着移动的效果。




代码:

  1. Declare Function 反色 Lib "gdi32" Alias "SetROP2" (ByVal hdc As Long, ByVal nDrawMode As Long) As Long
  2. Declare Function 取设备句柄 Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long
  3. Declare Function 创建画笔对象 Lib "gdi32" Alias "CreatePen" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
  4. Declare Function 选入场景 Lib "gdi32.dll" Alias "SelectObject" (ByVal hwnd As Long,ByVal hwnd As Long) As Long
  5. Declare Function 指定画笔位置 Lib "gdi32" Alias "MoveToEx" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal x As Long) As Long
  6. Declare Function 画直线 Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
  7. Declare Function 删除对象 Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long

  8. //反色 (设备句柄,绘图模式)
  9. //取设备句柄(窗口句柄)[返回设备句柄,整数型]
  10. //创建画笔对象(类型,宽度,颜色)[返回对象句柄]
  11. //选人场景(设备句柄,场景句柄)
  12. //指定画笔位置(设备句柄,X,Y,坐标结购)
  13. //画直线(设备句柄,终点X,终点Y)
  14. //删除对象(对象句柄)




  15. // x1,y1 绘制坐标 x2,y2 上次绘制坐标
  16. Dim x1, x2, y1, y2
  17. 设备句柄 =取设备句柄(0)//取桌面窗口设备句柄,如在指定窗口画就填写窗口句柄
  18. 对象句柄 = 创建画笔对象(1, 2, 0)//参数1为类型,参数2为线条粗细,参数3为10进制的颜色值(这里用到了反色api准心是背景反色就不设置颜色了)
  19. TracePrint 设备句柄
  20. TracePrint 对象句柄
  21. TracePrint 选入场景(设备句柄, 对象句柄)//此操作相当于windows画图时鼠标选择了画笔按钮。


  22. Do
  23. 反色 设备句柄, 6 //R2_NOT 绘图模式的值是6
  24. TracePrint 指定画笔位置(设备句柄, x2 - 50, y2, 坐标结构)//坐标结构不要使用,按键不支持此数据类型
  25. TracePrint 画直线(设备句柄, x2 + 50, y2 )//画横线

  26. TracePrint 指定画笔位置(设备句柄, x2, y2 - 50, 坐标结构)//坐标结构不要使用,按键不支持此数据类型
  27. TracePrint 画直线(设备句柄, x2, y2 + 50)//画竖线


  28. GetCursorPos x1, y1

  29. 反色 设备句柄,6
  30. TracePrint 指定画笔位置(设备句柄, x1 - 50, y1, 坐标结构)//坐标结构不要使用,按键不支持此数据类型
  31. TracePrint 画直线(设备句柄, x1 + 50, y1 )//画横线

  32. TracePrint 指定画笔位置(设备句柄, x1, y1 - 50, 坐标结构)//坐标结构不要使用,按键不支持此数据类型
  33. TracePrint 画直线(设备句柄, x1, y1 + 50)//画竖线
  34. x2 = x1
  35. y2 = y1
  36. loop
复制代码


本文由按键学院提供技术支持

按键学院实战班(入驻最终幻想)火热招生

按键学院基础视频抢先观看



    已有7评分我要评分查看所有评分

    本主题由 超级版主 瑞祥幽冥狼 于 2023/4/30 21:02:00 执行 审核帖子 操作
    <strong>按键学院交流群(开放中):376122403<br />
    <br />
    <a href="http://bbs.anjian.com/thread-548439-1-1.html" target="_blank">按键学院开班<strong> <font color="Red">【安卓导师】+【实战导师】招聘导师</font></strong>啦~~<font color="Red"><strong>待遇特别好,有钱,就是任性。</strong> </font></a><br />
    <br />
    <br />
    <a href="http://bbs.anjian.com/t
    2#

    看看学习学习

    3#

    感谢分享,学习一下

    4#

    爱上你了怎么办

    5#

    1112211

    6#

    233333

    7#

    学习学习

    8#


    9#

    看看学学,基础最好

    10#

    asds 阿萨德撒的

    11#

    333333333333333333333333333333333

    12#

    学习下啊学习

    13#

    ***** 该内容需您回复才可浏览 *****

    14#


    15#

    7987979651361321

    16#

    很给力

    承接脚本软件程序定制开发
    联系作者请点击,或加QQ:1945994728
    17#

    看看

    18#

    ddddddddd

    19#

    】纯API,教你画射击游戏的准心修改.

    20#


    发新话题 回复该主题