![]() |
eXeL@B —› Программирование —› Как правильно осуществить перехват DirectDrawCreate и дорисовать свою графику? |
Посл.ответ | Сообщение |
|
Создано: 30 мая 2009 16:17 · Личное сообщение · #1 Хотелось бы узнать, как правильно выводить свою графику в DX приложении. Например игра работает в полноэкранном режиме с разрешением 640х480, перехватом DirectDrawCreateEx окно делают 800х600, рисуют свою картинку, а в заданном месте продолжает выводится DX анимация с размером 640х480. Как многие уже догадались, таким образом делают поддержку тачскрина для некоторых игр. Очень интересует сам принцип того, что для этого нужно сделать. Очень бы помогли примеры на Delphi или объяснение на пальцах. С DX никогда не работал, почитал в гугле – без практики понял мало. Чужой пример реализации есть. Поверхностное изучение показало, что после перехвата идёт проверка интерфейсов IDirectDraw, IDirectDraw2, IDirectDraw4, IDirectDraw7, IDirectDrawSurface, IDirectDrawSurface2, IDirectDrawSurface3, IDirectDrawSurface4, IDirectDrawSurface7, далее не разобрался, но видимо устанавливаются свои обработчики? С тем как выводить картинку иди текст на поверхность DX думаю разберусь по англоязычным примерам которые видел в Интернете, а вот с превращением 640х480 в 800х600, при этом игра остаётся 640х480 – не понятно совсем. Очень прошу любой помощи, где почитать, примеры, советы! ![]() |
|
Создано: 31 мая 2009 21:51 · Личное сообщение · #2 Процесс немного сдвинулся с мёртвой точки, если кому интересно. Перехватываю DirectDrawCreateEx, затем получаю указатели на нужные интерфейсы. С помощью GetInterfaceMethod нахожу адрес входа в SetDisplayMode в нужном интерфейсе и далее ставлю хук. В своей функции меняю разрешение и вызываю оригинальную. Работает. Игра остаётся по своим размерам, за пределами появляется чёрное поле которое "блинкает". В принципе это всё легко было пропатчить... Кстати в изучении работы этого всего очень помог DX логгер от Рустама. Теперь осталось две задачи: 1) Менять позицию оригинального прямоугольника с игрой 640х480 на экране 800х600. Сейчас он с нулевых позиций выводится. 2) Рисовать что-либо в свободной области. Что интересно, есть масса примеров как это делать под DX9. С ddraw менее понятно. Например везде в примерах по хуканью DX9 используют некую функцию Present. Перехватив её пишут: //Your Drawing Code Here. This Function Gets Called Everytime The Surface Needs Refreshing Никак пока не разберусь где мне вставлять код для рисования, что бы отрисовывать всё непосредственно перед выводом на экран? ![]() |
|
Создано: 31 мая 2009 22:20 · Поправил: Rascal · Личное сообщение · #3 презент вроде аналогично флипу примари сюрфейса. копай в эту сторону. я на директдрау писал давно игрушку, многого уже не помню зы: я кстати реверсил какойто из капчуреров. там вся соль была в нахождении первичной поверхности и перехвата флипа. тока еще гемор с оверлеями. кстати рисуют свою картинку поверх таки оверлеями. можно рисовать прямо поверх картинки, которую рисует гама, причем без особого гемора. ----- Недостаточно только получить знания:надо найти им приложение ![]() |
|
Создано: 01 июня 2009 01:05 · Личное сообщение · #4 |
|
Создано: 01 июня 2009 01:18 · Поправил: Rascal · Личное сообщение · #5 ну я свое до ума не довел =) рипается сложно, точнее обрабатывается сложно, ибо очень много видов кодирования цветов. и я чета не нашел описания преобразований. правда и искал хуева. но рипается в ммоент флипа поверхности. через локинг поверхности и чтение битегов картинки. следовательно нада перехукать все и вся и найти примари и бек буфер и подменить в vtbl адреса. вроде так. хотя точно уже не помню, давно было все это. еще есть нетрадиционный способ получить указатели на интерфейсы директдрау. описано в книжке фень хуяня или как там его. этот метод юзает например снагит. можно рипать картинку из приложения, которое было запущено до твоего. т.е. без предварительного хука DirectDrawCreateEx зы: про цвета актуально при рипе твтюнеров, плееров и прочей лабуды. гамесы вроде ргб юзоют. ----- Недостаточно только получить знания:надо найти им приложение ![]() |
|
Создано: 01 июня 2009 02:45 · Личное сообщение · #6 |
|
Создано: 01 июня 2009 05:31 · Поправил: Rascal · Личное сообщение · #7 |
![]() |
eXeL@B —› Программирование —› Как правильно осуществить перехват DirectDrawCreate и дорисовать свою графику? |