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 ;-) |