Mouse position bug if scrolled (HTML5)
Monkey Forums/Monkey Bug Reports/Mouse position bug if scrolled (HTML5)
| ||
mojo does not take care of scrolled webpages so the mouse positions are wrong if scrolled. Here is the fix: In mojo.html5.js on line 124 and 125 add: var x=e.clientX+document.body.scrollLeft+window.pageXOffset; var y=e.clientY+document.body.scrollTop+window.pageYOffset; In chrome it just works fine without the additions... [edit] The correct code must be: if(navigator.userAgent.indexOf('AppleWebKit') == -1) { x += window.pageXOffset; y += window.pageYOffset; } [/edit] |
| ||
Hi, Can you post some code that shows the bug so I can confirm this fixes it? |
| ||
Hi, This bug exists since a long time ago. Chrome works well but several others browser have this wrong behavior. Try with IE and scroll the page with the above code. I made my own mouse handler to fix it in my game 10.000 Chests mousetest.monkey [monkeycode] Import mojo Extern Global MyHTML5MouseX:Int = "MyHTML5MouseX" Global MyHTML5MouseY:Int = "MyHTML5MouseY" Function InitMouseHandler:Void() = "InitMouseHandler" Public Class MyApp Extends App Field Mx:Int Field My:Int Method OnCreate() SetUpdateRate( 60 ) InitMouseHandler() End Method Method OnUpdate() Mx = MouseX() My = MouseY() End Method Method OnRender() Cls SetColor 255, 255, 255 DrawText "Mojo Mouse: " + Mx + ", " + My, Mx, My If MyHTML5MouseY <> My DrawText "Real Mouse: " + MyHTML5MouseX + ", " + MyHTML5MouseY, MyHTML5MouseX, MyHTML5MouseY Endif End Method End Class Function Main() New MyApp() End Function [/monkeycode] MonkeyGame.html <!DOCTYPE html> <html> <head> <style type="text/css"> body{ height: 100%; // I need a long page that can scroll // overflow: hidden; /* keeps scrollbar off IE */ font-family: arial,sans-serif; font-size: 13px; color: #000; background-color: #fff; padding:0px; margin:0px; } canvas:focus{ outline:none; } </style> </head> <body> <script type="text/javascript"> var MyHTML5MouseX = 0 ; var MyHTML5MouseY = 0 ; </script> <div> Some headers and text <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> </div> <canvas id="GameCanvas" onclick="this.focus();" oncontextmenu="return false;" width=640 height=480 tabindex=1></canvas><br> <textarea id="GameConsole" style="width:640px;height:240px;border:0;padding:0;margin:0" readonly></textarea><br> <script language="javascript" src="main.js">Javascript not supported!</script> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> A long page, under the Canvas. <script type="text/javascript"> function getMousePos(canvas, evt) { // get canvas position var obj = canvas; var top = 0; var left = 0; while (obj && obj.tagName != 'BODY') { top += obj.offsetTop; left += obj.offsetLeft; obj = obj.offsetParent; } // return relative mouse position MyHTML5MouseX = evt.clientX - left + window.pageXOffset; MyHTML5MouseY = evt.clientY - top + window.pageYOffset; } function InitMouseHandler() { var canvas = document.getElementById('GameCanvas'); var context = canvas.getContext('2d'); MyHTML5MouseX = 0 ; MyHTML5MouseY = 0 ; canvas.addEventListener('mousemove', function(evt) { getMousePos(canvas, evt); }, false); } </script> </body> </html> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Oh ! cleaning the html page to post it here, I discovered something: removing: <!DOCTYPE html> from the html page made it works well with IE ! mojo mouse is then accurate. I have a much more complex header in my html game page (I need it), I guess this is the same for Blitzbat. |
| ||
Hi, sorry i was busy for a while. It's the problem as you mentioned Fred. I will post a short example tomorrow ;-) |