Einmal SetGraphicsDriver für alle Plattformen(?) -- Mauslag

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Gray Fox

Betreff: Einmal SetGraphicsDriver für alle Plattformen(?) -- Mauslag

BeitragDi, März 29, 2011 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

als alter PHPler und VB.NETer habe ich bisher keine große Berührung mit dem Thema Grafikprogrammierung gehabt, weshalb ich gezwungen bin, eure wertvolle Zeit in Anspruch zu nehmen Embarassed Die Forensuche lieferte mir leider auch keine zufriedenstellenden Ergebnisse. :/

Ich habe zwei Bausstellen.

Ich möchte micht erstmal auf das klassische 2D konzentrieren. Wenn ich hierbei für die drei Plattformen entwickeln möchte, reicht es dann, wenn ich mit SetGraphicsDriver GLMax2DDriver() arbeite? Wenn ich statt GLMax2DDriver() GLGraphicsDriver() verwende, stürzt mein Programm mit der Fehlermeldung: Unhandled Exception:Attempt to access field or method of Null object ab. Ich ging davon aus, dass beide Modi auf OpenGL basieren, wo liegt nun der Unterschied?

Ich möchte zusätzlich einen selbsterstellten Mauscursor verwenden, aber leider reagiert dieser Cursor recht schwammig (=Mauslag). Vor allem, wenn man den Originalcursor nicht ausblendet, sieht man dieses Problem recht gut. Ist das ein Bug oder ein Fehler in meiner Programmierlogik?

Mein Grundgerüst sieht folgendermaßen aus:

BlitzMax: [AUSKLAPPEN]
SuperStrict
Include "system\modules\class.tile.bmx"
Include "system\modules\class.player.bmx"
Include "system\modules\class.system.sub.graphics.bmx"
Include "system\class.system.bmx"
Global system:coreSystem = New coreSystem

SetGraphicsDriver GLMax2DDriver() 'D3D7Max2DDriver() 'GLGraphicsDriver() 'GLMax2DDriver()
'SetGraphicsDriver GLGraphicsDriver() 'GLMax2DDriver()
Graphics Int(system.get("screenWidth")), Int(system.get("screenHeight")), Int(system.get("screenColorDepth")), Int(system.get("screenHertz"))
system.graphic.add("mouse_standard")

'==================================================
'Main Loop=========================================
'==================================================
While KeyHit(KEY_ESCAPE)=0
system.useFrameLimit()
Cls
DrawText "X:" + system.getMouseX(), 0, 0
DrawText "Y:" + system.getMouseY(), 0, 15
system.mouseMove()
Flip
Wend


Sieht etwas unaufgeräumt aus. Ist alles noch sehr betamässig Wink Als Framelimit und Hertz habe ich 60 (FPS) eingetragen. Hinter system.mouseMove() verbirgt sich folgender Code:
BlitzMax: [AUSKLAPPEN]
	Method mouseMove(X:Int=-1, Y:Int=-1)
If X < 0 And Y < 0 Then
X = Self.getMouseX
Y = Self.getMouseY
End If
Self.graphic.draw("mouse_standard", X, Y)
End Method

mpmxyz

BeitragMi, März 30, 2011 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
GLMax2DDriver nutzt den GLGraphicsDriver, um die Max2D-Funktionen mit Hilfe von OpenGL zu implementieren.
->GLGraphicsDriver bietet keine direkte Max2D-Unterstützung. Daher funktionieren dann entsprechende Befehle nicht.
Zum zweiten Problem:
Wo hast du dort Mausabfragen? ("MouseX"/"MouseY")
Ansonsten gibt es immer eine kleine Verzögerung, welche aber nicht großartig auffallen sollte.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Gray Fox

BeitragMi, März 30, 2011 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
mpmxyz hat Folgendes geschrieben:
GLMax2DDriver nutzt den GLGraphicsDriver, um die Max2D-Funktionen mit Hilfe von OpenGL zu implementieren.
->GLGraphicsDriver bietet keine direkte Max2D-Unterstützung. Daher funktionieren dann entsprechende Befehle nicht.


Also gehe ich richtig in der Annahme, dass die Max2D-Befehle (wie DrawText) nur dazu gedacht sind, die komplexeren OpenGL-Befehle zu vereinfachen, quasi als Wrapperfunktion dienen?

Zitat:

Zum zweiten Problem:
Wo hast du dort Mausabfragen? ("MouseX"/"MouseY")
Ansonsten gibt es immer eine kleine Verzögerung, welche aber nicht großartig auffallen sollte.
mfG
mpmxyz


MouseX / MouseY werden über eine Methode des System-Types abgefragt (Einfaches return MouseX() / MouseY())

Nach einiger Recherche kam raus, dass diese Verzögerung teilweise auf einen Bug in Blitzmax zurückzuführen ist bzw. zum großen Teil die Schuld des Grafikartentreiber ist. Mit der Beschränkung der Framerate und Flip 0 konnte ich dieses Problem (etwas) eindämmen. Zur Not wird es eine Option geben, um den Standardpointer verwenden zu können.

mpmxyz

BeitragMi, März 30, 2011 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Max2D kann sowohl Direct3D als auch OpenGL nutzen. (D3D9Max2DDriver)
Es existiert dazu, dass man einerseits die wichtigsten Zeichenfunktionen einfach nutzen kann, andererseits aber sich nicht dabei um die zugrundeliegende Grafikbibliothek kümmern zu müssen. (Du hast es also relativ gut getroffen. Wink)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Gray Fox

BeitragMi, März 30, 2011 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, dass es auch eine Unterstützung für DX gibt, habe ich gesehen, auch explizit für D3D7, was wohl mit Gründen der Abwärtskompatibilität begründet ist.

Ich muss echt sagen, dass ich BlitzBasic, insbesondere BlitzMax, lange Zeit unterschätzt habe.

Nur schade, dass es bei Types keine Möglichkeit gibt Felder bzw. Methoden als Private oder Protected zu deklarieren.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group