1

Тема: Указатель направления Gdip_DrawLines

Скрипт для онлайн игры diep.io, при помощи gdip рисует на экране линию от цента к курсору.
Проблема в том что не получаеться полностью стереть старую линию, и в результате получаеться полупрозрачный белый шлейф.
Так же вопрос можно ли продлить эту линию до края экрана.


SetWinDelay,0
SetBatchLines,-1
#Include gdip.ahk
Gdip_Startup()
Gui, 1: -Caption +E0x80000 +LastFound +OwnDialogs +HWNDlayer1 +ToolWindow +AlwaysOnTop
Gui, 1: Show, Na

hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetInterpolationMode(G, 7)
Gdip_SetSmoothingMode(G, 5)

pPen := Gdip_CreatePen(0xfff000000, 15)
pPenClear := Gdip_CreatePen(0xfffffffff, 16)
CoordMode, Mouse,Screen
Loop 
{
Gdip_DrawLines(G, pPenClear , A_ScreenWidth/2 "," A_ScreenHeight/2 "|" xm1 "," ym1 )
MouseGetPos, xm1,ym1,OutputVarWin
Gdip_DrawLines(G, pPen , A_ScreenWidth/2 "," A_ScreenHeight/2 "|" xm1 "," ym1 )
UpdateLayeredWindow(layer1, hdc,0, 0, A_ScreenWidth, A_ScreenHeight,100)
}
return
Escape::
Gdip_DeletePen(pPen) 
Gdip_DeletePen(pPenClear) 
ExitApp

2

Re: Указатель направления Gdip_DrawLines

Как стирать шлейф сам разобрался.
Но заметил еще 1 проблему, этот скрипт ест 50% процессора.
Можно ли его как-нибудь оптимизировать?

SetWinDelay,0
SetBatchLines,-1
#Include gdip.ahk
Gdip_Startup()
Gui, 1: -Caption +E0x80000 +LastFound +OwnDialogs +HWNDlayer1 +ToolWindow +AlwaysOnTop
Gui, 1: Show, Na

hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetInterpolationMode(G, 7)
Gdip_SetSmoothingMode(G, 5)

pPen := Gdip_CreatePen(0xfff000000, 15)
CoordMode, Mouse,Screen
Loop 
{
MouseGetPos, xm1,ym1,OutputVarWin
ym1 := ym1*2-A_ScreenHeight/2
xm1 := xm1*2-A_ScreenWidth/2
Gdip_GraphicsClear(G, 0x00ffffff)
Gdip_DrawLines(G, pPen , A_ScreenWidth/2 "," A_ScreenHeight/2 "|" xm1 "," ym1 )
UpdateLayeredWindow(layer1, hdc,0, 0, A_ScreenWidth, A_ScreenHeight,100)
}
return

Escape::
Gdip_DeletePen(pPen) 
Gdip_DeletePen(pPenClear) 
ExitApp

3

Re: Указатель направления Gdip_DrawLines

serge, проблема в цикле без задержек (Sleep). Да ещё усугубляется командой SetBatchLines,-1. Лучше наверное установить мышиный хук, и по событию перемещения мышки уже производить действия. Про хук есть тема в Коллекции.

Вместо #Include gdip.ahk можно положить этот файл в папку с программой, он будет "в библиотеке": C:\Program Files\AutoHotkey\Lib\Gdip.ahk.

4

Re: Указатель направления Gdip_DrawLines

Спасибо за подсказку реально стало легче.
С геометрией у меня не срослось поэтому координаты высчитывает так чтобы было похоже на направление.

SetWinDelay,0
SetBatchLines,-1
#Include gdip.ahk
gdipToken := Gdip_Startup()
Gui, 1: -Caption +E0x80000 +LastFound +OwnDialogs +HWNDlayer1 +ToolWindow +AlwaysOnTop
Gui, 1: Show, Na
WinSet, ExStyle, +0x80020
hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetInterpolationMode(G, 7)
Gdip_SetSmoothingMode(G, 5)

pPen := Gdip_CreatePen(0xfff000000, 10)
CoordMode, Mouse,Screen

PrevTime := A_TickCount
   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback("LowLevelMouseProc", "Fast")
      , UInt, DllCall("GetModuleHandle", UInt, 0)
      , UInt, 0)
   Return
 
Exit:
   DllCall("UnhookWindowsHookEx", Uint, hHookKeybd)
   ExitApp
 
LowLevelMouseProc(nCode, wParam, lParam)
{
   global PrevTime
   Time := NumGet(lParam+0, 16)
   InactivityTime := Time - PrevTime
   if InactivityTime > 10
   {
   
SetTimer, UpdateLayeredWindow, -1

      PrevTime := Time
   }
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)
}
 

UpdateLayeredWindow:
Sleep 10
MouseGetPos, xm1,ym1,OutputVarWin

ym1 := (ym1-A_ScreenHeight/2)*1000
xm1 := (xm1-A_ScreenWidth/2)*1000

Gdip_GraphicsClear(G, 0x00ffffff)
Gdip_DrawLines(G, pPen , A_ScreenWidth/2 "," A_ScreenHeight/2 "|" xm1 "," ym1 )
UpdateLayeredWindow(layer1, hdc,0, 0, A_ScreenWidth, A_ScreenHeight,100)
Return


Escape::
Gdip_DeletePen(pPen) 
Gdip_DeletePen(pPenClear) 
Gdip_Shutdown(gdipToken)
ExitApp