Форум: "Игры";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
Внизвывод "поверх" игры Найти похожие ветки
← →
Luka.rus (2006-04-19 15:57) [0]в общем, всегда интерисовался, как можно вывести графику поверх уже запущенной игры, как это делает, например, fraps. да и многие другие программы.
если есть примеры, поделитесь. нет, тогда давайте обсудим, может сможем реализовать это.
также меня смущает то, то тот же Фрапс выводит поверх практически любой игры, независимо OpenGL или Direct3D..
← →
Pa5ha (2006-04-19 17:15) [1]Возможно он использует оверлей. Он ведь один :) Если занят, то выводит на оверлей. Чиста гипотеза.
← →
Luka.rus (2006-04-19 17:30) [2]врядли. если создать много окон, то он будет писать в каждое из них отдельно :( как же они это делают..
← →
Старик (2006-04-19 18:05) [3]берем GetDC нужного окна и рисуем на нем квадратики.
способ примитивен. единственное, что стоит обдумать, это как сделать, чтобы наше рисование было поверх игрового.
← →
Luka.rus (2006-04-19 18:12) [4]дело в том, что игровое окно обновляется очень быстро, у меня в некоторых играх ФПС больше 1000. нам надо рисовать с частотой в несколько раз превышающей ФПС, и даже так скорее всего будет мерцание..
← →
Luka.rus (2006-04-19 18:20) [5]вот этот код дает мерцание. даже если ФПС 60, в Варкрафте3:
stop:= false;
bmp:= TBitmap.Create;
whd:= FindWindow("Warcraft III", nil);
bmp.Canvas.Handle:= GetDC(whd);
while not stop do begin
bmp.Canvas.Draw(100,100, Image1.Picture.Graphic);
Application.ProcessMessages;
end;
теоретически он довольно часто должен рисовать :(
← →
XProger © (2006-04-19 18:51) [6]Перехватываем SwapBuffers...
← →
XProger © (2006-04-19 19:04) [7]http://www.yandex.ru/yandsearch?serverurl=gamedev.ru&text=Fraps
← →
Sapersky (2006-04-19 19:15) [8]...или в случае D3D - Present/EndScene.
Теория внедрения/перехвата - см. книгу Рихтера, в электронном виде должна быть здесь: http://rouse.front.ru/
Или статьи на wasm.ru:
http://www.wasm.ru/article.php?article=apihook_1
Библиотека madCodeHook:
http://www.madshi.net
Есть пример включения wireframe в D3D играх.
← →
Cash © (2006-04-19 19:39) [9]С опеновскими штуками - согласен с XProger-ом, токма шприц и иньекцию
придется делать.
А для D3D есть в SDK длл-ка, называется d3dspy@.dll (где @-версия SDK),
ее можно подключть к себе и пользовать полномоштабный перехват
интерфейсов.
Дожидаемся когда срабатывает EndScene у девайса и рендерим все, что
душе только заблагорассудится.
← →
Pa5ha (2006-04-19 20:46) [10]А windows media player на D3D или на OpenGL написан? :) Там ведь тоже фпс выводится и картинки с оверлея пизяца. Правда, в WinDVD некорректно.
← →
Fosgen (2006-04-19 21:30) [11]Это конечно вопрос: "а WINDOWS media player на чем писан?" А что, кто-то допускает мысль о windows писанной на OpenGL? Это что-то из разряда: "А машины у сотрудников в Microsoft на чем работают - на Windows или Linux?"
← →
Luka.rus (2006-04-20 00:30) [12]windows media player, насколько мне известно не использует ни ОГЛ ни Д3Д, хотя бы потому, что это библиотеки для работы в 3Д.
для вывода видео он иногда использует Директ. но не всегда, мне кажется это зависит от кодека.
← →
XProger © (2006-04-20 00:56) [13]Luka.rus, это зависит от настроек в свойствах проигрывателя ;)
← →
Nic © (2006-04-20 09:54) [14]Luka.rus (20.04.06 00:30) [12]
Direct Draw/Direct Show.
← →
Pa5ha (2006-04-20 17:23) [15]Вы не вкурили. Я к тому, что все, что здесь обсуждается по поводу перехвата свапа и endscene к фрапсу не относится и работает он по другому т.к. видео из проигрывателей он тоже грабит. Конечно, если все проигрыватели написаны на ddraw, то вопросов больше не имею.
← →
Sapersky (2006-04-20 19:24) [16]Если не на ddraw/dshow, то обычным методом - GetDC/BitBlt.
Кстати, BitBlt неплохо работает и в D3D (быстрее, чем GetFrontBuffer/GetBackBuffer). Во всяком случае, если вызывать "изнутри", из внедряемой DLL то есть.
← →
Лопух (2006-05-30 22:52) [17]Удалено модератором
Примечание: Создание пустых сообщений
← →
XProger © (2006-05-30 23:01) [18]Удалено модератором
← →
Galiaf © (2006-06-07 05:12) [19]Возможно я ошибаюсь но можно взять хэндл дэсктопа и прям на нём рисовать.
procedure TForm2. Button2Click(Sender: TObject);
var
dc: HDC;
begin
dc: = GetDC (0); // получаю ссылку на рабочий стол
Rectangle (dc, 10, 10, 110, 110);
ReleaseDC (Handle, dc);
DeleteDC (DC);
end;
- это Краснов писал, когда я пробовал, вывело мне квадратик прям поверх программы, сейчас точно не помню, так просто мысль выложил.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c