Autor Beitrag
Namenlosnameless
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Sa 22.01.11 15:34 
Hallo!

Ich hab mir ein neues Projekt angefangen, in dem ich das wohl beste iPhone App, das er derzeit gibt Clonen will!
Trainyard!

vielleicht kennen es ja ein paar ;D

Das spiel ist denkbar simpel: Man hat Züge verschiedener Farbe die sich die man durch gut durchdachte Schienennetze in die Bahnhöfe bringen muss!

Ich bin bereits soweit, dass ich das Schienennetz zeichnen kann, jetzt fehlt mir noch die Programmlogik zum Fahren lassen der Züge!

Dazu hätte ich einige Fragen!

Zuert einmal mein Programmaufbau: Ich habe eine Klasse Schiene, in der ich angebe wie die Schiene liegt (also Eingangspunkt zum Feld und Ausgangspunkt).
Dann gibt es eine Klasse Zug, in der die Zugfarbe usw. festgelegt wird. In der Schienen Klasse gibt es eine Liste in der alle Züge die sich gerade darauf befinden gespeichert werden.
Und es gibt noch eine Klasse Feld in der die X,Y-Position des Feldes sowie eine Liste aller Schienen auf dem Feld, definiert werden!

Alle Felder werden in einer eigenen Liste verwaltet!

Am Anfang wollte ich einfach ein paar Bilder des Zuges in den Kurven definieren und die dann einfach abspielen lassen.
Diese Möglichkiet will ich aber nicht verwenden, da ich verschiederne Geschwindigkeiten einbaun will, und da müsste ich schon seehr viele Bilder machen!

Darum muss ich ein Bild nehmen und immer an die Schiene angepasst fortbewegen und drehen.

Dabei ist mein Problem begraben, da ich nicht weiß wie ich einen Zusammenhang zwischen drehung und Positionsveränderung herstellen soll!
gibt es da eine Formel dafür oder kann muss ich experimentell versuchen den Zug auf der Schiene zu halten?

trainyard1_016
pic1
Einloggen, um Attachments anzusehen!
_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 22.01.11 16:41 
Hey,

auf geraden is das ganze ja einfach, da musst du nur dein Bild verschieben. In den Kurfen würde ich mir den Eckpunkt des Bildes nehmen, der von der Kurve engeschlossen wird, und den Zug dann im Radius des Halben Feldes um den Eckpunkt drehen. Das geht ganz normal mit bisl sin und cos. Die wichtigere Frage hierbei ist: Wie zeichnest du das ganze? Weil das drehen von Bildn kostet auf der CPU ne mengre Rechenzet, das Könnte zu Problemen führen. Andorra 2D ist z.B. ne gute OpenGL-2D-Engine für Delphi...

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: Namenlosnameless
Namenlosnameless Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Sa 22.01.11 16:47 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:

Andorra 2D ist z.B. ne gute OpenGL-2D-Engine für Delphi...


Mit dem Unterschied das ich mit C# arbeite ;D
wenn das drehen aufwendig ist? Wie kann ich das Problem umgehen?

_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 22.01.11 17:01 
Drehen ist nicht aufwendig! Überhaupt, spätestens seit es GM_ADVANCED gibt (also so um Windows NT4 rum) bietet GDI sehr gute und ab NT5/W2k auch schnelle Möglichkeiten, fast alles zu tun was man im OrthoMode von OpenGL tun könnte. Außer Tiefentest/Z-Buffer.

In C# hast du zu allem Überfluss ja auch GDI+, das ist da nochmal schöner. Glaube ich, habs noch nicht praktisch eingesetzt :lol:

Mit normalem GDI würde man hier eine XFORM-Transformationsmatrix bauen und per Set/ModifyWorldTransform übergeben. Dann reicht ein einfaches BitBlt oder vergleichbares, um die Grafik gedreht auszugeben.

In einer Linkskurve fährst du also z.B einen Kreisbogen mit R=Raster/2 und Mittelpunkt in einer Raster-Ecke. Das kann man direkt in eine XFORM gießen und anwenden, dann schiebst du nur noch den Zug "gradeaus" weiter und erzeugst aus dem Weg den Winkel, und GDI macht die Transformation in ein gedrehtes Koordinatensystem.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: Namenlosnameless
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 22.01.11 17:17 
Jupp, wenn die Mathematik steht, ist das ein einfaches Graphics.RotateTransform, Graphics.DrawImage :) . Führt man das innerhalb eines BeginContainer-EndContainer-Blocks aus, ist danach die alte Transformationsmatrix auch wiederhergestellt.

_________________
>λ=

Für diesen Beitrag haben gedankt: Namenlosnameless
Namenlosnameless Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Sa 22.01.11 17:21 
okay also mit dem Graphics.RotateTransform, Graphics.DrawImage hab ich eh schon angefangen!
jetzt muss ich nurnoch schaun wie ich die Verknüpfung zwischen Geschwindigkeit und Bilder pro Feld herstelle!

Aber da werd ich sicher selber draufkommen.

_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 22.01.11 17:28 
Ich würde das ganze erst mal mit einem Punkt rechnen und die Drehung noch gar nicht berücksichtigen. Dann kommt ein zweiter Punkt hinzu, der dem ersten Punkt um eine feste Distanz hinterherhinkt. Der erste Punkt stellt dann die Vorderachse und der zweite Punkt die Hinterachse dar.

Sinus und Cosinus bzw. den Winkel musst du überhaupt nicht kennen. Die zwei Punkte definieren die Richtung. Wenn man das Delta zwischen den beiden Punkten als Vektor v auffasst und noch normiert, ist die Drehmatrix einfach (vx -vy; vy vx).
Namenlosnameless Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Sa 22.01.11 17:28 
hab das gerade mal ausprobiert!

Was ich noch nicht geschafft hab: um einen bestimmten Punkt zu drehen!

_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 22.01.11 17:41 
Wenn du mit WPF entwickelst, kannst du RotateTransform in deinem XAML verwenden. Das Zentrum der Drehung kannst du mit CenterX/CenterY angeben und den Winkel mit Angle. Den Winkel berechnest du mit Math.Atan2 aus dem Richtungsvektor. Die Properties kannst du direkt an dein ViewModel binden und musst dich überhaupt nicht ums Rendering kümmern. Die Grafiken hinterlegst du am besten als Vektorgrafik. Dann kriegst du einen sauberen Output beim Drehen und die ganze Sache vermischt sich optimal mit dem Hintergrund. Ausserdem ist das ganze hardwarebeschleunigt und flackerfrei.
Mit ein paar wenigen Handgriffen kannst du das ganze auch grad auf Silverlight portieren und so eine Browser oder Windows Phone App machen.
Namenlosnameless Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Sa 22.01.11 17:54 
Ich bin bis jetzt noch bei den WinForms hängen geblieben!

Das WPF-Buch sollte in der nächten Woche kommen ;D
Dann werd ich wohl umsteigen!

_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
Namenlosnameless Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Sa 22.01.11 18:48 
kann mir wer sagen um welchen Punkt RotateTrasform dreht? weil wenn ich z.B. um 45° drehen wird das bild aber nicht durch den Mittelpunkt sondern um einen punkt links oben gedreht (ich schätze mal es ist der Punkt auf dem das Bild gezeichnet ist oder?

_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 22.01.11 19:01 
Den Ursprung der Transformationsmatrix kannst du mittels der TranslateTransform-Methode ändern (d.h. zum Bildmittelpunkt verschieben).
MSDN hat folgendes geschrieben:

Ändert den Ursprung der Koordinaten, indem die angegebene Verschiebung der Transformationsmatrix dieses Graphics vorangestellt wird.

Hinweise
Der Ursprung ist i. d. R. die linke obere Ecke der Zeichnungsoberfläche. Die Verschiebungsoperation umfasst das Multiplizieren der Transformationsmatrix mit einer Matrix, deren Verschiebungsangaben der dx-Parameter und der dy-Parameter sind. Diese Methode wendet die Verschiebung an, indem sie der Transformationsmatrix die Übersetzungsmatrix voranstellt.
Namenlosnameless Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Sa 22.01.11 19:23 
ausblenden C#-Quelltext
1:
e.Graphics.TranslateTransform(bmp.Width/2,bmp.Height/2);					


so müsste das aussehen oder?
aber bringt keine anderen ergebnisse als ohne!


Kommando zurück! Problem gelöst!

_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 22.01.11 22:24 
Vielleicht für nächste Woche ;)
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Namenlosnameless