[Monkey] [HTML5] SetScissor und TMatrix (Fehler in Opera)

Übersicht Andere Programmiersprachen Beginners-Corner

Neue Antwort erstellen

Holzchopf

Meisterpacker

Betreff: [HTML5] SetScissor und TMatrix (Fehler in Opera)

BeitragSa, Feb 08, 2014 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Zusammen!

Mir ist aufgefallen, dass sich SetScissor im Zusammenhang mit einer Transformations-Matrix auf Opera nicht gleich verhält wie im FireFox und Chrome: Während zB: Chrome den Clip-Bereich mit skaliert und transformiert, muss man das in Opera händisch lösen Confused

Code: [AUSKLAPPEN]
Import mojo

Extern
   Function Rescale:Int()="(function(){var canvas=document.getElementById('GameCanvas'); canvas.width=window.innerWidth; canvas.height=window.innerHeight;})"
Public

Function Main:Int()
   New Fullscreen
End Function

Global wscale:Float, hscale:Float, scale:Float
Global width:Int, height:Int
Global offx:Int, offy:Int

Class Fullscreen Extends App
   Method OnCreate()
      SetUpdateRate(50)
   End Method
   
   Method OnUpdate:Int()

   End Method
   Method OnRender()
      Rescale()
   
      wscale = DeviceWidth / 640.0
      hscale = DeviceHeight / 480.0
      scale = Min(wscale, hscale)
      width = 640*scale
      height = 480*scale
      offx = (DeviceWidth-width)/2
      offy = (DeviceHeight-height)/2
   
      Cls(0,0,0)
      
      PushMatrix()
      Translate(offx, offy)
      Scale(scale, scale)
      
      SetScissor(0,0, 640,480)
      Cls(255,128,128)
      
      DrawRect(20,20,600,440)

      DrawText(DeviceWidth,20,200)
      DrawText(DeviceHeight,20,220)

      SetScissor(20,20,100,100)
      Cls(128,128,255)
      
      PopMatrix()
   End Method
End Class

Function SetScissor(pX:Int, pY:Int, pW:Int, pH:Int)
   ' Opera-Version
   'graphics.SetScissor(pX*scale +offx, pY*scale +offy, pW*scale, pH*scale)
   ' Chrome-Version
   graphics.SetScissor(pX, pY, pW, pH)
End Function


Gibt es eine Möglichkeit, in Monkey irgendwie Browserweichen einzurichten? Oder existiert eine andere gangbare Lösung zu diesem Problem?

MfG,
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

ZEVS

BeitragSo, Feb 09, 2014 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Von Monkey verstehe ich nichts, aber in JavaScript sind Browserweichen möglich. Das navigator-Objekt, insbesondere navigator.userAgent, sollte hilfreich sein.

ZEVS

Holzchopf

Meisterpacker

BeitragSo, Feb 09, 2014 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm ja das sieht nach einer Lösung aus. Kennt sich jemand von euch mit Browserweichen aus? Sind die zuverlässig? Oder sind die nur dann zuverlässig, wenn man sie extrem aufbläht und alle erdenklichen user-agent-strings berücksichtigt?

Eine Alternative wäre es doch auch, alle Draw-Befehle und SetScissor so zu überladen, dass ich auf Scale und Transform ganz verzichten kann. Oder würde das Performance-Mässig zu viel Einbusse bedeuten?
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

ZEVS

BeitragSo, Feb 09, 2014 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es dir nur auf Opera ankommt, kannst du auch prüfen, ob ein Objekt namens "opera" existiert:
Code: [AUSKLAPPEN]
if (typeof opera == "undefined") {
// normaler Code
} else {
// spezieller Opera-Code
}

Das sollte bei allen nicht museumsreifen Opera-Versionen funktionieren. Zudem halte ich es für unwahrscheinlich, dass ein anderer Browser ein solches Objekt definiert.

Die Transformationsmatrix selbst anzuwenden, sollte m.E. aber performancemäßig gut gehen. Bei folgendem Code: [AUSKLAPPEN]
var a = 0.1, b = -0.3, c = 7.0, d = 3.1, e = 99, f = -2;
for (var i = 0; i < 100000; i++) {
    var x = 5, y = 5;
    var x_ = x * a + y * b + c;
    y = x * d + y * e + f;
    x = x_;
}

merke ich nur eine geringe Laufzeit (<1s); und das sind 100 000 Matrix-Anwendungen.

ZEVS

Holzchopf

Meisterpacker

BeitragSo, Feb 09, 2014 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh danke! Das ist eine weitaus einfachere Lösung, als den UserAgent-String zu prüfen =)

Mit dem selber anwenden meine ich eigentlich die Draw-Befehle, also, dass ich diese überlade, um auf die interne Matrix zu verzichten. Also
Code: [AUSKLAPPEN]
Function DrawImage(...)
    graphics.DrawImage(pImg, x*scale+transx, y*scale+transy, 0, scale, scale, pFrame)
End Function


Etc...

MfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group