![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Картинку в чужой кадр!!! [Delphi, Windows]
Navi1982 © (2004-08-20 17:34:00)Напрямую в память видюхи нельзя загнать картинку?Или как нибудь иначе, чтобы показать сообщение администратора прямо в самой игре...
У меня проэкт горит... плиз!;-(
В принцыпе я понимаю, что там всякий кадр перерисовывается и даже я если попытаюсь в видюху загнать свою картинку, то она там долго не продержится... Я подумал, может через таймер какой? Но суть не в этом, МНЕ ГЛАВНОЕ ЗНАТЬ КАК ПОСТАВИТЬ НАПРЯМУЮ КАРТИНКУ В КАДР???.
Буду признателен.
Yanis (2004-09-20 18:08:00) [1]Если уж
> ... проэкт горит... ;-(
На форму разместить таймер с интервалом = 1.
Timer1.Enabled := False;
Form1.FormStyle := fsStayOnTop;
Form1.Show;
Timer1.Enabled := True;
Нет такого окна которое моглобы перекрыть такое окно :)
Sapersky (2004-09-20 13:50:00) [2]Недавно наткнулся на madCollection ( http://www.madshi.net/olddlp0.htm) - там есть пример перехвата инициализации и вызовов методов D3D (устанавливается wireframe-режим во всех D3D-играх - кстати, полезно в плане изучения полигональной структуры игровой графики).
Можно вывести и сколько времени осталось - например, перехватить EndScene, вывести время и вызвать реальный EndScene - получится "поверх всего". А по истечении времени - вытворить что-нибудь жуткое :), например, заменить все текстуры на свою с надписью "game over" :) Геймеров кондратий хватит :)
OSG (2004-08-23 16:32:00) [3]А если нужно по нажатию клавиш показывать данные: ставишь хук на клаву и потом показываешь данные при нажатии комбинации клавиш. Про хуки и DC информацию можно найти здесь же на сайте.
OSG (2004-08-23 16:18:00) [4]Кстати идет и под OpenGL и DirectX. Используется простой GDI
OSG (2004-08-23 16:08:00) [5]Ты можешь выводить инфу на нулевой DC в таймере. Конечно будет дергаться картинка, но зато результат будет виден.
Navi1982 (2004-08-22 19:59:00) [6]ДА, это для компьютерного зала... А выпендрёжь мне такой нужен, чтобы предупреждать надаедливых клиентов, которые через каждые 3 минуты спрашивают скока им времени осталось. Вот я и хочу им предложить нажать комбинацию клавишь и у них появится время на экране (мощьность компов позволяет :-) ) А ещё, у меня есть идея по борьбе с шумом в зале.
Sapersky, вам отдельное спасибо. Поищю.
Ландграф Павел (2004-08-21 22:07:00) [7]Ужас, я так понимаю это для игрового зала? ну блокируй клаву просто и все, или сварачивай все что запущено, и выводи свой текст с заблакированной клавой... а про 25-й кадр забудь=) в досе можно... винда не допустит тебя к поверхности...
Sapersky (2004-08-20 23:41:00) [8]показать сообщение администратора прямо в самой игре...
Зачем такой выпендрёж? Нельзя принудительно свернуть игру и показать MessageBox?
Напрямую в память видюхи нельзя загнать картинку?
Наверное, можно - если драйвер написать :)
Иначе, ИМХО, только через посредников - DX, OGL.
Ну возьмём DX для примера. Если отдельно инициализировать устройство DX в своей программе - вряд ли что-то получится, т.к. одновременно может быть активно только одно DX-приложение, и при активизации они обычно всё очищают/перерисовывают, так что если и запихать что-то в видеопамять - оно даже на экране не появится, скорее всего.
А вот если получить DX-устройство, которое использует целевое приложение... тогда можно напортачить, наверное :) В DirectDraw и (возможно) OGL можно включить оверлей, и его никакая перерисовка не убъёт. В D3D нет, но можно ещё что-нибудь придумать...
Проблема в том, как получить устройство. В DirectDraw можно попробовать перехватом ф-ии DirectDrawCreate (в OGL - соответствующей ф-ии, создающей контекст), в D3D таким образом можно получить только IDirect3D, а нужен IDirect3DDevice... Перехват Com-вызовов для меня вещь ещё более тёмная, но не исключаю, что в принципе это возможно...
Да, и всё это, как я понимаю, должно происходить в адресном пространстве целевого приложения, т.е. во внедрённой DLL.
В общем, задача весьма сложная, и если проект уже горит, лучше не дёргаться :) Но если таки хочется - копайте по всем непонятным словам, которые встретились в тексте сообщения :)
Mihey_temporary (2004-08-20 23:08:00) [9]Попробуй выводить сообщения путём DirectX, наверное через Overlay. Насколько я помню, у DirectX есть принцип, кто последний GDI захватил, тот и рисует.
Navi1982 (2004-08-20 22:29:00) [10]Кхе... А будьте так любезна подсказать кодиком? хотяб принцып по подробнее?
Darthman (2004-08-20 18:42:00) [11]Ага, вызывается смена буфером и начинается заполнение следующего кадра.
Navi1982 (2004-08-20 18:34:00) [12]Вот что ещё пришло мне в голову... Навярнека там у видюхи какие-то флаги состояния есть... Так вот, КАКИЕ? и КАК УЗНАТЬ ИХ СОСТОЯНИЕ? Ведь, в конце то концов Виндоуз как-то переключается :-)
И ещё я думаю, что когда обрисовывается кадр (заливаются текстуры) в видюхе, то по окончанию этого момента там возникает событие которое фиксируется в каком-то из флагов состояния.
Кто что про это знает?