Entwickler-Ecke
Multimedia / Grafik - problem mit DXDraw
Mike_C - So 04.05.03 18:02
Titel: problem mit DXDraw
Hi
sorry, hatte keine Zeit die Suchmaschiene in dieser Sache zu bemühen und die Ergebnisse durch zusehen...
mein Problem ist folgendes:
ich hab eine DXDraw-Komponente und eine DXImageList, die mit DXDraw verbunden ist. In der DXImagelist ist ein bild, das ich auf mausklick auf DXDraw zeichnen möchte
und zwar so:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| if not DXDraw1.CanDraw then begin showMessage('DXDraw1 ist nicht zum rendern bereit!'); Exit; end;
DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0); DXDraw1.Flip; |
warum funzt das so nicht? ich sehe nur ein schwarzes rechteck(von DXDraw nehme ich an). dachte es liegt an meiner DirectX-Version und hab mit DirecX9 gezogen, nützt aber nix.
Simon Joker - Mo 05.05.03 08:32
Hi
Der Code ist iO. Hast du bei der ImageList den DXDraw ausgewählt?
maximus - Mo 05.05.03 10:34
@Simon Joker: das sagte er doch!
Hast du das zeichnen im mouseEvent gemacht? ...dann ist es nicht weiter verwunderlich, dass du nicht siehst, da das ding ja bei jedem frame gezeichnet werden müsste. ergo du musst im gameloop zeichnen...am besten ein sprite erstellen, das sowieso automatisch gezeichnet wird.
Mike_C - Mo 05.05.03 14:57
also mein code steht im onclick event.
kann jemand ein beispiel posten, wie mein problem gelöst werden kann? ich kapier nicht so ganz, was ihr meint...
maximus - Mo 05.05.03 16:18
Naja, directX geschichten, oder spiele im allgemeinen, werden ja durch frames dargestellt, dh. sie werden zB. 100 mal pro sekunde (FPS) gezeichnet...und zwar alles.
Wenn du jetzt einmal watt zeichnest, dann is es nach ein paar milisekunden wieder weg...oder ist garnicht zusehen, weil der backbuffer geflipt wird.
Die lösung wär, auf klick, ein sprite zu erstellen, das nu denn ja immer gezeichnet wird, da es sich im render-tree der engine befindet.
Kannst du sprites erstellen? ...und hast du überhaupt einen gameLoop(DXTimer mit render code)?
Mike_C - Mo 05.05.03 16:29
bin totaler neueinsteiger in delphix. versuche grad ein tutorial durch zu arbeiten. zu dem thema steht im tutorial folgendes
| Zitat: |
Kapitel 2
Als erstes werde ich ihnen zeigen, wie sie Bilder (noch keine Animationen) darstellen und bewegen können.
Bilder darstellen
Zuerst erstellen sie mit DXDraw eine Fläche, auf der die Bilder angezeigt werden sollen. Dazu klicken sie auf das Symbol und ziehen dann auf dem Formular bei gedrückter linker Maustaste ein Rechteck. Danach fügen sie eine DXImageList Komponente ein.
Damit die DXImageList Komponente weiß, wo das Bild angezeigt werden sollen, müssen sie der Eigenschaft DXDraw"DXDraw1" (bzw. den Namen der DXDraw Komponente) zuweisen.
Nun laden wir ein Bild in die DXImageList Komponente. Dazu klicken wir auf die Eigenschaft Items.
Um ein neues Bild hinzuzufügen, klicken sie auf das Linke Symbol.
Mit der Eigenschaft "Picture" können sie ein Bild laden. Geben sie dem Bild den Name "Test" (Eigenschaft: Name). Sie sehen nun in dem DXImageList-Fenster 0 - Test, d.h. unser Bild mit dem Namen "Test" hat die Item Nummer 0. Wenn sie wollen, können sie eine Farbe als transparent festlegen. Dazu wählen sie in der Eigenschaft TransparentColor eine Farbe aus und schalten die Eigenschaft Transparent auf True. In das Ereignis OnClick der DXDraw Komponente schreiben wir folgendes:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.DXDraw1Click(Sender: TObject); begin if not DXDraw1.CanDraw then Exit; DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0); DXDraw1.Flip; end; |
Was bedeutet das?
Also, die erste Zeile bedeutet, dass Delphi sofort aufhört weiter zu machen, wenn er nichts auf dem DXDraw Feld zeichnen kann.
Die zweite Zeile ist wichtiger. Sie sagt, dass Delphi aus DXImageList das erste Bild (Item=0) holen soll. In der Klammer steht, wo das Bild angezeigt werden soll (DXDraw1.Surface), die X-Koordinate, die Y-Koordinate und den PatternIndex (ist bei einem Bild immer 0; Dazu später mehr).
Zusammengefasst:
DXImageList1.Items[Nummer].draw(Wo, X-Koordinate, Y-Koordinate, PatternIndex);
Die Letzte Zeile bedeutet, dass DXDraw das Bild flipped, d.h. die DXDraw Oberfläche neu zeichnet und das Bild darstellt.
Nun können sie F9 zum starten drücken. Wenn sie nun auf das schwarze Feld drücken, erscheint ihr Bild in der oberen linken Ecke.
|
bekomme ich das jetzt irgendwie zum laufen? wie? hat jemand ein besipiel
mit code (!!!) ??? :cry: :cry: :cry:
mimi - Mo 05.05.03 17:19
lösung:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var mx,my:Integer
procedure TForm1.DXDraw1Click(Sender: TObject); begin if not DXDraw1.CanDraw then Exit; // das mache ich nie // was auch nicht sclecht währe: DXDraw1.Surface.Fill(0) // sollte das bild schwarz einfährben, also löschen, bevor du was zeichnets:)
DXImageList1.Items[0].draw(DXDraw1.Surface, mx, my, 0); DXDraw1.Flip; end;
onMouseDown: mx:=x; my:=y; |
klar ? oder gibt es probleme ?
Mike_C - Mo 05.05.03 17:47
ich hab keine ahnung, was ich falsch mache: hier mein code. sotte doch funktionieren? warum sehe ich nix?
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DXDraws;
type TForm1 = class(TForm) DXDraw1: TDXDraw; DXImageList1: TDXImageList; procedure DXDraw1Click(Sender: TObject); procedure DXDraw1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
mx, my: integer;
implementation
{$R *.dfm}
procedure TForm1.DXDraw1Click(Sender: TObject); begin if not DXDraw1.CanDraw then Exit; // das mache ich nie // was auch nicht sclecht währe: DXDraw1.Surface.Fill(0); // sollte das bild schwarz einfährben, also löschen, bevor du was zeichnets:)
DXImageList1.Items[0].draw(DXDraw1.Surface, mx, my, 0); DXDraw1.Flip; end;
procedure TForm1.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin mx:=x; my:=y; end;
end. |
edit:
Wenn jemand eine funktionierendes Programm hat, das ein Bild mit DelphiX malen kann (vielleicht auch eine billige Bewegung darstellen kann), würde ich mich sehr freuen, wenn ihr es mich per mail schicken könntet...
mail @:
michael_kirches@gmx.de oder
gameforge@cheatha.de
Thx
mimi - Mo 05.05.03 18:08
also der code ist komplet richtig.
Ursachen warum es nicht funktinieren kann:
1. schalte in der DXimagelist Tranzparent aus
2. DXTimer1.Interval:=0;
3. Verbinde die DXImagelist mit DXDraw....
4. Lade das Bild(was du eingetlich haben solltes)
5. DXImagelist.items[0].patternbreite und höhe auf 0 setzen
Mike_C - Mo 05.05.03 18:18
yuhu!!!
thx mimi, es funzt!!!
mimi - Mo 05.05.03 18:38
und an was hat es gelegen ?
Mike_C - Mo 05.05.03 19:19
bin nicht sicher:
hatte keinen timer (ist der immer notwendig?) und meine patternwidth war nicht 0
mimi - Mo 05.05.03 19:25
ja ein Timer brauchst du umbedingt
ohne timer geht es einfach nicht, ausferschienden gründen(ich weiß sie selbst garnicht alle)
ein grund ist:
das das Bild immer neu gezeichnet werden muss weil es sonst "blöd" aussieht.....
Simon Joker - Di 06.05.03 13:34
Hi Mike
Eine Demo kannst du hier saugen:
[url]
http://www.simonjoker.de/Trans/Test3.zip [/url]
Enthalten sind:
- Demo BLTFast
- Test BLT
- Demo für zusätzliche Surface
- Demo HighPerformanceCounter (FrameRate)
- Beispiel für etwa 3 mal schnellere Methode DrawAlpha als die normale
- Demo Draw bei onMouseClick
- Demo Draw bei onMouseMove
In dem Proggie ist KEIN Timer enthalten! Wenn man nur auf Benutzereingabe reagieren will und kein Animationen hat ist es absolut sinnlos den Kram alle paar ms neu zuzeichnen.
Mike_C - Di 06.05.03 14:35
@simon: Thx für den Tipp. das enspricht glaub ich eher meinen Bedürfnissen :-)
mimi - Di 06.05.03 15:28
du hast recht, es geht auch ohne timer....
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!