Autor Beitrag
Tomekk
Hält's aus hier
Beiträge: 11

Windows,(bisschen Linux)
Delphi4
BeitragVerfasst: Fr 02.01.04 22:20 
Hi,
habe schon einige Sachen mit der DirectDraw Komponente von DelphiX für Delphi4 gemacht. Allerdings bissher immer nur Bild reinladen, bewegen, Flip...
Ich brauche nun aber auch erweiterte Sachen wie z.B. Kreise zeichnen (auch ausgefüllte) und transparente Farben. Also nicht die ganz transparenten Sachen sondern ein Kombination aus der Farbe im DXDraw.surface und dem was ich darüber lege. Weiß jetzt noch nicht genau wie aber am besten, so das sich die Farbwerte aufaddieren.

Ist das überhaupt mit DelphiX möglich, oder muss ich dann selber an die Directdraw Schnittstelle ran? Wenn ja wisst ihr wie das geht was ich vorhabe, oder kennt ihr nen gutes Tutorial dafür? Habe bisher immer nur die Tuts für Bitmap reinladen und transparente Farbe festlegen gefunden.

Bin für jegliche Hilfe dankbar
Tomekk
Da_Knuddelbaer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: Fr 02.01.04 23:02 
Sry, verstehe nicht ganz was du machen willst. Kreise und gefüllte Kreise kannst du ganz normal mit Canvas zeichnen, geht wunderbar. Transparente Farben kannst du für Sprites setzen, jeder Sprite kann eine Transparentfarbe besitzen.

Willst du irgendwie mit Alpha eine leichte Transparenz erzeugen, so dass man beides von der Fläche sieht? Das geht auf jeden Fall :shock: Dass sich Farbwerte aufaddieren wüsste ich nicht wie... nicht mit DelphiX. Was jetzt nicht heissen soll dass das vllt nicht doch irgendwie geht.

Ciao,
Knuddelbaer
Tomekk Threadstarter
Hält's aus hier
Beiträge: 11

Windows,(bisschen Linux)
Delphi4
BeitragVerfasst: Sa 03.01.04 00:59 
Ja genau sowas mit Alpha meinte ich.
Habe gerade da ein bissel dran rum gespielt, und das mit der Alpha-transparenz hin gekriegt. Aber wie ist das mit den Kreisen? Ich brauche die, weil es auf dem Canvas nicht so gut mit den Bitmaps klappt und ich gerne die Bitmaps mit den Kreisen kombinieren möchte. Kann ich irgendwie den Inhalt des Canvas auf das DXDraw rauf kopieren? Oder gibt es doch eine Möglichkeit mit DirectDraw direkt Kreise zu zeichnen?
Tomekk Threadstarter
Hält's aus hier
Beiträge: 11

Windows,(bisschen Linux)
Delphi4
BeitragVerfasst: Sa 03.01.04 01:29 
Ok habe gerade was vielversprechendes gefunden. Unter TDXDraw.surface.canvas scheint man normale Zeichenoperationen ausführen zu können. Wenn ich nun aber ellipse(10,10,100,100) mache stürtzt bei mir das ganze ab. Geht das bei euch? Weiß jemand woran es liegen könnte? Muss ich noch irgendwas vorher einstellen?
Phobeus
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: Sa 03.01.04 01:59 
ich kriege es aus dem stehgreif nimmer hin, aber du mußt den canvas (oder war es die surface?) zuvor locken und anschließend wieder mit release freigeben. Das wird in den Samples auch bei dem Textout gemacht. Schau Dir das mal an. Den Vorgang sollte man so selten wie möglich machen, bremst ungemein.

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
umpani
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Sa 03.01.04 05:13 
Wenn du die Canvas in delphiX benutzt hast, mußt du sie für andere Zeichenoperationen (z.B. auch für tdxdraw.flip) wieder freigeben.

Ich glaube das war tdxdraw.canvas.release oder tdxdraw.release (auf jedenfalls irgendwas mit r...). Ansonsten bleibt der Bildschirm schwarz.



Gruß Umpani.

_________________
Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
Da_Knuddelbaer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: Sa 03.01.04 10:19 
Das meinte ich ja: Kreise etc. kann man mit DXDraw direkt auf die Fläche zeichnen lassen. Freigeben musst du es genau wie bei Text-Ausgaben mit der Release-Funktion. Schreibs am besten in deinen DXTimer rein.
Tomekk Threadstarter
Hält's aus hier
Beiträge: 11

Windows,(bisschen Linux)
Delphi4
BeitragVerfasst: Mi 14.01.04 18:57 
Also das mit den Kreisen funktioniert jetzt ganz gut. Wenn ich die Kreise in einem DXDraw zeichne, kann ich sie sogar mit einem DrawAlpha oder irgend so einer Funktion Transparent auf die Anzeige bringen.
Wenn man dann noch DXDraw.surface.release aufruft, bleibt er nicht mehr hängen.

Habe jetzt aber ein neues Problem. Die Kreiszeichen Funktion scheint absolut langsam zu sein. Schon 5 Kreise mit 200 Pixel Druchmesser bringen mein Programm zum Ruckeln.
Also hab ich mir gedacht, die Kreise einmal zeichnen dann in eine DXimaglist auslagern und bei Bedarf auf das DXDraw kopieren, was deutlich schneller gehen sollte. Aber wie kriege ich Sachen aus dem DXDraw in die ImageList rein? Und wie füge ich der Imagelist neue(leere) Items hinzu? kann mir jemand weiter helfen?
umpani
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Mi 14.01.04 19:15 
Zunächst einmal empfehel ich ein delphix Tutorial.


Aber nun zu Deiner Frage.

Zunächt eine neue Imagelist anlegen

ausblenden Delphi-Quelltext
1:
imagelist := tdximagelist.create(self);					


Dann ein neues Item

ausblenden Delphi-Quelltext
1:
imagelst.items.add;					



In diese Item kannst du dann auf das Canvas zeichnen.
Auch hier an die Freigabe und an das Einstellen der Imtemgröße denken.

PS. Habe alles aus dem Kopf geschrieben. ALso nicht schlagen, wenn es kleine Abweichungen gibt.


Gruß Umpani[/code]

_________________
Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
Tomekk Threadstarter
Hält's aus hier
Beiträge: 11

Windows,(bisschen Linux)
Delphi4
BeitragVerfasst: Mi 14.01.04 20:30 
Wow danke für die schnelle Hilfe!
Da hab ich gar nicht dran gedacht das ja auch die Items einen Canvas haben. Muss ich gleich mal ausprobieren!

Mit dem Tutorial, wie schon gesagt, habe ich bisher immer nur was gefunden, wo die grundlegenden Funktionen erklärt werden. Also Imagelist erstellen, Bilder reinladen und auf das DXDraw kopieren. Wenn ihr wisst wo man was ausführlicheres findet, sagt mir bitte bescheid, das würde euch sicherlich eine menge Fragen meinerseits ersparen! ;)

Achja das mit
ausblenden Quelltext
1:
imagelst.items.add;					

geht glaub ich nur bei der standart Imagelist von Delphi, habe die Funktion heute schon für die DelphiX Imagelist gesucht und sie dort nicht gefunden. Aber vieleicht habe ich sie auch übersehen. Werde nochmal nach schauen...
Tomekk Threadstarter
Hält's aus hier
Beiträge: 11

Windows,(bisschen Linux)
Delphi4
BeitragVerfasst: Mi 14.01.04 21:55 
Ok,
funktioniert alles! Sogar das mit dem .add. Muss es wohl übersehen haben. Der Rest ist auch so "in etwa" richtig. :wink: Musste trotzdem noch ein bischen rumwurschteln bis es ging. Vieleicht braucht es ja nochmal irgendjemand, ich poste einfach mal hier mein Ergebnis:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button1Click(Sender: TObject);
begin
  //Neues Bild in der ImageList erstellen
  DXImageList1.Items.Add;
  //Größe des Bildes angeben
  DXImageList1.Items[0].picture.bitmap.width := 100;
  DXImageList1.Items[0].picture.bitmap.height := 100;
  //Kreis zeichnen
  DXImageList1.Items[0].picture.Bitmap.Canvas.brush.color := clred;
  DXImageList1.Items[0].picture.Bitmap.Canvas.Ellipse(0,0,100,100);
  //Surface aktualisieren
  DXImageList1.Items[0].restore;

  //Bild auf das DXDraw kopieren und Anzeigen
  DXImageList1.Items[0].draw(DXDraw1.surface,10,10,0);
  DxDraw1.Flip;
end;
Simon Joker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Do 15.01.04 13:25 
Hi Tomekk

nicht unbedingt die Zeichenfunktionen des Canvas sind langsam, sondern das Look/Release des Canvas und ganz besonders das Alphazeichnen killen die Performance!

Beim Alphazeichen wird direkt auf den Graphikspeicher zugegriffen (sehr langsam), deshalb funktioniert das am Besten, wenn du dir dafür eine sekundäre Surface erzeugst und diese im Systemspeicher ( Surface.SystemMemory:=true; ) behälts!

In einem früheren Thread wurde das Problem schon mal diskutiert. Damals hatte ich mehrere Methoden getesten um das Alphazeichnen zubeschleunigen.

Den Code dazu kannst du hier finden:
www.fatal-univers.de/Trans/Test3.zip

Die Ergebnisse waren nie berauschend!