spichka
Newbie | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Привет всем. Есть задача написать игрового бота. Есть несколько точек (датчиков) по которым можно и нужно отслеживать состояние бота(в игре). В программе должна быть предусмотрена пауза, по выходу из которой бот должен АДЕКВАТНО решать задачи согласно внутренней логике, основываясь на данных с датчиков. Вопрос по архитектуре программы. Как всё это реализовать? Больше всего подходит способ через таймеры. К примеру определяем нужные таймер для проверки набора состояния датчиков Код: Global $Timer1 = _Timer_SetTimer($hGUI, 2000) Global $Timer2 = _Timer_SetTimer($hGUI, 5000) Global $Timer3 = _Timer_SetTimer($hGUI, 10000) Global $Timer4 = _Timer_SetTimer($hGUI, 20000) Func WM_TIMER($hWnd, $iMsg, $iwParam, $ilParam) ; Событие таймера #forceref $hWnd, $iMsg, $ilParam Switch _Timer_GetTimerID($iwParam) Case $Timer1Local ;выполнение 1-го таймера Label1_SetData() Sleep(1500) MsgBox(0, 'WM_TIMER', 'Событие Timer1', 1) Case $Timer2 ;выполнение 2-го таймера Label2_SetData() EndSwitch Return $GUI_RUNDEFMSG EndFunc | С этим пока всё в порядке. Func WM_TIMER писал не я, поэтому по тонкостям запуска и определения ответить не смогу. Взял где-то из примеров. Теперь вопрос. Как видим, таймеры абсолютно разные и блоки выполнения любого из них могут быть больше по времени чем разница по времени до вызова следующего CASE $Timer2 ПРИМЕР: таймер1 - вызывает каждые 2 сек свой код. А вдруг код будет выполнятся 5-10 секунд? Учитывая что внутри него вполне могут находиться сложные действия с ожиданием прорисовки ( Sleep(5000)) Получается, что во время выполнения обработчика ТАЙМЕРА1 должен вызваться обработчик ТАЙМЕРA2. Вопрос к знатокам. Как будет работать программа в этом случае? И как правильно строить архитектуру такого бота? Вопрос 2: можно ли использовать вложение SWITCH внутри функции примерно так: Код: Func WM_TIMER($hWnd, $iMsg, $iwParam, $ilParam) ; Событие таймера #forceref $hWnd, $iMsg, $ilParam Switch _Timer_GetTimerID($iwParam) Case $Timer1Local ;выполнение 1-го таймера Switch <expression> Case 6 To 11 <code1> Case 12 To 17 <code2> Case 18 To 21 <code3> Case Else <code4> EndSwitch Case $Timer2 ...... EndSwitch ..... EndFunc | ? Спасибо за добрые советы | Всего записей: 22 | Зарегистр. 29-04-2006 | Отправлено: 01:55 09-02-2012 | Исправлено: spichka, 02:05 09-02-2012 |
|