Что нового

[Автоматизация] Редактор создания маршрута на карте.

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Для своих ботов я создаю маршруты движения, по которым они ходят от вейпоинта к вейпоинту.
Для облегчения построения маршрута я наваял вот такой редактор. (Спасибо 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, в котором записаны игровые координаты вейпоинтов.
Масштаб - это сколько пикселей на карте соответствуют одной клетке в игре (скорее всего одна клетка - один пиксель).
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
С небольшими картами не работает, например 400 на 400 пикселей
 
Верх