![]() |
eXeL@B —› Вопросы новичков —› Как научить видеть игру широкоформатные мониторы? |
<< . 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 23 декабря 2012 19:07 · Личное сообщение · #1 Здравствуйте. Нашёл CD древней игрушки, но после установки, заметил, что разработчики ограничились только самыми распространёнными разрешениями экрана. Возможно ли сделать каким-либо образом поддержку 1366х768, 1920х1080? Прикладываю файлы кинфигуратора разрешения. пароль: exelab ![]() ----- Ламер - не профессия :)) ![]() |
|
Создано: 19 января 2013 22:15 · Поправил: aspirin · Личное сообщение · #2 Получил лог с адресами, подскажите пожалуйста, что делать дальше? ![]() ----- Ламер - не профессия :)) ![]() |
|
Создано: 22 января 2013 18:32 · Поправил: aspirin · Личное сообщение · #3 В исходниках Plugin.cpp я нашёл следующую запись: Code:
В логе вызовов немного другой вариант: 05025208 IDirectDraw2_SetDisplayMode(002DB528, 00000320, 00000258, 00000010, 00000000, 00000000) Можно ли добавить этот метод в исходник, не изменяя остальной код, или надо к IDirectDraw в листинге 2 добавить везде, как правильнее и лучше? add: циферку 2 добавил в исходнике всего в 2 местах. Code:
Игра теперь не видит сейвов, и картинка не растянулась, а на фоне чёрного экрана уехала в левый верхний угол, какие предложения есть? add2: Добавил как новый метод IDirectDraw2_SetDisplayMode, выставил 1366х768, и теперь игра падает с ошибкой: SetDisplayMode failed Знатоки, ну где же вы?? ----- Ламер - не профессия :)) ![]() |
|
Создано: 22 января 2013 19:04 · Личное сообщение · #4 |
|
Создано: 22 января 2013 19:22 · Личное сообщение · #5 |
|
Создано: 22 января 2013 19:27 · Личное сообщение · #6 |
|
Создано: 22 января 2013 19:40 · Поправил: aspirin · Личное сообщение · #7 ajax как-то странно написан вообще код, перебил везде 1280 на 1366 - вообще не запускается сразу...ну что ж это такое...На предыдущей странице есть ссылка на этот плагин с исходником, можете посмотреть, что там к чему? Циферки все перебил, но изображение по-прежнему не растягивается, только уходит в левый лерхний угол, прикладываю исходник с изменениями. ![]() ----- Ламер - не профессия :)) ![]() |
|
Создано: 23 января 2013 17:08 · Поправил: ARCHANGEL · Личное сообщение · #8 Интересн чисто алгоритмический момент. У нас есть монитор, любой. На нём рисуется двумерное изображение, которое является набором точек. Т.е. эта своеобразная матрица. Давайте представим, что у нас есть некая матрица, в которой 3 строки и 5 столбцов: ______________ |__|__|__|__|__| |__|__|__|__|__| |__|__|__|__|__| В С/С++ для обращения к двумерным массивам по указателю используется такой синтаксис: buff[i][j], где i - номер строки, j - номер столбца. Если использовать для адресации значений декартову систему координат, то можно сказать, что к массивам надо обращаться по координатам [Y][X]. В мониторах всё наоборот: 1366х768 означает, что в одной строке у меня поместится 1366 точек, а строк всего 768, т.е. 768 строк на 1366 столбцов. Ок, с этим разобрались. Если нет никаких возражений - едем дальше. Для отображения игры на широкоформатном мониторе нам нужно смасштабировать картинку. Т.е. увеличить либо уменьшить исходное изображение. Для нас интересна операция увеличения, т.к. 640х480 точек мы практически в любой игре можем наблюдать, а мониторы современные (или не очень) в состоянии давать бОльшую картинку (с большей детализацией). Давайте вернёмся к матрице 3 х 5. Всего в ней 3*5=15 элементов (точек). И если мы хотим выполнить увеличение, скажем, в два раза, мы должны каждый элемент заменить матрицей 2х2. Все элементы такой матрицы будут содержать значение нашей точки (увеличиваемого элемента). И тут - самое интересное. А что, если в результате я хочу получить матрицу 7 х 13? Давайте перед этим попробуем обощить алгоритм масштабирования. Изначально в нашей исходной матрице каждый элемент мы представляем некоей вырожденной матрицей, т.е. это такие матрицы, в которых 1 строка и 1 столбец. Чтоб увеличить количество столбцов, мы во все эти вырожденные матрицы заменяем на вектора с длиной равной 2. Ведь возможно увеличение лишь по одной из размерностей - по длине или по ширине. Но мы же не можем сдлеать вектор, длину которого будет, скажем, 1.5 или 1.75. Как мы тогда обратимся к такой ячейке видеопамяти? Т.е. увеличивать по нашему алгоритмы можно только в какое-то целое количество раз. Чтоб узнать, как нам нужно увеличивать матрицу, сделаем так: кол-во строк большей делим на кол-во строк меньшей, и также - со столбцами. 7/3= 2.333, 13/5=2.6. На такие значчения мы вырожденную матрицу не расширим. Значит нужен другой алгоритм. Интересно, какой? aspirin 1366/640=2.134375 - может, стоит поискать другой плагин? З.Ы. Немного поиска в гугле дали ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 23 января 2013 17:22 · Личное сообщение · #9 ARCHANGEL ваши рассуждения занимательны, но вывод следует из них один, в случае с моей игрой, этот метод работать не будет, и данный исходник бесполезен? Я ведь имею адреса: 05025208 IDirectDraw2_SetDisplayMode(002DB528, 00000320, 00000258, 00000010, 00000000, 00000000) Нельзя ли в самом .ехе жёстко забить нужное разрешение? Это как временный метод? А впоследствии под игру написать нормальную утилиту? ----- Ламер - не профессия :)) ![]() |
|
Создано: 23 января 2013 17:26 · Поправил: Veliant · Личное сообщение · #10 aspirin пишет: Нельзя ли в самом .ехе жёстко забить нужное разрешение? Это как временный метод? А впоследствии под игру написать нормальную утилиту? Собственно я своей DLL так и делал. Но есть одна проблемка - в главном меню все картинки фиксированных размеров и они по умолчанию не тянутся и не деформируются. В самой же игре какое укажешь разрешение, такое и будет, и игра худо-бедно пересчитывает под новые размеры. Надо просто во всех местах 3 фиксированных разрешения (800х600, 1024х768, 1280х1024) перебить на свои, чего я не сделал, поэтому были артефакты. Вариант с растяжением уже готовой картинки не пойдет т.к. будет мыло. Разве что выводить окно посередине экрана с черными полями ![]() |
|
Создано: 23 января 2013 17:31 · Личное сообщение · #11 |
|
Создано: 23 января 2013 17:35 · Поправил: Veliant · Личное сообщение · #12 ARCHANGEL пишет: А, как вы считаете, стоит ли пробовать такой подход. Берём разрешение 1280х1024, и интерполируем его до 1366х768 (уменьшаем). Сохранится ли чёткость или поплывёт? Не пропорционально же выйдет. До 960х768 можно попробовать с двумя полосами по бокам. С таким же успехом лучше выводить 1024х768 И все же я считаю нужно мучать сам игровой движок, чтоб он отрисовывал в нужном нам разрешении, тк это более универсально получится ![]() |
|
Создано: 23 января 2013 17:44 · Поправил: aspirin · Личное сообщение · #13 Veliant пишет: Надо просто во всех местах 3 фиксированных разрешения (800х600, 1024х768, 1280х1024) перебить на свои, чего я не сделал, поэтому были артефакты. Вы могли бы сделать вместо 800х600=1366х768, 1024х768=1920х1080? В виде .dll + .exe. Это временно мне потестировать, и посмотреть, где будут дефекты? add: в plugin.cpp, где я заменил все встречающиеся 1280 и 1024 на свои соответствующие, и скомпилировал библиотеку, сама картинка при запуске действительно не растягивается, только справа экран заполняется чёрным цветом. Но вот при начале новой игры, картинка растянулась почти полностью! Слева пропала полоса, а справа я вижу кусок рабочего стола. При разрешении в меню 1024х768, левая сторона также с низом впорядке, правая часть ещё сужается. При 1280х1024 картинка не опускается вниз, видимо, я перебивая параметры, напартачил, или нет? Какие идеи теперь? "И все же я считаю нужно мучать сам игровой движок, чтоб он отрисовывал в нужном нам разрешении, тк это более универсально получится" - также жёстко в него вбивать разрешения, или править алгоритм расчёта, что именно вы имеете ввиду? ----- Ламер - не профессия :)) ![]() |
|
Создано: 23 января 2013 20:20 · Поправил: DenCoder · Личное сообщение · #14 aspirin пишет: Игра теперь не видит сейвов, и картинка не растянулась, а на фоне чёрного экрана уехала в левый верхний угол, какие предложения есть? Ну не зря я выложил aspirin пишет: add: циферку 2 добавил в исходнике всего в 2 местах. aspirin пишет: Добавил как новый метод IDirectDraw2_SetDisplayMode, выставил 1366х768, и теперь игра падает с ошибкой: SetDisplayMode f В DirectDraw2 и подних версиях нужно либо корректно установить частоту для , либо 0 - система определит. BitsPerPixel - либо 32, либо 24. То есть в DirectDraw(1) меньше параметров, из-за этого и крах. ARCHANGEL пишет: Сохранится ли чёткость или поплывёт? И при уменьшении и при увеличении плывёт. Достаточно 12.5%(что я пробовал) в ту или другую сторону - маленький шрифт ещё опознаётся, но хорошо смыт, 25% - уже с трудом можно прочитать текст маленьким шрифтом. ----- IZ.RU ![]() |
|
Создано: 23 января 2013 21:03 · Личное сообщение · #15 DenCoder пишет: Ну не зря я выложил немного больший код, чем бы Вам хотелось. Одного SetDisplayMode мало! Мне пока что непонятно, как использовать Ваш код, если это просто кусок, который можно вставить в файл .cpp и скомпилировать, тогда да, тут всё ясно. А если к этому надо создать ещё хэдеры, то для меня это сложно. DenCoder пишет: В DirectDraw2 и подних версиях нужно либо корректно установить частоту для , либо 0 - система определит. BitsPerPixel - либо 32, либо 24. То есть в DirectDraw(1) меньше параметров, из-за этого и крах. Это понятно только тем, кто имеет опыт работы с графикой. DenCoder пишет: И при уменьшении и при увеличении плывёт. Достаточно 12.5%(что я пробовал) в ту или другую сторону - маленький шрифт ещё опознаётся, но хорошо смыт, 25% - уже с трудом можно прочитать текст маленьким шрифтом. В моём случае, половина шрифтов будет нечитабельна? (Там много мелких букв) ----- Ламер - не профессия :)) ![]() |
|
Создано: 23 января 2013 21:56 · Личное сообщение · #16 aspirin пишет: если это просто кусок, который можно вставить в файл .cpp и скомпилировать, тогда да, тут всё ясно. Нет! Предполагается определённая подготовка общая и конкретно по той причине, что кусок выдран из моего кода и подправлен на коленке с учётом специфики. aspirin пишет: В моём случае, половина шрифтов будет нечитабельна? (Там много мелких букв) Да! Чтобы этого не было, требуется основательно покопаться в коде игры или какая-то магия с большим запасом маны ))) ARCHANGEL пишет: Давайте перед этим попробуем обощить алгоритм масштабирования... На практике эта теория как-то может используется непосредственно в дровах видеокарт. Но DirectX - всего лишь добавка к gdi! И там преобразования проще ----- IZ.RU ![]() |
|
Создано: 01 февраля 2013 20:50 · Поправил: aspirin · Личное сообщение · #17 Veliant пишет: Надо просто во всех местах 3 фиксированных разрешения (800х600, 1024х768, 1280х1024) перебить на свои, чего я не сделал, поэтому были артефакты. Вы можете мне подсказать хотя бы адреса, где надо перебить значения? (Примером, как сделать) Или изменения зашиты в dll? ----- Ламер - не профессия :)) ![]() |
|
Создано: 01 февраля 2013 21:12 · Поправил: Veliant · Личное сообщение · #18 |
|
Создано: 01 февраля 2013 21:34 · Личное сообщение · #19 Veliant пишет: Честно говоря я уже снес игру давно, думал вопрос отпал Ну вы даёте ![]() ![]() Если будете продолжать идти в сторону отдельной dll, если не трудно, хоть немного в личку расскажите, как вы цепляете .ехе к dll, хотелось бы увидеть исходник, чтобы потом в последствии самому его можно было бы доработать. ----- Ламер - не профессия :)) ![]() |
|
Создано: 03 февраля 2013 18:14 · Поправил: Veliant · Личное сообщение · #20 |
|
Создано: 03 февраля 2013 18:24 · Личное сообщение · #21 |
|
Создано: 03 февраля 2013 18:31 · Личное сообщение · #22 Пока что только нашел способ растягивания по горизонтали, путем пропатчивания ехе и правки ресурсных ini файлов. Размер игровой области и положение правого сайдбара берется из координат текстур. По вертикали будет сложней. Точней игровая область будет нормально отображаться, а вот панели могут быть не отрисованы. Если только дописывать код. Да и меню пока что в 800*600 рисуется, независимо от установленного. С этим думаю можно решить проблему путем дописывания кода, который будет растягивать фоновое изображение. ![]() |
|
Создано: 23 февраля 2013 17:44 · Поправил: aspirin · Личное сообщение · #23 Итак, методом Veliant удачно растягивается горизонталь в игре. На этом проблемы исчерпываются, если ваше родное разрешение 1366х768. Я решил сделать ещё поддержку 1920х1080. Все разрешения забиты в коде самого .ехе. В итоге, поискав константу 500h=1280, я вижу в ольке следующий список адресов: ![]() В данном списке отстутствуют уже запатченные мною адреса. На данный момент игра запускается, но тут же падает, код следующий: ![]() Кто мог бы мне объяснить, почему падает, и как это поправить? CPU Disasm Address Hex dump Command Comments 0042270B |. C74424 1C 000 MOV DWORD PTR SS:[LOCAL.0],0 00422713 |. 8BCD MOV ECX,EBP 00422715 |. E8 D6A90800 CALL 004AD0F0 ; [Patrician3_unp_res9.004AD0F0 0042271A |. 8DBE 3C020000 LEA EDI,[ESI+23C] 00422720 |. C64424 1C 01 MOV BYTE PTR SS:[LOCAL.0],1 00422725 |. 8BCF MOV ECX,EDI 00422727 |. E8 F4240400 CALL 00464C20 ; [Patrician3_unp_res9.00464C20 0042272C |. 8D9E 30030000 LEA EBX,[ESI+330] 00422732 |. C64424 1C 02 MOV BYTE PTR SS:[LOCAL.0],2 00422737 |. 8BCB MOV ECX,EBX 00422739 |. E8 E2240400 CALL 00464C20 ; [Patrician3_unp_res9.00464C20 0042273E |. 8D8E 24040000 LEA ECX,[ESI+424] 00422744 |. C64424 1C 03 MOV BYTE PTR SS:[LOCAL.0],3 00422749 |. E8 A2A90800 CALL 004AD0F0 ; [Patrician3_unp_res9.004AD0F0 0042274E |. 8D8E 00050000 LEA ECX,[ESI+500] - надо ли патчить тут? 500 заменить на 780=1920 00422754 |. C64424 1C 04 MOV BYTE PTR SS:[LOCAL.0],4 00422759 |. E8 32750A00 CALL 004C9C90 ; [Patrician3_unp_res9.004C9C90 0042275E |. 8D8E 80060000 LEA ECX,[ESI+680] 00422764 |. C64424 1C 05 MOV BYTE PTR SS:[LOCAL.0],5 00422769 |. E8 92DF0800 CALL 004B0700 ; [Patrician3_unp_res9.004B0700 Ссылка на патченный ехе: http://files.mail.ru/63F981D3C03C4A4AB5574BED7D5D443F ----- Ламер - не профессия :)) ![]() |
|
Создано: 01 марта 2013 19:59 · Личное сообщение · #24 |
|
Создано: 31 марта 2013 14:48 · Поправил: aspirin · Личное сообщение · #25 Код самих разрешений в .ехе выглядит следующим образом: Code:
Сейчас .ехе запатчен мной на разрешение 1600х1024. Получается, что если мы правим координаты горизонтали, то у движка никаких претензий к нам нет, и всё нормально работает. Но если 640х400 заменить на 780х438, игра запустится, но при сохранении, к примеру, произойдёт вылет. Также сохранённые сейвы при патченной вертикали не работают. Кто может мне помочь? ----- Ламер - не профессия :)) ![]() |
|
Создано: 31 марта 2013 19:42 · Личное сообщение · #26 |
|
Создано: 31 марта 2013 20:26 · Поправил: aspirin · Личное сообщение · #27 Veliant, патчил исключительно по вашим адресам: 00023CAE: 0004 5605 00029BD1: 0004 5605 0002A0F6: 0004 5605 0002D295: 0004 5605 00032EFC: 0004 5605 00060016: 0004 5605 000640AA: 0004 5605 00145E55: 0004 5605 00145E8F: 0004 5605 00145ED7: 0004 5605 00145FB5: 0004 5605 Только последние снизу 2-3 адреса касаются разрешения: 1024х768, эти вообще не трогал. В других местах находил константы, но ничего не трогал. Veliant пишет: значит под каждое разрешение еще где-то жестко прописывается размер какого-то буфера Но тогда бы и патченная горизонталь не должна работать, раз они фиксированы. Проблема остаётся только в вертикали! Veliant, глядя на скрин в модуле ddraw вы понимаете, почему произошёл вылет? Если пройти по адресам, из которых в EAX, EDX записываются Dword,ы, то там увидим мусор (или совсем мне непонятный код). Вам прислать сюда патченный .ехе под 1920х1080? ----- Ламер - не профессия :)) ![]() |
|
Создано: 01 апреля 2013 20:30 · Личное сообщение · #28 Потестировал игру на 1600х1024, всё те же вылеты с отчётами. То при сохранении, то даже при загрузке сейва. Вот код, который я вижу, если перейти по адресам: Code:
то увидим: Code:
Что означает это мусор?? Code:
А также этот. Code:
И этот? Место вылета одно и тоже при пропатчивании хоть 1600 или 1920. ----- Ламер - не профессия :)) ![]() |
|
Создано: 01 апреля 2013 21:42 · Личное сообщение · #29 |
|
Создано: 01 апреля 2013 22:11 · Поправил: aspirin · Личное сообщение · #30 |
|
Создано: 07 апреля 2013 12:57 · Личное сообщение · #31 Итак, пропатчил я другие координаты - 1024х768 под 1920х1080, с константами проблем не возникло, их как ни странно, оказалось меньше, чем под другие разрешения. Потестировал вчера весь вечер, причина оказалась не в .ехе. Размеры текстур заданы для каждого разрешения в скриптах, чтобы их увидеть, надо распаковать .ехе. Если подгонять стандартные размеры текстур под более высокое разрешение вертикали, то игра перестаёт стабильно работать, в этом и была причина. Я просто вернул прежние координаты, и всё заработало, но в итоге остались справа пустые места. Кто опытный по текстурам, подскажите, я могу каким-либо образом дважды использовать имеющиеся текстуры? Впринципе, в игре есть статические текстуры, не имеющие текста, как бы их продублировать, чтобы заполнить вертикаль? Можно было бы и свои вставить, но как это сделать? На картинке понятно, о чём речь: ![]() ----- Ламер - не профессия :)) ![]() |
<< . 1 . 2 . 3 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Как научить видеть игру широкоформатные мониторы? |