Entwickler-Ecke

Multimedia / Grafik - Schreiben auf den Bildschirm einer DirectX-Anwendung


DracoBlue - Di 08.07.03 13:52
Titel: Schreiben auf den Bildschirm einer DirectX-Anwendung
Weiss jemand wie ich auf zum Beispiel auf den Bildschirm eines DirectX Spiels direkt schreiben kann?

Ich glaube das geht irgendwie mit DelphiX aber ich werd daraus nicht schlau.

Mfg,
DracoBlue


maximus - Di 08.07.03 15:15

Wenn du den quellcode vorliegen hast, oder er von dir geschrieben wurde, dann kannst du mit dem ID3DXFont interface text zeichnen, der allerdings für jeden frame neu gezeichnet werden sollte!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
uses d3dx9, d3d9, ...;
var  D3DXFont : ID3DXFont;
...
// init -> interface erzeugen lassen
D3DXCreateFont(D3DDev9, FFont.Handle, D3DXFont)
// draw rect ermitteln
var DrawRect : TRect;
..
D3DXFont.DrawTextA (PCHar (FText), length (FText), 
  DrawRect,DT_CALCRECT, FFont.Color);
// zeichnen
D3DXFont.DrawTextA (PCHar (FText), length (FText), DrawRect,
   DT_LEFT,(WorkColor and $FFFFFFor (WorkAlpha shl 24));


hoffe das hift dir weiter...?


DracoBlue - Di 08.07.03 16:21
Titel: Hmmm,
ich glaub mein Problem ist das Interface,

Text kann ich schreiben, aber dann kommt auf leinwand kann nicht geschrieben werden.

Mfg, DracoBlue

PS: Bei Fraps(.com) funktioniert das auch, siehe fps anzeige


maximus - Di 08.07.03 17:34

was fürne API benutzt du denn?

Zeig ma deinen render-loop bzw. DirectX inits.


DracoBlue - Mi 09.07.03 17:01
Titel: Hmmm,
Also ich verwende Delphix erstelle ein TXDraw

und schreibe dann per


Delphi-Quelltext
1:
dxdraw1.Primary.Canvas.TextOut(100,100,'Hallo');                    

das klappt auch soweit, wenn ich nur auf den Bildschirm schreiben will, wenn der Desktop aktiviert ist.

Wenn aber ein Spiel wie zum Beispiel GTA ViceCity gestartet ist (nutzt directx 9 oder 8.1) dann kann ich auf die Leinwand nicht schreiben, doer so!

Keine Ahnung was du mit API meinst, aber vielleicht helfen dir ja meine etwas "anfängerlichen" Quellcodezeilen weiter.

Mfg, DracoBlue


mimi - Mi 09.07.03 21:35

du willst also in gta3 ein text schreiben oder was meinst du ?

er meint mit api z.b. direcX oder OpenGl und da jetzt die komponenten samlung die du nutzt.


DracoBlue - Do 10.07.03 12:45

Jup, möchte in GTA (4) = ViceCity auf diese DirectX-Engine nen Text schreiben.


Bis denne, DracoBlue


maximus - Do 10.07.03 14:37

Na dann herzlichen glückwunsch...ähmm hast du dir mal überlegt, wie du den code in den render-loop von GTA rein bekommst?

...oder hast du etwa den source-code? ...wobei der garantiert nicht mit delphiX geschrieben wurde :roll:


mimi - Do 10.07.03 17:40

na wenn du das schafst musst mir es es umbedingt mal verraten wie du es angestellt hast:)

im ernst:
gta hat ne scrip sprache dabei, mit der kannst du es nur machen von ausen ist es fast unmöglich....


DracoBlue - Fr 11.07.03 14:47
Titel: Hmmm, aber FRAPS
Geht mal auf FRAPS.com dort gibts ein AufnahmeTool, welches wenn ich Szenen in GTA aufnehme oben einen Fragcounter anzeigt.

Und sowas möchtel ich auch *gg*.

Mfg, DracoBlue


PS: Hab bemerkt, dass es diese Sache auch bei z.B. dem WindowsMediaPlayer anzeigt


maximus - Fr 11.07.03 14:58

Entscheide dich mal, was du genau machen willst :wink:

Wenn es dein spiel und dein source-code ist, dann ist eine FPS-anzeige überhaupt kein problem!

Wenn es ein fremdes spiel ist, sprich GTA oder so, dann ist das für dich nicht möglich! Es sei denn das spiel hat die option, mit der mal den FPS-counter anstellen kann.

Was jetzt?


DracoBlue - Fr 11.07.03 15:26
Titel: hmmm
ARG *sorry*

das ist kein ingame FragCounter das ist ein Fraps-Frag-Counter, und den würde ich gern auch machen können, scheint nur ein schreiben auf die DirectX-Fläche zu sein.

Mfg, DracoBlue


mimi - Fr 11.07.03 16:17

Zitat:

Fraps-Frag-Counter

was ist das denn ?
wenn du es selbst machen willst, solltes du dir anschauen wie es GTA machen(auch wenn ich nicht weiß was du meinst :( )[/quote]


DracoBlue - Fr 11.07.03 16:33

Ladet euch einfach mal fraps runter und testet es, dann wisst ihr was ich meine.

http://fraps.com

Mfg, DracoBlue

PS: Mit Schreiben über die Script-Dateien schaff ich es auch, ich würd es halt bloss gern direkt über DirectX machen.


maximus - Fr 11.07.03 17:57

Wir reden aneinander vorbei :?

Du redest von 'Frags'...wo is da der zusammenhang? Dieses tool 'Fraps-Frag-Counter' is ein capture tool, dass FPS (Frames Per Second) anzeigen kann etc...soweit so gut :D oder hab dich schon wieder falsch verstanden?

IMHO´wäre dein vorhaben nur möglich, wenn du dir von einer laufenden anwendung Haupt-DirectX-Surfaces (Back-und FrontBuffer) ermitteln lässt und in dem entsprechenden DirectX-device-einen callBack registrieren läst, der dich anruft, sobald 'geflipt' werden soll...dann hättest du noch die möglichkeit watt auf die surface draufzuklatschen :wink:

Frag mich nicht wie das genau gehen soll...mit delphiX auf garkeinen fall!

mfg


DracoBlue - Fr 11.07.03 18:00

jetz hast du mich verstanden,

schade wenn das nicht geht, hmmm!

Mfg, DracoBlue


mimi - Fr 11.07.03 20:26

sagen wie es mal so: es geht bestimmt, nur wir wissen leider noch nicht wie es genau geht. gibt es keine doku oder sowas dazu ?


maximus - Sa 12.07.03 01:03

@mimi: ich sag: Rein theoretisch geht alles...es ist nur begrenst durch unser vorstellungsvermögen und unser vermögen dies, in die tat, umzusetzen :wink: ...


wollt mich mimi mal anschliessen...und'n bisschen schwafeln :D


mimi - Sa 12.07.03 12:31

lol, so kommen wir beim problem was er hat auch nicht weiter.
wir sollten darüber reden warum es nicht so (einfach) geht. und was zu beachten ist.


maximus - So 13.07.03 23:47

mimi hat folgendes geschrieben:
...
wir sollten darüber reden warum es nicht so (einfach) geht. und was zu beachten ist.


Was gibts da zu bereden? ...warum es nicht so einfach geht sollte doch mittlerweile klar sein. Und zu beachten ist deshalb erstmal auch nix :lol:


mimi - Mo 14.07.03 17:20

Zitat:

Was gibts da zu bereden? ...warum es nicht so einfach geht sollte doch mittlerweile klar sein. Und zu beachten ist deshalb erstmal auch nix

viel z.b. wie man in den speicherbereich von einem anderem programm kommt(genau das hat er glaube ich, wenn ich die frage richtig verstanden habe vor)


tommie-lie - Mo 14.07.03 17:51

mimi hat folgendes geschrieben:
z.b. wie man in den speicherbereich von einem anderem programm kommt

Gar nicht (zumidnest sollte man da nciht rankommen).
Genau das ist doch der Witz vom Speichermanagement :roll:

Aber mal mein Vorschlag:
Ein Fenster hat 'nen Device Context, auf den gerendert wird. Man könnte jetzt mit den Windows-Funktionen für den Canvas (nicht zu verwechseln mit TCanvas, ich weiß nicht, ob man dem einfach einen Context zuschieben kann!) da draufpinseln, was man will.
So, da das aber sofort (beim nächsten Frame) wieder vom Spiel überschrieben wird, muss man das machen, nachdem gezeichnet wurde, und zwar jedes Mal.
Ich weiß nciht genau, ob es ein WM_Paint in diesem Fall gibt, weil das ja alles ziemlich direkt ist, aber ich gehe einfach mal davon aus. Also könnte man mit Hooks arbeiten (Tutorial: http://www.assarbad.org) und nach jedem Paint auf den Canvas schreiben. Auf diese Weise kann man dann auch die FPS berechnen, nämlich indem amn zählt, wie oft WM_Paint gesendet wurde.
Alles relativ viel API-Arbeit, vieles habe ich selbst noch nciht gemacht, ist aber ein Lösungsansatz, der, wenn alles zutrifft, von dem ich ausgehe, funktionieren sollte.


maximus - Di 15.07.03 11:10

darf man fragen, wie du drauf schliesst, dass es ein WM_Paint gibt? ...directX zeichnet ja wenn das spiel es will...ich glaub nicht, das da gross mit events rumgefeuert wird? kann mich aber auch irrren! Davon abgesehen, bräuchte man den DC vom backbuffer. Sieht sonst wohl merkwürdig aus.


DracoBlue - Di 15.07.03 13:01

Kann man irgendwie direkt auf die Grafikkarte schreiben?

Meinetwegen schreibe ich dann pro Frame oder so?

Cya, DracoBlue


maximus - Di 15.07.03 13:56

DracoBlue hat folgendes geschrieben:
Kann man irgendwie direkt auf die Grafikkarte schreiben?
...
Cya, DracoBlue


geht nicht...ich glaub der speicherbereich ist geschützt...früher ging das mal. Da konnte man lustig, im mode 13h oder andere, den speicher mit farben vollknallen.

...das würde dein prob aber auch nicht lösen. Wenn du es wirklich wissen willst, dann schau dir mal die DirectX SDK an...vielleicht findest du ja was. Oder frag mal die Neobrothers(.de), die beschäftigen sich fast ausschliesslich mit delphi und directX :wink:


tommie-lie - Di 15.07.03 13:58

maximus hat folgendes geschrieben:
darf man fragen, wie du drauf schliesst, dass es ein WM_Paint gibt? ...directX zeichnet ja wenn das spiel es will...ich glaub nicht, das da gross mit events rumgefeuert wird? kann mich aber auch irrren!

Ich kann mich auch irren.
Ich dachte mir nur, daß irgendeine Nachricht verschickt wird. Um das zu überprüfen bräuchte ich natürlich den Quellcode einer nonVCL-DirectX-Anwendung, wenn jemand so nett wäre und mir eins schreiben würde :mrgreen:
Außerdem habe ich folgendes geschrieben:
tommie-lie hat folgendes geschrieben:
wenn alles zutrifft, von dem ich ausgehe

Ich habe also drauf hingewiesen, daß es keine garantierte Möglichkeit ist, nur, daß es theoretisch so funktioneiren könnte, wenn Microsoft alles so macht wie ich das gerne hätte *g*


mimi - Di 15.07.03 16:10

evtl, haben wir den autoren der frage auch nicht richtig verstanden:)


maximus - Di 15.07.03 18:31

mimi hat folgendes geschrieben:
evtl, haben wir den autoren der frage auch nicht richtig verstanden:)


......und doch 8)


mimi - Di 15.07.03 19:09

dann sag mal das was du meinst:)
ich habe ihn so verstanden: er will in gta(version egal) irngwas hinschreiben, richtig ?


tommie-lie - Di 15.07.03 19:14

Genau darum geht's.
Das war doch schon lange klar!
Es geht nur um das wie.
Einen möglichen (!!!) Weg habe ich oben gepostet.
Wie gesagt, wenn jemand so nett wäre und mit seinem gesammelten Wissen ein kleines DirectX-Programm schreibt, könnte ich meine Theorie nachprüfen und dann hätte man eine Lösung (oder auch nicht *g*).


mimi - Di 15.07.03 19:34

@tommie-lie
ich glaube nicht das, das so einfach ist, er will das ja mit delphiX machen. mit direct dircx wird es warscheinlich gehen, denke ich, aber halt nicht mit einer komponenten samlung :(

soviel wie ich weiß kannst du heute unter win200 und winXP garnicht mehr in anderm speicher rumschreiben, dann musst du am besten eine art dll entwickeln die sich dazuwzischen schaltet, wie währe das ?


DracoBlue - Di 15.07.03 19:38

Ich wollte das halt nur IRGENDWIE hinkriegen!

Meinetwegen auch ohne DelphiX, und echt danke das ihr euch solche Mühe gebt!

Cya, DracoBlue


mimi - Di 15.07.03 21:15

fragen wie mal so: da du in gta irngwas reinschreiben willst(also währen das spiel läuft soll da ein text stehen) könntes du das doch auch per scripsprache die gta hat lösen, anderes geht es nicht(ich weiß ich habe es schonmal angesprochen)


DracoBlue - Di 15.07.03 21:19

Die Script sprache hab ich schon entschlüsselt und das is ja nicht das Problem!

Aber ich würde gerne Menüs anzeigen und das geht numal nich mit dem script!

Cya, DracoBlue


tommie-lie - Di 15.07.03 21:24

Er hat nie gesagt, daß er es unbedingt mit DelphiX machen will!

Ich bezweifle, daß die Scriptsprache von GTA mächtig genug ist, die Framerate auszulesen, sonst gäbe die diese Funktion schon von Haus aus. Mit dem reinen Anzeigen von Text könnte vielleicht klappen, aber ich habe kein GTA um's auszuprobieren...

mimi hat folgendes geschrieben:
anderes geht es nicht

Du kannst doch gar nicht sicher sein, daß es anders als über die Scriptsprache (falls überhaupt vorhanden) nicht geht.
Siehe mein Post :roll:


mimi - Di 15.07.03 21:31

Zitat:

Aber ich würde gerne Menüs anzeigen und das geht numal nich mit dem script

das ist die Scripsprache ja sehr schlecht, selbst clonk kann sowas:)
warum willst du menues schreiben ?
dann musst du wohl ein plungin schreiben(also eine dll,die sich dann da einlinkt, dann brauchst du noch ein progamm was die dll einbindet, und fertig) wird aber alles sehr schwer werden. gibt es keine gta foren ?
weil das ist doch ein gta problem. frag doch mal die entwickler oder irgenein forum was für gta ist. ich denke so in delphi düfrte das sehr schwer werden(und wie ich schon gesagt habe, möglich ist das sicher, aber ich sage das ist nicht geht bzw. nicht einfach geht.)


tommie-lie - Di 15.07.03 21:51

mimi hat folgendes geschrieben:
das ist die Scripsprache ja sehr schlecht, selbst clonk kann sowas:)

Sriptsprachen isnd in der Regel Nutzenorientiert.
GTA ist ein fertiges Spiel, bei dem sich die Scriptsprache höchstens auf Leveldesign beschränkt, wozu braucht man für eine neue KArte ein Menü?
Nicht jeder Spieleentwickler hat Zeit und Geld, in sein Spiel ein eigenes kleines Betriebssytem einzubauen mit Menüsteuerung, diversen Fenstermöglichkeiten und anderen Scherzchen.

Zitat:
dann musst du wohl ein plungin schreiben(also eine dll,die sich dann da einlinkt, dann brauchst du noch ein progamm was die dll einbindet, und fertig) wird aber alles sehr schwer werden.

Wenn GTA kein Interface für Plugins hat (was ich annehme, denn die wenigsten kommerziellen Spiele haben das, von denen mit seperater Engine, für die es Mods gibt mal abgesehen.
Das würde das Problem, daß man nicht in die DirectX-Szene malen kann, immer noch nicht lösen... :roll:

Zitat:
weil das ist doch ein gta problem. frag doch mal die entwickler oder irgenein forum was für gta ist. ich denke so in delphi düfrte das sehr schwer werden(und wie ich schon gesagt habe, möglich ist das sicher, aber ich sage das ist nicht geht bzw. nicht einfach geht.)

Die Entwickler werden wahscheinlich nicht so erreichbar sein wie die von Clonk... Es gibt doch tatsächlich Leute, die arbeiten irgendwann :mrgreen:
Wenn es in C geht, geht es auch in Delphi. Das ganze ist kein Treiberproblem (auch wenn es sich durch einen eigenen Grafiktreiber machen ließe, fällt mir grad' ein...), und sonst lässt sich alles mit Delphi machen.
Und es ist auch kein GTA-Problem. Offensichtlich will DracoBlue etwas machen, was GTA von Haus aus nicht kann, wieso sollte dann ein GTA-Forum wissen, wie's geht? Das ist ein großes, kommerzielles Spiel, ein Entwicklerforum wie bei OpenSource-Projekten wird man da höchstwahrscheinlich nicht finden, und der Großteil der Spieler wird keinen blassen Schimmer vom Programmieren haben!


DracoBlue - Di 15.07.03 22:11

Also......

Ich bin DracoBlue der Macher des GTAT-Mods!

GTAT=gtaTournament und ist der 1. Multiplayer Mod für ViceCity!

Ich habe die features der Anzeige zurzeit mit der Scriptsprache und dessen Adressen gemacht, aber ich möchte gern ein Ingame Anzeige machen für Frags aller Spieler und so.

Mfg, DracoBlue

PS: http://www.GTAT.org


maximus - Mi 16.07.03 11:09

ÎCh kann nichts versprechen!...aber werd zuhause mal in die SDK kucken...vielleicht finde ich ja was.


maximus - Fr 18.07.03 11:07

maximus hat folgendes geschrieben:
ÎCh kann nichts versprechen!...aber werd zuhause mal in die SDK kucken...vielleicht finde ich ja was.


Nix dergleichen :cry:


tommie-lie - Fr 18.07.03 13:30

Aber ich habe mittlerweile die Gelegenheit gehabt, meine Theorie nachzuprüfen, anhand des Beispiels von einem der Neobrother-Tutorials.
Was ich an diesem VCL-Ding ruasfinden konnte ist, daß soweit keine WM_PAINT verschickt wird, um das aktuelle Frame zu zeichnen.
Ganz sicher gehen kan ich zwar nicht, weil es eine Recht wackelige Konstruktion war und ich erst den Quellcode ändern musste, damit er mit den DX8.1-Headern lief, aber anscheinend gibt es da keine einfache Möglichkeit...