C2H5OH
AutoIT Гуру
- Сообщения
- 1,473
- Репутация
- 333
Для своих ботов я создаю маршруты движения, по которым они ходят от вейпоинта к вейпоинту.
Для облегчения построения маршрута я наваял вот такой редактор. (Спасибо WSWR за помощь с GUI).
Как им пользоваться.
Загружается картинка с игровой картой.
Кликая мышкой по карте ставятся вейпоинты.
Карту можно двигать кнопками "Вверх","Вниз","Вправо","Влево".
После нажатия на кнопку "СОХРАНИТЬ МАРШРУТ", в каталоге, где находится скрипт, появляется файл waypoints.txt, в котором записаны игровые координаты вейпоинтов.
Масштаб - это сколько пикселей на карте соответствуют одной клетке в игре (скорее всего одна клетка - один пиксель).
Для облегчения построения маршрута я наваял вот такой редактор. (Спасибо WSWR за помощь с GUI).
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <GUIConstants.au3>
#include <WinAPI.au3>
#Include <GuiButton.au3>
#Include <Array.au3>
#include<File.au3>
Global $side = 500
Dim $X_point_array[1] = [0], $Y_point_array[1] = [0]
$hGUI = GUICreate("Example", 730, 600, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
$Button_map = GUICtrlCreateButton("Выбрать карту", 580, 50, 120, 30)
$Button_Up = GUICtrlCreateButton("Вверх", 600, 90, 80, 50)
$Button_Left = GUICtrlCreateButton("Влево", 555, 150, 80, 50)
$Button_Right = GUICtrlCreateButton("Вправо", 645, 150, 80, 50)
$Button_Down = GUICtrlCreateButton("Вниз", 600, 210, 80, 50)
GUICtrlCreateLabel("МАРШРУТ", 600, 300, 80, 30, 1)
$Button_Delete_last = GUICtrlCreateButton("Удалить последнюю", 565, 330, 150, 50)
$Button_Delete_all = GUICtrlCreateButton("Очивтить всё", 565, 390, 150, 50)
GUICtrlCreateLabel ( "Пикселей на клетку", 542, 454 , 150, 20, 1)
$kleta = GUICtrlCreateInput(1, 680, 450, 30, 20)
$Button_Save = GUICtrlCreateButton("СОХРАНИТЬ МАРШРУТ", 565, 500, 150, 50)
$map_file = FileOpenDialog("Выберите файл карты", @ScriptDir & "\", "Images (*.jpg;*.bmp)", 1 + 4 )
If @error Then
MsgBox(4096,"","Карта не выбрана")
Exit
EndIf
GUISetState()
_GDIPlus_Startup()
$hGraph = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawRect($hGraph, 49, 49, 501, 501)
$hBit = _GDIPlus_ImageLoadFromFile($map_file)
$iWidth = _GDIPlus_ImageGetWidth ($hBit)
$iHeight = _GDIPlus_ImageGetHeight ($hBit)
Dim $coord[2] = [$iWidth/2,$iHeight/2], $oldCoord[2] = [0,0]
$hGraphic = _GDIPlus_ImageGetGraphicsContext ($hBit)
While 1
$GUIMsg = GUIGetMsg(1)
Switch $GUIMsg[0]
Case $GUI_EVENT_CLOSE
ExitLoop
Case $Button_map
$map_file = FileOpenDialog("Выберите файл карты", @ScriptDir & "\", "Images (*.jpg;*.bmp)", 1 + 4 )
_GDIPlus_ImageDispose($hBit)
_GDIPlus_GraphicsDispose($hGraphic)
$hBit = _GDIPlus_ImageLoadFromFile($map_file)
$hGraphic = _GDIPlus_ImageGetGraphicsContext ($hBit)
_GDIPlus_GraphicsDrawRect($hGraph, 49, 49, 501, 501)
Case $Button_Up
$coord[1] -= 100
Case $Button_Left
$coord[0] -= 100
Case $Button_Right
$coord[0] += 100
Case $Button_Down
$coord[1] += 100
Case $GUI_EVENT_PRIMARYDOWN
$X_clicked = $GUIMsg[3]-50
$Y_clicked = $GUIMsg[4]-50
If $X_clicked > 0 And $X_clicked < 500 And $Y_clicked > 0 And $Y_clicked < 500 Then
_ArrayAdd($X_point_array, $coord[0] - $side/2 + $X_clicked)
$X_point_array[0] += 1
_ArrayAdd($Y_point_array, $coord[1] - $side/2 + $Y_clicked)
$Y_point_array[0] += 1
If $X_point_array[0] > 1 Then
_GDIPlus_GraphicsDrawLine($hGraphic, $X_point_array[$X_point_array[0]-1], $Y_point_array[$Y_point_array[0]-1], $X_point_array[$X_point_array[0]], $Y_point_array[$Y_point_array[0]])
Else
_GDIPlus_GraphicsDrawLine($hGraphic, $X_point_array[$X_point_array[0]], $Y_point_array[$Y_point_array[0]], $X_point_array[$X_point_array[0]], $Y_point_array[$Y_point_array[0]])
EndIf
EndIf
Case $Button_Delete_last
If $X_point_array[0] > 0 Then
_ArrayDelete($X_point_array, $X_point_array[0])
$X_point_array[0] -= 1
EndIf
If $Y_point_array[0] > 0 Then
_ArrayDelete($Y_point_array, $Y_point_array[0])
$Y_point_array[0] -= 1
EndIf
_GDIPlus_ImageDispose($hBit)
_GDIPlus_GraphicsDispose($hGraphic)
$hBit = _GDIPlus_ImageLoadFromFile($map_file)
$hGraphic = _GDIPlus_ImageGetGraphicsContext ($hBit)
For $i=2 To $X_point_array[0]
_GDIPlus_GraphicsDrawLine($hGraphic, $X_point_array[$i-1], $Y_point_array[$i-1], $X_point_array[$i], $Y_point_array[$i])
Next
Case $Button_Delete_all
For $i=$X_point_array[0] To 1 Step -1
_ArrayDelete($X_point_array, $i)
_ArrayDelete($Y_point_array, $i)
Next
$X_point_array[0]=0
$Y_point_array[0]=0
_GDIPlus_ImageDispose($hBit)
_GDIPlus_GraphicsDispose($hGraphic)
$hBit = _GDIPlus_ImageLoadFromFile($map_file)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hBit)
Case $Button_Save
$mashtab = GUICtrlRead($kleta)
$waypoints_file = FileOpen(@ScriptDir & "\waypoints.txt", 2)
For $i = 1 To $X_point_array[0]
FileWriteLine($waypoints_file, Floor($X_point_array[$i]/$mashtab) & "," & Floor($Y_point_array[$i]/$mashtab) )
Next
FileClose($waypoints_file)
ExitLoop
EndSwitch
If $coord[0] <> $oldCoord[0] Or $coord[1] <> $oldCoord[1] Then
If $coord[0] < $side/2 Then $coord[0] = $side/2 + 2
If $coord[1] < $side/2 Then $coord[1] = $side/2 + 2
If $coord[0] > ($iWidth - ($side/2)) Then $coord[0] = ($iWidth - ($side/2)) - 2
If $coord[1] > ($iHeight - ($side/2)) Then $coord[1] = ($iHeight - ($side/2)) - 2
$oldCoord[0] = $coord[0]
$oldCoord[1] = $coord[1]
EndIf
$hImageInGUI = _GDIPlus_BitmapCloneArea($hBit, $coord[0] - ($side/2), $coord[1] - ($side/2), $side, $side)
_GDIPlus_GraphicsDrawImage($hGraph, $hImageInGUI, 50, 50)
_GDIPlus_ImageDispose($hImageInGUI)
WEnd
_GDIPlus_Shutdown()
Как им пользоваться.
Загружается картинка с игровой картой.
Кликая мышкой по карте ставятся вейпоинты.
Карту можно двигать кнопками "Вверх","Вниз","Вправо","Влево".
После нажатия на кнопку "СОХРАНИТЬ МАРШРУТ", в каталоге, где находится скрипт, появляется файл waypoints.txt, в котором записаны игровые координаты вейпоинтов.
Масштаб - это сколько пикселей на карте соответствуют одной клетке в игре (скорее всего одна клетка - один пиксель).