Author Topic: 3д. Изменение цвета взависимости от освещения.  (Read 3001 times)

0 Members and 1 Guest are viewing this topic.

Tvlad

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Доброго времени суток форумчане. Сломал голову от простого вопроса сына. "Можно создать скрипт для рыбалки в игре Тров"?
И так.. Суть вопроса. Есть игра Trove. В ней есть рыбалка на воде, на лаве, в шоколадной речке (везде перекатываются волны и меняется цвет). Есть поплавок. Тоже зараза шатается из стороны в сторону и меняет цвет в зависимости от времени суток. Пробую выставить рыбака в одну позицию и понять траекторию пошатывания поплавка. Отслеживаю цвета и применяю GETSCREEN  и PXL. Совмещаю с IF, затем while. результат = 0. Пробую обойти более грубым подходом, отследил  место появления поплавка, использую GETSCREEN и PXLXOR, надеясь на разнице сумм с играть. результат=0. то есть на PXLXOR игра вообще не реагирует. Провожу туже махинацию с PXLCRC. Тут пошли ответы, то сумма перемешивается с суммой, когда поплавок на верху. На этом месте мысли кончились. Толи уже коньяка прилично принял, толи мозги совсем окаменели. ПОдскажите пожалуйста что-то дельное по этому поводу. Заранее спасибо.
Читая предыдущие темы спешу добавить, что сделать скрин поплавка бесполезно. ОН меняет цвет, в зависимости от времени суток. Сутки в игре примерно равняются 10 минутам реальной жизни.  То есть примерно 144 картинки разной. Добавить сюда его скольжение по разной (водяной, лавовой, шоколадной) глади и оттенками от них и количество картинок увеличивается в тысячи.
« Last Edit: March 03, 2017, 03:14:19 AM by Tvlad »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Раз всё движется и меняется, PXLXOR и PXLCRC сразу в топку.
Т.к. движется и всё время не в одном месте PXL тоже за ними.

Меняется цвет - применяем COLORMODE, скорее всего режимы 6-7

Если при поклёвке поплавок (искомый цвет) полностью исчезает - применяем  IF_PIXEL_IN.
Если ещё может притапливаться - ведём подсчёт пикселов PXLCOUNT

Чтобы понять в первом приближении что делать, в редакторе, под окном лупы, самое правое число это режим COLORMODE для лупы.
Ставим 7, включаем лупу. Смотрим выделяется ли наш поплавок на разных фонах "воде, лаве, шоколадной речке".
Смотрим как ведёт себя в покачиваниях на волнах, не пропадают ли пикселы совсем в некоторые моменты времени.

И опять же если нужно ловить только пропадание поплавка просто в цикле ищем IF_PIXEL_IN до пропадания.
Если даже при утопленном поплавке остаётся несколько пикселов, то в цикле PXLCOUNT. Количество для сравнения подбираем.




Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Всем привет! :)
Игру Trove я не видел, но когда-то мне приходилось делать подобный скрипт для рыбалки в WoW, там те же проблемы с поиском пикселей. Помогло то, что при поклевке появляется всплеск на воде. Если подобрать настройки графики в игре и значение COLORMODE, то появляется чисто белый пиксель на разноцветной глади воды. Но в зоне поиска такие белые пиксели могут появляться например и от бликов на воде. Поэтому потребовалось еще делать дополнительную проверку перед кликом в поплавок, так как если кликнуть раньше поклевки, то процесс ловли прерывается и всё приходится начинать сначала. Пришлось определять код курсора (постоянного кода там нет, он все время меняется). Но есть закономерность - коды курсора над водой и над поплавком всегда разные между собой.
Алгоритм получился такой: забрасываем удочку...
    1. парковка курсора (вне зоны где может оказаться поплавок)
    2. ожидание белого пикселя в небольшой части экрана около поплавка
    3. при появлении пикселя - запоминаем код курсора на парковке; перемещаем курсор на найденный пиксель; получаем код курсора на этом пикселе
    4. сравниваем коды курсора; если коды курсора на парковке и над найденным пикселем не равны, то делаем правый клик по поплавку
Задержки нужно выставить индивидуально, например перед получением кода курсора над поплавком и прочие.
Вот такой вот пример. Возможно поможет подобрать решение и для Trove. :)

Tvlad

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Спасибо вам обоим за идеи. Есть мысли куда копать. По поводу Wow. Да, примерно тоже самое , только тут нет кругов на поверхности, когда поплавок тонет и верхняя часть поплавка видна.  В общем ночью буду пробовать вариант с COLORMODE и IF_PIXEL_IN и PXLCOUNT.  Винт, отдельное спасибо. Разжевал более чем подробно.

Tvlad

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Доброго всем. Вот код на обсуждение.

1:
 waitms (1500)
 KEYDOWN  (70)
 waitms (500)
 KEYUP   (70)
 waitms (2000)

 2:
 GETSCREEN
 COLORMODE ( 6, 620, 320, 750, 380)
 
 
 
 $clr = PXL ( 679, 375)
    if ($clr = 2039647) | ($clr = 2039615) | ($clr = 4144959) | ($clr = 4145023)
    logwrite ( "o", $clr)
    waitms (100)
    KEYDOWN  (70)
    waitms (100)
    KEYUP   (70)
    waitms (3000)
      
      goto (1)
      
      else
       logwrite ( "w", $clr)
      goto (2)
      
      end if
   

Тут не хватает кусочка кода, где "муви" направляет курсор на определенную позицию. Дальше жмём F, это рыбалка. Паузы сделаны из-за лагов на сервере. Делаем снимок экрана, упрощаем цветность картинки. Обращаемся к конкретному пикселю(его я вычислил с помощью лупы) и вот дальше запарка. Периодически отказывается работать "ИЛИ" в цикле. Вопрос. Почему не работает "ИЛИ"? Что не так. ЗА красоту кода не ругайте. Я только учусь
   
(Отдельный респект Винту, аз подсказку о операторе colormode, он реально гасит все переливы, блики и оставляет только один неизменный цвет)      
« Last Edit: March 05, 2017, 01:06:23 AM by Tvlad »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Для начала исправим ошибки.
Писать нужно не  end if а end_if
В комплексном условии отсутствуют общие скобки.

Избавился от гото, в место него нормальный цикл. Запись в лог ощутимо тормозит выполнение, поэтому используй его только для теста.
Code: (clickermann) [Select]
waitms (1500)
KEYDOWN  (#F)
waitms (500)
KEYUP   (#F)
waitms (2000)

$check = 0
WHILE($check = 0)
   GETSCREEN(679,375,679,375) // ограничиваем область снимка и цветокоррекции одним пикселом для ускорения
   COLORMODE (6,679,375,679,375)
   $clr = PXL (679,375)
   IF(($clr = 2039647) | ($clr = 2039615) | ($clr = 4144959) | ($clr = 4145023))
//      logwrite ("o", $clr)
      waitms (100)
      KEYDOWN  (#F)
      waitms (100)
      KEYUP   (#F)
      waitms (3000)
      $check = 1
   ELSE
//      logwrite ("w", $clr)
      WAITMS(5) // нужна небольшая задержка для разгрузки процессора
   END_IF
END_CYC

Tvlad

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Спасибо что объяснил, Oraven. Конечно же нужны были общие скобки. Упустил из виду. ЗА код тоже отдельное спасибо. Теперь более красиво. Goto помню еще с Бейсика, поэтому и применил.
Ещё раз спасибо за науку.