Autor Beitrag
Mike_C
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: So 04.05.03 18:02 
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:
ausblenden 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.

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
Simon Joker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.05.03 08:32 
Hi

Der Code ist iO. Hast du bei der ImageList den DXDraw ausgewählt?
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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.

_________________
mfg.
mâximôv
Mike_C Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: 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...

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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)?

_________________
mfg.
mâximôv
Mike_C Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: 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:

ausblenden 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:

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 05.05.03 17:19 
lösung:
ausblenden 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 ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Mike_C Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: Mo 05.05.03 17:47 
ich hab keine ahnung, was ich falsch mache: hier mein code. sotte doch funktionieren? warum sehe ich nix?

ausblenden volle Höhe 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

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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

_________________
MFG
Michael Springwald, "kann kein englisch...."
Mike_C Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: Mo 05.05.03 18:18 
yuhu!!!
thx mimi, es funzt!!!

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 05.05.03 18:38 
und an was hat es gelegen ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Mike_C Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: Mo 05.05.03 19:19 
bin nicht sicher:

hatte keinen timer (ist der immer notwendig?) und meine patternwidth war nicht 0

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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.....

_________________
MFG
Michael Springwald, "kann kein englisch...."
Simon Joker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Di 06.05.03 13:34 
Hi Mike

Eine Demo kannst du hier saugen:
[url] 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: Di 06.05.03 14:35 
@simon: Thx für den Tipp. das enspricht glaub ich eher meinen Bedürfnissen :-)

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Di 06.05.03 15:28 
du hast recht, es geht auch ohne timer....

_________________
MFG
Michael Springwald, "kann kein englisch...."