Что нового

[Flash Guitar Hero] Автоматизация процесса игры

BOORZZZIK

Новичок
Сообщения
3
Репутация
1
Появилась идея сделать бота для игры Flash Guitar Hero. Решил узнать больше об AutoIt и пришел сюда.
Суть бота проста -- нажимать на нужную мне кнопочку при появлении ноты определенного цвета, при том, что этих кнопочек пять штук.
Почитав немного об AutoIt'e я решил, что пойду через PixelSearch, и соответственно код для каждой кнопочки должен быть такой

Код:
If PixelSearch( 590, 615, 592, 610, 0x4BFC6B) Then 
Send ('{A}')
Endif


но то ли я не разобрался в синтаксисе, либо не правильно определил цвет и координаты, даже одна кнопочка не нажимается. координаты я мерил от всего монитора (1366х768), а цвет по самой яркой точке на ноте.

Подскажите, что я не так делаю, и можно ли вообще такое осуществить?


скриншот окна игры
fe7d1b3b386e.jpg


Добавлено:
Сообщение автоматически объединено:

пока получается следующая штука

Код:
HotKeySet("{F6}","_Exit")

$S = 6

MsgBox(4,"Bot","vi hotite zapustit' bot?")
If $S = 6 Then
MsgBox(4096,"Bot","nachalos'!")
EndIf



$Nota = 0x1
$Nota1 = 0x2
$Nota2 = 0x4
$Nota3 = 0x8
$Nota4 = 0x16


While 1
Sleep(1)
$Nota = PixelSearch(154, 596,229, 607,0x009900)
If IsArray($Nota) = True Then
Opt("PixelCoordMode", 2) 
Opt("SendKeyDelay", 25)
Send("{a}")
EndIf

$Nota0 = PixelSearch(154, 596,229, 607,0x0099FF,1)
If IsArray($Nota0) = True Then
Opt("PixelCoordMode", 2) 
Opt("SendKeyDelay", 25)
Send("{a}")
EndIf

$Nota1 = PixelSearch(254,596,329,607,0xFF0000)
If IsArray($Nota1) = True Then
Opt("PixelCoordMode", 2) 
Opt("SendKeyDelay",25)
Send("{s}")
EndIf

$Nota10 = PixelSearch(254,596,329,607,0x0099FF,1)
If IsArray($Nota10) = True Then
Opt("PixelCoordMode", 2) 
Opt("SendKeyDelay", 25)
Send("{s}")
EndIf

$Nota2 = PixelSearch(354, 596,429, 607,0xF4F402)
If IsArray($Nota2) = True Then
Opt("PixelCoordMode", 2) 
Opt("SendKeyDelay", 25)
Send("{h}")
EndIf

$Nota20 = PixelSearch(354, 596,429, 607,0x0099FF,1)
If IsArray($Nota20) = True Then
Opt("PixelCoordMode", 2) 
Opt("SendKeyDelay", 25)
Send("{h}")
EndIf

$Nota3 = PixelSearch(454, 596,506, 603,0x0099FF,1)
If IsArray($Nota3) = True Then
Opt("PixelCoordMode", 2) 
Opt("SendKeyDelay", 25)
Send("{j}")
EndIf

$Nota4 = PixelSearch(596, 595,530, 607,0xFFFFFF)
If IsArray($Nota4) = True Then
Opt("PixelCoordMode", 2) 
Opt("SendKeyDelay", 25)
Send("{k}")
EndIf

$Nota40 = PixelSearch(596, 595,530, 607,0x0099FF,1)
If IsArray($Nota40) = True Then
Opt("PixelCoordMode", 2) 
Opt("SendKeyDelay",25)
Send("{k}")
EndIf

WEnd

Func _Exit()
Exit
EndFunc
 

running-frag

why me?
Сообщения
441
Репутация
60
я не играл и не знаю но правильно ли ты делаешь вообще?
PixelSearch() ищет пиксель в опред. зоне, и что это тебе даст?

имхо насколько мне известно нужно нажимать на кнопку когда одна из этих хреней подплывает к "линии" (или как то так), так вот берёшь и проверяешь каждые N миллисекунд пару координат

после с этих координат берёшь цвет PixelGetColor() и сверяешь, если цвет тот что нужно - тыц на нужную кнопку

в прицепи использывать PixelSearch разумно если нужны вариации цветом (аля шейды), но имхо там всё равно у тебя будет завязано всё на одном пикселе (имеется ввиду что одного пикселя для проверки нужно лы клацать кнопку достаточно, само собой что для каждой струны отдельный пиксель) а не "поиксе по всему экрану"


Добавлено:
Сообщение автоматически объединено:

Код:
Opt("PixelCoordMode", 2)
Opt("SendKeyDelay",25)

вынеси это в начало скрипта, не нужно его каждый раз повторять (если ты не планируешь его менять)
 
Автор
B

BOORZZZIK

Новичок
Сообщения
3
Репутация
1
возникла проблема, в игре существуют длинные ноты, которые нужно зажимать, пока они не кончатся. фиг то с ними, если полностью не нажмешь, то ошибкой не считается, мне рекорды не нужны, но проверка на какой-то промежуток времени уже не катит -- когда идет длинная нота, бот нажимает на клавишу постоянно, а это убивает игру напрочь. что можно придумать?
 

running-frag

why me?
Сообщения
441
Репутация
60
Ну при "зажиме" нужно проверять "дорожку" на наличие, опять же, на "не пустые" пиксели. Тут идёт уже фигурная работа. Надо определить для начало "там дорожка" или просто так эти чашечки идут. Проблема состоим в том что "зажим" это не "постоянное нажимание кнопки". Для зажима есть спец команды типо MouseDown() и MouseUp().

Принцеп такой - проверяем дорожку в N пикселях (кто его знает сколько можно хоть всю длинну подрят взять, либо каждые через пикселя в контрольных точках). После этого "понимаем" что там, либо дорожка либо большое кол. чашечек. Если не дорожка выполняем как "клик по чашечкам". И так для каждой "струны".

Можно ещё по другому. Методом отрезания. Т.е. проверяем дорожку и встречаем не "чёрный" (образно) значит начинаем видить чашечку до того момента пока не встретим снова "чёрный" (чашечка закончилась) и так далее. Если длинна получится больше чем обычная чащечка - значит это "зажим". Ну как то так.
 
Автор
B

BOORZZZIK

Новичок
Сообщения
3
Репутация
1
вряд ли я смогу такую сложную конструкцию реализовать, бот по-прежнему жмет на клавиши как угорелый, пока чтобы не сбивать 100% нажатия я добавил хоткеи на паузу и старт, и контролирую самостоятельно процесс (полу-автомат какой-то получается). но у меня появилась вот какая идея : у меня есть ноты для игры в midi файлах для всех песен, и вот что я подумал -- возможно ли передать на клавиатуру с midi файла все эти нажатия, и хоткеем вызывать каждую песню?
 

running-frag

why me?
Сообщения
441
Репутация
60
OffTopic:
лично я с файлами тяжко, поэтому на счёт миди не смогу помочь
 

Moonsin

Новичок
Сообщения
17
Репутация
2
Моя тема.
http://autoit-script.ru/index.php/topic,8988.msg60401.html#msg60401
Может код поможет.
 
Верх