Autor Beitrag
auoji
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 14.08.15 04:42 
Aus der UI / XAML kenne ich die Funktion ScaleTransform.TranslatePoint.

Nun in meinem XNA Spiel will ich zoomen in meine Welt/Karte, was an sich kein Problem ist. Aber ich will ein zoomen anbieten können, welches genau um den Mauspunkt zoomt. So wie das in Google/Maps und auch bei anderen Funktioniert.

Ich habe auch die Funktion dazu gefunden eben in Scaletransform. Man bereitet die Scaletransform vor indem man den Scalefaktor ScaleX und ScaleY sowie den CenterPoint ebenfalls CenterX, und CenterY angibt. Der Centerpoint ist die Mausposition. Anschliessend kann man die Funktion ScaleTransform.TranslatePoint nutzen welche ich auf den ScreenHome Point(LinksOben des sichtbaren Ausschnittes) anwenden will.
Rechnerisch funktioniert das gut. Ist der ScreenHome dann bekannt zoomt meine Karte inklusive aller sich bewegender Sprites bereits richtig.
ausblenden C#-Quelltext
1:
2:
3:
Scaletransform.ScaleFaktorXY = 1.01;
Scaletransform.CenterPointXY = Mausposition;
var Point neuesXY = Scaletransform.translatePoint(altesXY);

Also alles gelöst, bis auf das zoomen um die MausPosition. (Kann gerne Tipps geben)

Das Problem ist, dass ich keine Windows UI Elemente und sei es auch nur diese Klasse/Funktion verwenden kann in einem XNA Projekt.

Kennt jemand eine Alternative? Also eine Funktions oder Funktionssammlung mit welcher man eine Position x,y durch die bekannten Werte ScaleX/ScaleY um den Centerpunkt CenterX/CenterY transformieren kann?

Vielen Dank!

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 14.08.15 16:03 
Hallo und :welcome:

bist du mit den Tipps bei deinem Crosspost myCSharp.de - Ersatz von ScaleTransform gesucht weitergekommen (diese bitte demnächst immer hier erwähnen!)?

Von Hand würde ich ja einfach folgende Formel vorschlagen:
ausblenden Quelltext
1:
x_new = center_x + (x - center_x) * scale_x;					

(analog dann für y)
auoji Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 14.08.15 16:38 
Danke!
Ja Hallo zusammen,

Leider nicht aber doch ein paar Benutzereaktionen :-)

Dein Code Tipp: Das war auch mein erster Ansatz. Über ein paar Zoomschritte hinweg zeigt sich eine logerithmische Kurve. Zuerst verrutscht es unter dem Mauspunkt nach oben links, und je näher das zoom, rutscht es unter dem Mauspunkt nach unten rechts.

Es scheint nur über Matrixen und in drei Schritten lösbar zu sein. Ich hoffe, dass ich den Funktionsbody von "Scaletransform.TransformPoint" doch noch selbst füllen kann. Matrixen verstehe ich knapp, aber ich weiss nicht wie sie im Code anzuwenden sind. Wir haben in XNA auch eine MAtrix-Struct welche sicher hilfreich wäre.

Ein Grund warum ich jetzt Windows-Store über MonoGame programmiere, ist dass Ich das Einsetzen von zeitaufwendigen Methoden genau steuern kann. Die Lösung meines Zoom-Problems werde ich vermutlich auch nur durch zeitaufwendige Berechnung lösen können.

Ich werde diese aufwendige Berechnung, so ich sie einmal habe, auch nur auf Benutzereingaben des Zoom anwenden müssen, ansonsten nicht. Ich will ja nur den ScreenHome Point damit berechnen - einmal pro Zoom-schritt. All die folgenden Updates, der ca. 3000 pro 3ms, stützen sich in meinem Spiel heute bereits auf diesen ScreenHome Point. Das geht sehr schnell, wird von mir aber auch bis an die Grenzen genutzt. Darum kann ich in reinem WPF kein hoch animiertes Spiel programmieren, wo die Funktionen vorhanden wären.

Übrigens für alle Interessierten ist mein Code und die verschiedenen Lösungen von kybernetischer Programmierung auf Anfrage verfügbar. Bevor es im Verlauf des Projektes öffentlich wird.
auoji Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 17.08.15 16:04 
Alles iO:

Für dieses 2D Spiel konnte ich auf Matrixen verzichten.
Ich hatte vorher schon korrekt gerechnet. In Testprojekten zeigte es sich, dass ich die ScaleTransform von WPF korrekt nachbaute. Allerdings funktioniert es in meinem Spiel nicht wie gewünscht, nur in den Testprojekten. Warum habe ich Ahnungen, weiss es aber nicht.

Lösung ist dann ganz anders entstanden und viel einfacher:

Den Punkt der Karte merken wo die Mausposition vor dem Zoom Schritt ist.

Nach dem Zoom diesen Punkt der Karte wieder genau auf die Mausposition legen.

Das war es....