Orientierungspunkt einer "Kamera" mittig platziere
Übersicht

![]() |
M0rgensternBetreff: Orientierungspunkt einer "Kamera" mittig platziere |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Community,
Ich stehe jetzt seit zwei Tagen extrem auf dem Schlauch und bräuchte mal einen anständigen Schubser um darunter zu kommen. Undzwar: Ich bin dabei soetwas wie eine Kamera in 2D zu programmieren. Also ein Objekt, dass bewegt werden kann und das somit den sichtbaren Teil des Spielgeschehens anzeigt. Alles außerhalb des Kamerabereiches wird nicht gezeichnet (und unter Umständen auch nicht berechnet). Das funktioniert auch soweit ganz gut. Aber: Der, ich nenne es mal Orientierungspunkt, der Kamera liegt in der linken oberen Bildschirmecke. Das heißt, um den Bildschirminhalt so angezeigt zu bekommen, wie ich ihn ohne Kamera angezeigt bekäme, muss ich die Kamera mit den Koordinaten X=0 und Y=0 initialisieren und nicht mit Bildschirmbreite/2 und Bildschirmhöhe/2. Letzteres wäre aber nötig, denn: Die Kamera kann an ein Objeckt gehangen werden, damit sie automatisch auf diesem Objekt fokussiert bleibt und sich somit mit dem Objekt mitbewegt. Zeichnet man dann dieses Objekt korrekt, so befindet es sich oben links in der Bildschirmecke und nicht in der Bildschirmmitte (ja, man könnte die Koordinaten beim Zeichnen einfach auf die Bildschirmmitte setzen, aber das ist nicht Sinn und Zweck der Sache). Die Klasse für die Kamera sieht momentan so aus: BlitzMax: [AUSKLAPPEN] Type TCamera Ich denke, dass die Kommentare das ganze erklären (wenn nicht fragt nach). (Und ja, es fehlt ein Getter/Setter und der Code ist noch nicht ganz aufgeräumt. Das mache ich wenn die Klasse funktioniert. Dann schreibe ich sie nochmal schön neu.) Ich weiß, dass die Lösung dazu ganz simple Mathematik sein muss. Aber ich komm einfach nicht drauf, was ich wo anders berechnen muss. Es gibt übrigens noch einen Grund, aus dem ich den Bezugspunkt der Kamera mittig platzieren möchte: Man kann ja die Größe des sichtbaren Bereiches angeben. Das heißt momentan ist es so, dass nur rechts und unten ein Rand sein kann. Es soll aber auch möglich sein, dass es links und oben einen Rand gibt, was so ja momentan nicht funktioniert. Ich hoffe, jemand wird schlau aus meinem Gefasel und kann mir helfen. Wäre wirklich super. Lg, M0rgenstern |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Da du ja in Blitzmax programmierst, würde ich ogl einbeziehen.
Ob es mit der DirectX schnittstelle etwas vergleichbares gibt, weiß ich nicht. Allerdings: BlitzMax: [AUSKLAPPEN] Function StartOrthoGL(Width:Int, Height:Int, depth:Int = 0, hertz:Int = 60) ist eine Funktion, die ich sehr häufig verwende. Sie ersetzt den Graphics aufruf und setzt den 0 punkt in die mitte des Bildschirms. Ich persönlich finde es so angenehmer, obgleich man für Gui etc eine eigene Matrix nutzen sollte, oder zumindest den glOrtho aufruf erneut tätitgen, um den nullpunkt nach oben/links zu setzen. Eine andere lösung die "einfach" ist, fällt mir grade nicht ein. Ausser eventuell 2 Const zu setzen (mit den werten width/2 und height/2) und diese von allem zu zeichnenden abzuziehen. (oder zu addieren? ich weiß es grade nicht ![]() Ps: Diese funktion hab ich grade aus Annixa's und meinem BCC57 geklaubt. Ich verwende pur ogl, sie brauchte allerdings auch zugriff auf Max2d für die GUI, deshalb der 'mod' mit manuellem Treiber setzen. Oderso. Keine ahnung mehr ![]() |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
@PhillipK (und damit auch Annixa): Du solltest dir den Befehl SetOrigin mal anschauen, vielleicht hilft das...
OpenGL ist eine ganz gute Idee. Mit glTranslatef kannst du den Origin in die Mitte verschieben und dann mit glRotatef rotieren. Damit lagerst du die Rechnung an die GPU aus, was auch Performance spart. BlitzMax: [AUSKLAPPEN] SetGraphicsDriver GLMax2DDriver() Der Mainloop sollte auch ohne OpenGL-Verständnisse verständlich sein. ZEVS |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn die Kamera auf 0,0 eingestellt ist, muss sie 0,0 in der Mitte anzeigen. Also ist der Offset -Size/2. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey Leute.
Vielen Dank für die Antworten. @PhillipK und @ ZEVS: Mit openGL hab ich mich bisher noch nie beschäftigt. Ich muss auch sagen, dass ich finde, es wäre ein wenig Overkill dafür OGL zu benutzen. Könnte auch an mir liegen, ich seh nicht, welche Vorteile das allgemein bringen würde. @Xeres: Dankeschön. Genau das war es. Keine Ahnung, wie ich so sehr auf dem Schlauch stehen konnte. Lg, M0rgenstern |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ZEVs: SetOrigin ist mir durchaus bekannt. Nur verfolge ich einen kleinen kontrollwahn, weswegen ich lieber selbst alles mit OGL erstelle.
M0rgenstern: Wenn ich annixa richtig verstanden habe, lassen sich damit auch alle normalen befehle verwenden. Nur das halt explizit der OGL treiber verwendet wird, nicht der DirectX treiber. Deswegen hatte ich auch diese funktion kopiert, bei meiner habe ich GraphicsGL verwendet, was nur direkten OGL gebrauch zulässt. Die variante finde persönlich besser, was aber wirklich geschmacks sache ist. Ich hab lange nichtsmehr mit normalen bmx befehlen gemacht, weswegen ich garnichtmehr weiß, was da anders wäre *hust* Und ich bin so ein schussel, offsets addieren vergesse ich andauernd ^^ |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group