2011-12-18 37 views
1

所以我最近进入了画布并决定通过制作一个简单的游戏来玩弄它。JavaScript for HTML canvas在Firefox中工作,但不在Chrome中

然而,它不能在Chrome浏览器中工作,但它在Firefox中工作。游戏应该是一个非常简单的RTS。您选择一个框,当您右键单击时,您可以将框从一个点移动到另一个点。

这适用于firefox。然而,在Chrome中,它绘制框但不注册任何点击(不能选择/移动框)。在Chrome中也没有任何东西出现在萤火虫控制台中。如果相关,我正在使用xampp的脚本。

编辑:哈,对不起。我真的不知道从哪里开始看,所以我只是把整个事情。我将上面的代码取下,并用下面的更简短的版本替换它。还编辑格式

EDIT2:下面的代码更

/*Game mouse controls*/ 
_screen.mousemove(function(e){ 
    var playerUnitHover = _game.onUnit(playerUnits, e), 
     enemyUnitHover = _game.onUnit(enemyUnits, e); 

     if(typeof(playerUnitHover)=='number') _screen.css('cursor','pointer'); 
     if(typeof(enemyUnitHover)=='number') _screen.css('cursor','not-allowed'); 
}); 

上述代码处理鼠标功能收窄。这是问题可能发生的地方。在firebug chrome中,我可以获取控制台中显示的变量,但当光标位于框上时,它无法注册。这是处理该功能的功能。

/*If mouse coordinates are ontop of unit, then return index of that unit from supplied array argument*/ 
this.onUnit = function(array,e){ 
var numOfUnits  = array.length, 
    mouseOffsetX = e.pageX - offsetX, 
    mouseOffsetY = e.pageY - offsetY; 

for(var i = 0; i < numOfUnits; i++){ 
    var unit = array[i], 
     xRange = mouseOffsetX > unit.x && (unit.x+unit.width) > mouseOffsetX, 
     yRange = mouseOffsetY > unit.y && (unit.y+unit.height) > mouseOffsetY; 

    if (xRange && yRange){ 
     return i; 
    } 

    if(!xRange || !yRange) _screen.css('cursor','crosshair'); 
} 
} 
+0

我的眼睛开始流血 – ajax333221 2011-12-18 06:18:23

+1

太多的代码,编辑它归结为一个问题领域。 – 2011-12-18 09:14:03

+0

你可以展示一个小例子,只是代码不起作用吗?你在Chrome中获得鼠标点击的正确坐标吗? – Jonas 2011-12-18 10:49:12

回答

1

的问题是,

mouseOffsetX = e.pageX - offsetX, 
mouseOffsetY = e.pageY - offsetY; 

是不够的,一致的跨浏览器的鼠标坐标。

可能有很多有效的方法来获取画布的鼠标坐标。我使用的防弹方式可能过于复杂,但它的工作在所有浏览器,并意识到的东西像CSS边框:

getMouse = function(e, canvas) { 
    var element = canvas, offsetX = 0, offsetY = 0; 
    if (element.offsetParent) { 
    do { 
     offsetX += element.offsetLeft; 
     offsetY += element.offsetTop; 
    } while ((element = element.offsetParent)); 
    } 

    // Add padding and border style widths to offset 
    offsetX += stylePaddingLeft; 
    offsetY += stylePaddingTop; 
    offsetX += styleBorderLeft; 
    offsetY += styleBorderTop; 

    // We return an javascript object with x and y defined 
    return { 
    x: e.pageX - offsetX, 
    y: e.pageY - offsetY 
    }; 
} 

的stylePadding和styleBorder可能是没有必要的,除非你有填充/边框。你可以在画布stylePadding这样的:

var stylePaddingLeft, stylePaddingTop, styleBorderLeft, styleBorderTop; 
    if (document.defaultView && document.defaultView.getComputedStyle) { 
    stylePaddingLeft = parseInt(document.defaultView.getComputedStyle(canvas, null)['paddingLeft'], 10)  || 0; 
    stylePaddingTop = parseInt(document.defaultView.getComputedStyle(canvas, null)['paddingTop'], 10)  || 0; 
    styleBorderLeft = parseInt(document.defaultView.getComputedStyle(canvas, null)['borderLeftWidth'], 10) || 0; 
    styleBorderTop = parseInt(document.defaultView.getComputedStyle(canvas, null)['borderTopWidth'], 10) || 0; 
    } 
+0

我的印象是jQuery支持跨浏览器鼠标坐标。很高兴知道情况并非如此。谢谢(你的)信息。 – dcap 2011-12-19 01:56:53

相关问题