Laden...

Sprites werden nicht gezeichnet

Erstellt von Bifiman vor 19 Jahren Letzter Beitrag vor 19 Jahren 4.044 Views
B
Bifiman Themenstarter:in
57 Beiträge seit 2004
vor 19 Jahren
Sprites werden nicht gezeichnet

Hallo!

Vielleicht kann mir wer helfen. Ich will einfach nur ein simples kleines Sprite auf meinem Device ausgeben (über Sprite.Draw2d hatte ich gedacht). Nur passiert dabei irgendwie gar nix. Der Schirm wird dank Clear wunderbar gelöscht, aber von den gerenderten Sprites keine Spur. Hier der Code:


// In Initialisierungen:
d3d.PresentParameters d3dpp = new d3d.PresentParameters();
			d3dpp.DeviceWindow = this;
			d3dpp.Windowed = false;
			d3dpp.FullScreenRefreshRateInHz = 85;
			d3dpp.BackBufferFormat = d3d.Format.A8R8G8B8;
			d3dpp.BackBufferWidth = 1024;
			d3dpp.BackBufferHeight = 768;
			d3dpp.SwapEffect = d3d.SwapEffect.Discard;
			mDevice = new d3d.Device(0, d3d.DeviceType.Hardware, this,
				d3d.CreateFlags.HardwareVertexProcessing, d3dpp);

			mTex1 = d3d.TextureLoader.FromFile(mDevice, "royo.jpg");
			mSprite1 = new d3d.Sprite(mDevice);

//End-Inits

// In Render-Methode
Rectangle src = new Rectangle(0,0,100,100);
Rectangle des = new Rectangle(0,0,100,100);
Point pos = new Point(10,10);
this.mDevice.Clear(d3d.ClearFlags.Target, Color.Blue, 1.0f, 0);
mSprite1.Begin(d3d.SpriteFlags.None);
mSprite1.Draw2D(mTex1, src, des, pos, Color.White);			
mSprite1.End();
this.mDevice.Present();

//End-render


Frage: Was mach ich falsch?

Danke für jede Hilfe.

H
704 Beiträge seit 2003
vor 19 Jahren

mDevice.Begin und End hast du vergessen. Und hast du auch alle Matrizen gesetzt?

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
B
Bifiman Themenstarter:in
57 Beiträge seit 2004
vor 19 Jahren

Soweit ich weiß braucht man wenn man Sprites benutzt nicht BeginScene und EndScene aufzurufen und nebenbei - das hab ich schon versucht (bzw. am Anfang eh so gemacht), hat aber nichts geändert.

Welche Matrizen meinst du? Ich weiß nix davon dass man bei Sprites irgendwelche Matrizen setzen muss. Sprite setzt doch gerade alles so, dass es automatisch in 2d auf dem Monitor ausgegeben wird... (oder irre ich mich da?)

Na ja, hab mir das Buch von Tom Miller bestellt, sollte bald da sein. Trotzdem, wenn noch jemand was dazu weiß... 😉

B
Bifiman Themenstarter:in
57 Beiträge seit 2004
vor 19 Jahren

Also irgendwie fühl ich mich jetzt verar****. Kaum füge ich das BeginScene und EndScene wieder ein sehe ich was. Aber ich schwöre dass ich es bis kurz bevor ich hier gepostet habe noch drin hatte. Hm, hatte vielleicht noch irgendeinen anderen Fehler. Trotzdem danke für die Hilfe.

H
704 Beiträge seit 2003
vor 19 Jahren

naja, ich würde es für sehr schlimm halten, wenn die Sprite Klasse Device.Begin aufrufen würde. Device.Begin brauchst du immer wenn du irgendwas zeichnest(immer, einfach immer ^^).

@Matrizen:
Projektionsmatrix, Worldmatrix und Viewmatrix. Aber wenn Sprite das schon automatisch setzt ... (ich muss mir mal die Sprite Klasse ansehen)

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
B
Bifiman Themenstarter:in
57 Beiträge seit 2004
vor 19 Jahren

Im Nachhinein betrachtet eigentlich richtig. ^^ Hat mich nur auch gewundert, dass es keine Fehlermeldung (z.B. Exception) gab, als ich das Sprite außerhalb von BeginScene und EndScene zeichnen wollte.

Da will ich nur nochmal loswerden, dass die SDK-Doku für MDX zumindest in dem Release das ich bisher hatte (Sommer 2004) eine mittlere Katastrophe ist. Kaum eine Funktion wird ordentlich erklärt, deren Parameter schon gar nicht. Ich weiß z.B. immer noch nicht, ob das Rotieren bei Sprite.Draw2D schlicht und ergreifend fehlerhaft ist, oder ob ich nur die Parameter noch nicht richtig verstanden habe.

Das Buch habe ich jetzt, aber da wird das mit den Sprites auch nur kurz "angerissen" und auch nur erwähnt, dass man sie rotieren kann, aber nicht wie. Ansonsten eine gute Einführung, die man weiterempfehlen kann.

Das Zeichnen selbst funktioniert ansonsten jetzt hervorragend. ^^

M
456 Beiträge seit 2004
vor 19 Jahren

Ha, mit der Sprite.Draw2D Funktion hatte ich auch so meine Probleme. Ich schieb es auch auf einen Bug im Framework. Und wenn es kein Bug sein sollte, dann benimmt sich diese Funktion sehr eigenartig und wenig intuitiv.
Notfalls die Transformationsmatrix manuell setzen und mit Sprite.Draw() zeichnen.
Übrigens: nicht nur du und ich haben das Problem. Ich hab das schon öfter in anderen Foren gelesen.

Siehe hier:
http://www.zfx.info/DisplayThread.php?TID=16421
http://www.talkaboutsoftware.com/group/microsoft.public.win32.programmer.directx.graphics/messages/30801.html

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

B
Bifiman Themenstarter:in
57 Beiträge seit 2004
vor 19 Jahren

Ja, das habe ich auch schon gemerkt. Es scheint wirklich ein Bug zu sein, denn wenn ich in eine Funktion einen Parameter rotationCenter und eine Rotation angebe, dann sollte es definitiv um das angegebene Zentrum rotiert werden. seufz
Aber hab es mittlerweile auch über das manuelle Setzen der Transformation hinbekommen, ist ja nicht weiter schwer wenn man erstmal weiß dass das geht und vor allem wie. 😉 Funktioniert jetzt also auch.

Wer noch dieses Problem hat sollte sich dies durchlesen. Ist englisch, bezieht sich aber größtenteils auf den Beispielcode des Buches von Tom Miller (einige wenige Zeilen hinzugekommen, die nicht weiter kompliziert sind).

F
66 Beiträge seit 2004
vor 19 Jahren

hm auch wenns schon älter ist.

Wie muss man nun Draw2D anwenden um einfacheine texture zu rendern und sie auch skalieren zu können, sprich etwa eine 50x50 Texture auch als 100x100 anzuzeigen ?