Auf Screen von "fremden" Spiel zeichnen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Auf Screen von "fremden" Spiel zeichnen?

Beitrag von Programie »

Hi,

Ich hab mal wieder ein kleines Problem.
Und zwar: Wie kann auf einen Screen eines Spiels (im Vollbildmodus) zeichnen? Das Spiel ist nicht mein Programm, welches auf den Screen zeichnen soll!

Ich hab es so mal probiert, was aber nicht so gut ist:

Code: Alles auswählen

Memory=AllocateMemory(1024)

Repeat
 PokeL(Memory,#True)
 StartDrawing(Memory)
  DrawText(10,10,"Test mit PureBasic")
 StopDrawing()
 Delay(5)
Until GetAsyncKeyState_(#VK_ESCAPE)
InvalidateRect_(#False,#False,#False)
Wenn ich den Code während das Spiel läuft ausführe, wird der Text "Test mit PureBasic" mit einem "Flimmereffekt" dargestellt.
Das Komische ist, dass der Text auf dem Windows-Desktop normal angezeigt wird.


Gibt es eine bessere Möglichkeit, wie man das machen könnte?

Danke schonmal im vorraus! :allright:
BildBildBildBild
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Such mal im Board nach Overlay, TSO, Teamspeak Overlay glaub hab da irgendwo nen Code gesehen der dein Problem löst.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

D@nte hat geschrieben:Such mal im Board nach Overlay, TSO, Teamspeak Overlay glaub hab da irgendwo nen Code gesehen der dein Problem löst.
Danke! :allright:

Hab das gefunden: Textoverlay in anderen Anwendungen (Spielen) ?
BildBildBildBild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Auf Screen von "fremden" Spiel zeichnen?

Beitrag von Kaeru Gaman »

Programie hat geschrieben:Wenn ich den Code während das Spiel läuft ausführe, wird der Text "Test mit PureBasic" mit einem "Flimmereffekt" dargestellt.
Das Komische ist, dass der Text auf dem Windows-Desktop normal angezeigt wird.
dann hast du immerhin schon einen der beiden buffer erreicht.
erinner dich: screen arbeitet mit double-buffer.

(was mich bei deinem code allerdings wundert... wo hast du den pointer zum grafik-mem)

...wenn ein fensterobjekt über einen screen kommt (auch das debug-fenster über einen selbsterstellten screen),
dann erscheint es nur in jedem zweiten bild, weil nur das handle des einen buffers genommen wird.

du müsstest also beide handles für beide buffer ermitteln,
und in beide deine darstellung reinschreiben.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Ich hatte auch mal die Idee, sowas zu machen. Hast Du das fuer Windows oder Linux geplant (wg. Avatar)?

Um sowas hinzugekommen musst Du:
1. Einen Hook auf eine Funktion setzen, die den Backbuffer zum Frontbuffer tauscht.
2. Die Funktion zum Tauschen der Buffer durch eine eigene Funktion ersetzen, in der vor dem Tausch noch der Backbuffer um Deinen Text/Deine Grafiken erweitert wird.

Unter DirectX ist das leider etwas sehr kompliziert, weil das ganze auf COM (Klassenmodell) basiert und man so nur schwer an die zu hookenden Funktionen kommt.

Folgende Funktionen sollten gehookt werden:
- Flip() bis DirectX 7
- Present() ab DirectX 8
- wglSwapBuffers() fuer OpenGL

Schau Dir mal den Speedometer-Mod fuer GTA an, in dem ein Analog-Tachometer in's Spiel eingeblendet wird. (Der Quellcode ist verfuegbar unter http://www.pawfectfilms.com/mods/speedo_src.zip)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Frage: Wenn ihr ein brauchbares Ergebnis habt, könnt ihr dann was nützliches hier rein stellen? Ich hätte da auch Interesse dran.

> dann hast du immerhin schon einen der beiden buffer erreicht
Und wie/wo kriege ich den adneren? Da die Adresse für den einen Buffer 1 ist, habe ich entsprechend auch andere Werte probiert: -1, 0, 2, 4... nichts geht?


Wo ist denn eigentlich der Unterschied zwischen DX 7, DX 8, DX 9, bald auch DX 10 und OpenGL? Ich persönlich will einfach nur auf'n Screen zeichnen, egal wie. Und es sollte auf möglichst allen System einfach nur laufen.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Da die Adresse für den einen Buffer 1 ist
wus? kann ja ganich sein...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Neeeeein, du weißt doch, man Poked doch den Long 1 in einen AllocateMemory und übergibt StartDrawing die Adresse dieses AllocateMemory.

Das meinte ich. Ich hatte nur keine Lust das so ausführlich hinzuschreiben.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja schön, dann hab ich das im speicher stehen, aber ich wills doch aufm screen haben.
was hab ich denn davon, wenn ichn muster im speicher hab, is doch hirnrissig...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Das Problem ist einfach dass es flackert, wenn ihr es nicht mit der Ausgabe per OpenGL/DirectX synchronisiert. Was bringt dir der beste Zugriff auf den Buffer, wenn der nach jedem Bild veraendert wird. Die eigene Grafik muss im Backbuffer sein, bevor die Buffer getauscht werden.

Deshalb mein Post oben.
Antworten