Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Custom Graphics.freeze и Graphics.transition

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29117

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
Вопрос к скриптерам, есть идеи как народными средставми реализовать
Graphics.freeze и Graphics.transition ?
Дело все в том, что Graphics.freeze сохраняет область 640х480 и ни пикселем больше. Graphics.transition берет ее в качестве исходника при переходе. Следовательно, при разрешение 1024х768 такой вариант не катит. Я уже переделал смену сценок методами fadeout и fadein (прикрутил эти фичи из VX), однако хотелось бы и стандартные переходы оставить. Тот же переход к бою с ними смотрится куда эффектнее.
Следовательно нужно либо переписать Graphics.freeze так, что бы он запоминал большую область экрана и Graphics.transition умел с ней работать, либо переписать их обоих. И вот здесь появляются сложности: Graphics.transition делает переход на основе серого градиента. Все это прекрастно, но средставами руби это выглядит, как взятие пикселя с перехода, расчета среднего между его составными частями (red+green+blue) / 3, обращением относительно 255 и последующей заливкой запомненного изображения прозрачностью. Итого: взять пиксель, посчитать, установить пиксель. Для разрешения 1024х768 эта операция будет проделана 200 540 160 раз. Если учесть, что после каждого такта цикла (0...255), будет вызываться Graphics.update - 786 432 раз. Но это утешает слабо.
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29131

  • Sirius
  • Sirius аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 66
Для разрешения 1024х768 эта операция будет проделана 200 540 160 раз. Если учесть, что после каждого такта цикла (0...255), будет вызываться Graphics.update - 786 432 раз. Но это утешает слабо.

А для разрешения 640х480?
И вот что интерестно, в VXе разрешение 544×416, а Graphics.freeze сохраняет область 640х480 как ты сказал. Неужели ЭфирныеМозги поленились переделать эту часть кода? Или эо сделанно специально?

З.Ы. Тут только до 640х480 :(

З.З.Ы.
Все это прекрастно, но средставами руби это выглядит, как взятие пикселя с перехода, расчета среднего между его составными частями (red+green+blue) / 3, обращением относительно 255 и последующей заливкой запомненного изображения прозрачностью. Итого: взять пиксель, посчитать, установить пиксель.

Скажи, это в каком скрипте именно прописано? Хочу тоже голову поломать :)
Последнее редактирование: 14 года 6 мес. назад от Sirius.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29136

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
А для разрешения 640х480?
По количеству пикселей. :) 640 * 480 = 307 200 раз за один такт. Прозрачность у нас варьируется до 255, следовательно всего 78 336 000 раз
И вот что интерестно, в VXе разрешение 544×416, а Graphics.freeze сохраняет область 640х480 как ты сказал. Неужели ЭфирныеМозги поленились переделать эту часть кода? Или эо сделанно специально?
Я вообще не очень понимаю - зачем ЭфирныеМозги вводят те или иные ограничения. XP они сделали 640х480, тогда, как самым ходовым было 1024х768. Далее VX - кастрация до 544х416, заодно урезали боевку и тайлсеты. Да, при этом они ввели возможность менять размеры окна без методов WinAPI, но не потрудились ни выложить код Tilemap (низки поклон poccil), ни починить переходы. Я не понимаю почему. Видать, мозги и впрямь эфимерные...
Скажи, это в каком скрипте именно прописано? Хочу тоже голову поломать
Этого скрипта не существует. :) Это мое предположение - как можно реализовать переход. Других идей я пока не вижу. Можно сделать уход-во-тьму, выход-из-тьмы, как это сделано сейчас у меня. Можно сделать дефолтный переход (мы условно принимаем, что скриншот сделать возможно, ибо где-то я скрипт видел). А вот как еще можно, основываясь на черно-белоом рисунке, сделать переход? Я это вижу примерно так...
module Graphics
  def self.transition(duration = 60, filename = "", vague = 40) 
    trans = Bitmap.new("Graphics/Transitions/#{filename}")
    k = duration.to_f / 255
    i = 0; while i < (255 - vague) * k
      for y in 0...$frozen.height
        for x in 0...$frozen.width
          color = trans.get_pixel(x, y)
          a = [(255 - (color.red + color.blue + color.green) / 3) * k, 1].max
          color = $frozen.get_pixel(x, y)
          color.alpha = -= a
          $frozen.set_pixel(x, y,  color)
        end
      end
      i += 1
    end
    $frozen.dispose
    $frozen = nil
  end
end

Естсественно, это лишь предположение. Я даже не пробовла это запустить, и допускаю наличие синтаксических ошибок.
Вот, пока писал, еще подумал, что get_pixel можно прогнать для обеих картинок в самом начале и заполнить хэш, и брать инфу уже из него. Но 786 432 установок пикселя никуда не денутся... >_>

И еще - должен же Graphics.freeze где-то хранить скриншот! Знать бы где? В себе не может - это модуль. Значит в глобальной переменной?.. >_>
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Последнее редактирование: 14 года 6 мес. назад от Equilibrium Keeper.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29165

  • Sirius
  • Sirius аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 66
По количеству пикселей. 640 * 480 = 307 200 раз за один такт. Прозрачность у нас варьируется до 255, следовательно всего 78 336 000 раз

Обе цифры страшные :) Всего в 3 раза разница, это смертельно?
И еще - должен же Graphics.freeze где-то хранить скриншот! Знать бы где? В себе не может - это модуль. Значит в глобальной переменной?.. >_>

$game_temp.background_bitmap это чтоль?
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29175

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
Обе цифры страшные Всего в 3 раза разница, это смертельно?
Не знаю. Никогда не делал ничего подобного. Вот градиентную заливку с помощью обычной - делал. Там 1024х768 заливается меньше чем за секунду. Но там то всего 1024 (или 768), а не несколько сотен тысяч...
$game_temp.background_bitmap это чтоль?
Неа - в XP такого вообще не существует. Да и Graphics.freeze можно вызвать в самом начале - тобишь создаваемые дальше $game_*** он не трогает. Только уже созданные на момент запуска переменные. Попробовать порыть $1, $2,..,$9 что-ли? Но вряд ли...
---
Нет, они остаются пустыми... =\
Хуже всего, если Graphics написан на C и хранит картинку в переменных недоступных из руби...
Так бы можно было просто подсунуть ему новую картинку. А так - только переписывать оба метода...
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Последнее редактирование: 14 года 6 мес. назад от Equilibrium Keeper.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29186

  • Sirius
  • Sirius аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 66
Жаль я мало разбираюсь в том, как там графика работает. Но вот в RGSS2 вместо Graphics.freeze можно попробовать Graphics.snap_to_bitmap. ХЗ поможет ли... А так, раскрутить разрешение до 1024 х 768 было бы очень даже неплохо!
Хуже всего, если Graphics написан на C и хранит картинку в переменных недоступных из руби...
Так бы можно было просто подсунуть ему новую картинку. А так - только переписывать оба метода...

Кстати, в Си можно вставлять код ассемблера. Руби ведь на Си написан, там наверно тоже Си код можно воткнуть... :)


Вот что-то с этой области:
Последнее редактирование: 14 года 6 мес. назад от Sirius.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29192

  • Agckuu_Coceg
  • Agckuu_Coceg аватар
  • Вне сайта
  • Архитектор Миров
  • Простой Гинтокист с огромной внутренней ленью.
  • Сообщений: 1549
  • Спасибо получено: 329
  • 3 местоПобедитель конкурсаПисатель 2 местоОрганизатор конкурсов2 место Готв
Sirius писал(а):
Кстати, в Си можно вставлять код ассемблера. Руби ведь на Си написан, там наверно тоже Си код можно воткнуть... :)

Ну, Руби - отдельный язык программирования, но его алгоритмы в принципе похожи на C и C++. Я честно говоря не уверен, что в него воткнуть ассемблер, но если это прокатит, то это будет реальная жуть.

А что именно нужно, Кипер? Система изменения размера экрана, что ли?
Огромный любитель среброволосых или пепельноволосых 2D-девушек с хорошим характером или со скрытыми привлекательными чертами.
Последнее редактирование: 14 года 6 мес. назад от Agckuu_Coceg.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29195

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
А ты прочитай первое сообщение в теме. -_-
"Система изменения размера экрана" уже написана и готова. Все работает корректно за исключением 2х моментов:
1) Тормоза на картах с большим количеством анимированных автотайлов (например, если все залить автотайловой водой).
2) Переход при помощи Graphics.transition осуществляется только для области 0, 0, 640, 480.
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29233

  • Agckuu_Coceg
  • Agckuu_Coceg аватар
  • Вне сайта
  • Архитектор Миров
  • Простой Гинтокист с огромной внутренней ленью.
  • Сообщений: 1549
  • Спасибо получено: 329
  • 3 местоПобедитель конкурсаПисатель 2 местоОрганизатор конкурсов2 место Готв
Equilibrium Keeper писал(а):
А ты прочитай первое сообщение в теме. -_-
"Система изменения размера экрана" уже написана и готова. Все работает корректно за исключением 2х моментов:
1) Тормоза на картах с большим количеством анимированных автотайлов (например, если все залить автотайловой водой).
2) Переход при помощи Graphics.transition осуществляется только для области 0, 0, 640, 480.

Ну, первое ещё возможно решить с помощью анти-лага.
А вот со вторым я не в курсе. Можно, конечно полазить в других скриптах изменения размера экрана, и посмотреть, как оно выглядит.
Огромный любитель среброволосых или пепельноволосых 2D-девушек с хорошим характером или со скрытыми привлекательными чертами.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29235

  • mephis
  • mephis аватар
  • Вне сайта
  • Светлый дракон
  • Коллекционер
  • Сообщений: 727
  • Спасибо получено: 122
  • ПереводчикУчитель
Да никто там ничего не придумал. Народ пришёл к выводу, что надо переписывать RGSS*.dll и game.exe. Уже несколько проектов этому посвящено.
→ → ↓ ↑ Y
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29319

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
Agckuu_Coceg
Извини, но ты не в теме. :) Какой к черту антилаг? Там проблема в алгоритме отрисовки автотайлов.

mephis
Ммм... Ну и хрен с ним, по большому счету. Заменю все темными переходами. Разрешение дороже. -_-

Еще вопрос - а никто не в курсе из-за чего происходит мерцание при скроле карты? При любом разрешении, даже на стандартном движке. Особенно заметно, если залить большую карту одним тайлом и пройтись по ней...
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29323

  • Agckuu_Coceg
  • Agckuu_Coceg аватар
  • Вне сайта
  • Архитектор Миров
  • Простой Гинтокист с огромной внутренней ленью.
  • Сообщений: 1549
  • Спасибо получено: 329
  • 3 местоПобедитель конкурсаПисатель 2 местоОрганизатор конкурсов2 место Готв
Ты говорил про тормоза на картах при авто-тайловой отрисовке. Я тебе и ответил, что такие проблемы можно сгладить антилагом.

Эффект мерцания происходит лишь на некоторых мониторах из-за эффектов системы скролла камеры Мозго***в. Проблема нерешаема.
Огромный любитель среброволосых или пепельноволосых 2D-девушек с хорошим характером или со скрытыми привлекательными чертами.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29325

  • mephis
  • mephis аватар
  • Вне сайта
  • Светлый дракон
  • Коллекционер
  • Сообщений: 727
  • Спасибо получено: 122
  • ПереводчикУчитель
Equilibrium Keeper, вообще, на каком-то из забугорных форумов я читал, что некий товарищ написал dll-ку, с функцией захвата изображения с указанного окна. И вызывал её, через скрипты в Руби. Она даже называлась - Transition. Надо поискать...
→ → ↓ ↑ Y
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29338

  • Sirius
  • Sirius аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 66
Насчет мерцания: Как купил себе: ЖК монитор 22 дюйма Acer, при полноэкранном развороте в 2003 и в VXе изображение начинает дико мерцать. В ХР же все нормально. Причем, мерцание только при фулскрине. В других играх замечено не было. Обливионы и тому подобные при полноэкранном режиме работали нормально. Игры на эмуляторе GBA тоже без проблем идут на полном эжкране. Дрова последние ставил, DX тоже. Как то спрашивал на ГДСА, там никто не в курсе. Посоветовали поставить старые дрова, но я думаю тут проблема именно в мэйкере...
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29340

  • mephis
  • mephis аватар
  • Вне сайта
  • Светлый дракон
  • Коллекционер
  • Сообщений: 727
  • Спасибо получено: 122
  • ПереводчикУчитель
Как это не решаема? За бугром вот советуют Аппаратное ускорение снизить до 3-го деления. И мерцание пройдёт.

Кстати, насчёт скрипта разрешения. Помню тему, где за правильно работающий скрипт, меняющий разрешение и убирающий мерцание, сулили штукас баксов. Но, вроде как безрезультатно.
→ → ↓ ↑ Y
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29347

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
А у меня в XP и в окне... >_>
Эх, вот и не знаю - то ли браться за грейд мейкера, то ли писать движок на MMF... В последнем не хватает уже родного Руби. А в мейкере - гибкости. >_>

А хотел написать на RGSS оболочку для баз. :) Тобишь тот же RPG Maker, только игровыми средствами - можно было бы добавлять любые поля в базу данных, менять интерфейс как угодно и тут же тестировать работу скриптов... Но вот эти неменяемые элементы убивают все желание этим заниматься...
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29348

  • mephis
  • mephis аватар
  • Вне сайта
  • Светлый дракон
  • Коллекционер
  • Сообщений: 727
  • Спасибо получено: 122
  • ПереводчикУчитель
Значит нужно переписать неменяемые элементы, game.exe & rgss*.dll.
→ → ↓ ↑ Y
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29517

  • Agckuu_Coceg
  • Agckuu_Coceg аватар
  • Вне сайта
  • Архитектор Миров
  • Простой Гинтокист с огромной внутренней ленью.
  • Сообщений: 1549
  • Спасибо получено: 329
  • 3 местоПобедитель конкурсаПисатель 2 местоОрганизатор конкурсов2 место Готв
mephis писал(а):
Equilibrium Keeper, вообще, на каком-то из забугорных форумов я читал, что некий товарищ написал dll-ку, с функцией захвата изображения с указанного окна. И вызывал её, через скрипты в Руби. Она даже называлась - Transition. Надо поискать...

Этот кто-то - некий Selwyn с RMXP.ORG. И скрипт называется Resolution, а не Transition, mephis.

Что касается самого скрипта - я его нашёл. И скрипт, и display.dll.

Скрипт
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]

Ссылка на *dll:
ССЫЛКА

По этому скрипту целую кучу других скриптов изменения разрешения написали... Я встретился по меньшей мере с тремя.
Огромный любитель среброволосых или пепельноволосых 2D-девушек с хорошим характером или со скрытыми привлекательными чертами.
Последнее редактирование: 14 года 6 мес. назад от Agckuu_Coceg.
Администратор запретил публиковать записи гостям.

Custom Graphics.freeze и Graphics.transition 14 года 6 мес. назад #29554

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
И что это за разврат? В принципе, у меня нечто похожее, вот только я одного не понимаю - зачем было писать DLL, если для сменя разрешения подходит стандартная функция WinAPI?..
#-----------------------------------------------------------------------------
  # Перемещает окно
  # Возвращает :integer - 0 при ошибке
  # 1 :handle  - дескриптор окна
  # 2 :integer - координата x окна
  # 3 :integer - координата y окна
  # 4 :integer - ширина окна
  # 5 :integer - высота окна
  # 6 :integer - если 1 - окно будет перерисовано
  #-----------------------------------------------------------------------------
  MoveWindow = Win32API.new('user32','MoveWindow',['l','i','i','i','i','i'],'i')
  #-----------------------------------------------------------------------------

В любом случае, к переходам это никоим местом не относится, так что хватит оффтопить.
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Последнее редактирование: 14 года 6 мес. назад от Equilibrium Keeper.
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.344 секунд