Ich möcht gerne ein paar Bilder gedreht,skaliert und zugeschnitten mit Alphablending übereinander zeichnen (2d). Das Ganze soll möglichst schnell gehen, daher wollte ich das mit DirectX machen. Bei DirectDraw stand in den Kommentaren, dass man es nichtmehr verwenden soll.
fragen sich "Wo ist DirectDraw für meine Spiele in 2D?".
Nun, bei DirectX 8 gibt es die Komponente DirectDraw nicht mehr. Sie wurde von Microsoft unter dem Begriff DirectGraphics mit Direct3D zusammengefasst und in die Komponente Direct3D verschoben.
Deshalb wollte ich das mit Direct3d machen. Mehr, als ein Device zu erstellen und es schwarz zu füllen, hab ich aber nicht hinbekommen.
Mit anderen Worten: Ich hab 0Plan von Direct3d.
schau dir mal "Sprites" an.
Und was willst du denn machen, was schnell gehen soll? Die GDI+ ist zwar langsamer, dennoch kann man mit ihr viel machen.
Das klingt irgendwie so nach Bildverarbeitung, da würde ich dann dir vielleicht hierauf einen Blick empfehlen:
GetPixel und SetPixel um Längen geschlagen. 800 mal schneller
Ansonsten wenn du in C# codest wäre evtl. XNA für dich interessant.
Grüße
plucked
Der Tip mit den Sprites hat mir sehr geholfen.
Ich hab jetzt aber noch 2 andere Probleme:
Wie finde ich möglichst prozessorschonend heraus, ob eine Strecke, von der ich die Endpunkte habe, ein Rchteck schneidet?
Wenn ich ein Device auf dem Fenster hab, und es minimire, bekomme ich nen Fehler, angeblich in application.Run(Form) liegt. Wie kann ich das vermeiden?
Wie finde ich möglichst prozessorschonend heraus, ob eine Strecke, von der ich die Endpunkte habe, ein Rchteck schneidet?
ich hätte mal zwei Vorschläge..
Vorschlag 1:
die Schnittpunkte sind doch relativ einfach zu berechnen.. du kannst dir anhand der Endpunkte der Strecke die Geradengleichung herleiten.. und dein Rechteck besteht letztendlich auch aus vier Geraden, deren Geradengleichung eine recht einfache Form haben (entweder x= ... oder y= ...) jetzt setzt du deine Geradengleichung der Strecke der Reihe nach mit den Gleichungen des Rechtecks gleich und schon erhälst du eventuelle Schnittpunkte.. kannst ja schon bei dem ersten Auftauchen eines Schnittpunkts abbrechen..
Vorschlag 2:
sieh deine Strecke als ein Rectangle mit der Länge deiner Strecke und der Breite 1 (1 Pixel). Dann erstellst ein Rectangle (das Rechteck, bei dem die Schnittpunkte überprüft werden sollen). Dann gibt es in der Rectangle-Klasse eine Methode Intersect oder IntersectsWith, der übergibst das Rechteck, welches deine Strecke symbolisiert und tadaaa kriegste die Schnittmenge 😁 sollte eigentlich so auch funktionieren..
falls was falsch ist, bitte korrigieren 🤔
greetz..
I cna tpye 300 wrods pre mnuite!
Ich hab jetzt aus den Endpunkten ein Rectangle erstellt und benutze IntersectsWith.
(also bloß ne Heuristik)
Ich möchte jetzt aber ne Textur aus ner Bitmap erstellen (mit Texture.fromBitmap).
Wenn ein neues Objekt erstellt wird, wird die gezeichnet, was auch funktioniert.
Die Textur ist auf dem Bildschirm aber nur ein weißer Block.
Hallo Floste..
Ich hab jetzt aus den Endpunkten ein Rectangle erstellt und benutze IntersectsWith.
(also bloß ne Heuristik)
wie meinst du das? So wie ich das so verstehe, könnte es nämlich falsch sein..
du hast eine Diagonale von (0,0) nach (30, 30) .. wenn du das rechteck an den Ecken aufspannst hättest du ein Rechteck mit Breite und Länge 30.. jetzt kann aber ein anderes Rechteck dieses Rechteck schneiden, ohne jemals die Linie zu berühren.. du würdest schnittpunkte zurückliefern die schlichtweg falsch sind.. aber vielleicht hab ich dich ja auch nur falsch verstanden..
ich muss dazu auch korrigieren: das geht glaube ich auch nur, wenn deine linie waagerecht oder senkrecht ist.. zumindest habe ich damals diese variante verworfen und fand die andere praktischer..
Die Textur ist auf dem Bildschirm aber nur ein weißer Block.
du musst schon ein paar zeilen code zeigen, wo und wie du die textur draufmappst, sonst ist nur schwer zu erahnen wo der fehler liegt 🙂
greetz..
I cna tpye 300 wrods pre mnuite!
Wie ich das meinte: Heuristik (Wikipedia) 😁
Die Textur ist auf dem Bildschirm aber nur ein weißer Block:
Das lag daran, dass ich
texture = Microsoft.DirectX.Direct3D.Texture.FromBitmap(parent.Painting, bgg,0 , Pool.SystemMemory)
genommen hatte.
texture = Microsoft.DirectX.Direct3D.Texture.FromBitmap(parent.Painting, bgg,0 , Pool.Managed)
Funktioniert komischerweise. 🤔
Pool.Managed würde ich auf jeden Fall empfehlen. Wegen der Performance gegenüber den Objekten im SystemMemory und weil sich DirectX dann darum kümmert, wo und wann die Resourcen erstellt bzw. wieder zerstört werden.
// Edit:
...was allerdings nicht erklärt, warum die Textur einfach nur weiß ist. Manchmal legt DirectX schon ein merkwürdiges Verhalten an den Tag.
Weeks of programming can save you hours of planning
Ein Problem ist allerdings immernoch ungelöst:
Wenn ich ein Device auf dem Fenster hab, und es minimire, bekomme ich nen Fehler, angeblich in application.Run(Form) liegt. Wie kann ich das vermeiden?
Der Fehler wird meines Erachtens von der Device.Present()-Funktion ausgelöst, wenn das Fenster nicht angezeigt wird. U.a. auch, wenn du Strg-Alt-Entf drückst und das Desktop ausgeblendet wird. Das Device löst eine DeviceLost Exception aus oder sowas.
Ich hab das bisher immer unterdrückt, indem ich eine try/catch Anweisung eingefügt hab, aber man sollte sich darum kümmern.
Es gibt ein Ereignis Device.LostDevice, welches in dem Fall aufgerufen wird, und die Anwendung darüber informiert. Wie man damit umzugehen hat, steht in diversen Tutorials im Internet. Ich hab es bisher wie gesagt noch nicht geschafft, mich darum zu kümmern, von daher wäre es nett, wenn du deine Lösung hier posten könntest.
Schöne Grüße,
Christian
Weeks of programming can save you hours of planning