Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Картинку в чужой кадр!!! [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]

Вот что ещё пришло мне в голову... Навярнека там у видюхи какие-то флаги состояния есть... Так вот, КАКИЕ? и КАК УЗНАТЬ ИХ СОСТОЯНИЕ? Ведь, в конце то концов Виндоуз как-то переключается :-)

И ещё я думаю, что когда обрисовывается кадр (заливаются текстуры) в видюхе, то по окончанию этого момента там возникает событие которое фиксируется в каком-то из флагов состояния.

Кто что про это знает?


Наверх

Титульная страница Поиск, карта сайта Написать письмо