2012-06-04 110 views
0

我有一个函数,查看游标(x,y),看它是否落在几个矩形之一(a<x<b, c<y<d)。但是,我需要根据光标是否曾经落入而设置一个布尔值,使其成为一个特定的矩形,并且只有在光标落入其他矩形时才能将其重置。换句话说Javascript布尔“切换”

  1. A为真,如果光标下降矩形X

  2. A内是假,如果光标落在矩形1,2,3内或4

  3. A保留如果其前值它的任何地方,但Y或Z

麻烦的是,无论我做什么布尔返回false,如果我离开第一个矩形,我是否前往其他2 rectan无论是否。我试图做布尔全球但这没有帮助。

代码;

var r 
var s 
var l 
var inCenter = false 

function makeRects(a,b) 


{  
    r = a-b 
    s = (a/2) - (b/2) 
    l = (a/2) + (b/2) 

    lSide = new Array(4) 
    lSide[0] = 0 
    lSide[1] = 0 
    lSide[2] = a 
    lSide[3] = b 

    tSide = new Array(4) 
    tSide[0] = 0 
    tSide[1] = 0 
    tSide[2] = b 
    tSide[3] = a 

    rSide = new Array(4) 
    rSide[0] = r 
    rSide[1] = 0 
    rSide[2] = b 
    rSide[3] = b 

    bSide = new Array(4) 
    bSide[0] = 0 
    bSide[1] = r 
    bSide[2] = b 
    bSide[3] = b 

    aSquare = new Array(4) 
    aSquare[0] = 0 
    aSquare[1] = 0 
    aSquare[2] = s 
    aSquare[3] = s 

    bSquare = new Array(4) 
    bSquare[0] = l 
    bSquare[1] = 0 
    bSquare[2] = b 
    bSquare[3] = s 

    cSquare = new Array(4) 
    cSquare[0] = 0 
    cSquare[1] = l 
    cSquare[2] = s 
    cSquare[3] = r 

    dSquare = new Array(4) 
    dSquare[0] = l 
    dSquare[1] = l 
    dSquare[2] = r 
    dSquare[3] = r 

    lCenter = new Array(4) 
    lCenter[0] = 0 
    lCenter[1] = s 
    lCenter[2] = b 
    lCenter[3] = l 

    tCenter = new Array(4) 
    tCenter[0] = s 
    tCenter[1] = 0 
    tCenter[2] = l 
    tCenter[3] = b 

    rCenter = new Array(4) 
    rCenter[0] = r 
    rCenter[1] = s 
    rCenter[2] = a 
    rCenter[3] = l 

    bCenter = new Array(4) 
    bCenter[0] = s 
    bCenter[1] = r 
    bCenter[2] = l 
    bCenter[3] = a 

    mCenter = new Array(4) 
    mCenter[0] = s 
    mCenter[1] = s 
    mCenter[2] = l 
    mCenter[3] = l 
} 

function cursor(a,b) 

{ 
    var inaSquare = false 
    var inbSquare = false 
    var incSquare = false 
    var indSquare = false 
    var inCenter = false 

    if ((a>aSquare[0] && a<aSquare[2])&&(b>aSquare[1] && b<aSquare[3])) 
    { 
    inaSquare = true 
    post("aSquare"); 
    post(); 
    } 

    if ((a>bSquare[0] && a<bSquare[2])&&(b>bSquare[1] && b<bSquare[3])) 
    { 
    inbSquare = true 
    post("bSquare"); 
    post(); 
    } 

    if ((a>cSquare[0] && a<cSquare[2])&&(b>cSquare[1] && b<cSquare[3])) 
    { 
    inbSquare = true 
    post("cSquare"); 
    post(); 
    } 

    if ((a>dSquare[0] && a<dSquare[2])&&(b>dSquare[1] && b<dSquare[3])) 
    { 
    indSquare = true 
    post("dSquare"); 
    post(); 
    } 

    if (inaSquare||inbSquare||incSquare||indSquare) 
    { 
    inCenter = false 
    } 

    if ((a>mCenter[0] && a<mCenter[2])&&(b>mCenter[1] && b<mCenter[3])) 
    { 
    inCenter = true 
    inaSquare = false 
    inbSquare = false 
    incSquare = false 
    indSquare = false 
    } 

    if (((inCenter && a>s) && a<l) && b<lCenter[3]) 

    { 
    outlet (1, 1) 
    } 

    else if (((inCenter && a>s) && a<l) && b>rCenter[0]) 

    { 
    outlet (1, 2) 
    } 

    else if (((inCenter && b>s) && b<l) && a<tCenter[3]) 

    { 
    outlet (1, 3) 
    } 


    else if (((inCenter && b>s) && b<l) && b>bCenter[1]) 

    { 
    outlet (1, 4) 
    } 

    else 

    { 
    outlet (1, 0) 
    } 
    post("inCenter"); 
    post(inCenter); 
    post(); 
    post("inaSquare"); 
    post(inaSquare); 
    post(); 
    post("inbSquare"); 
    post(inbSquare); 
    post(); 
    post("incSquare"); 
    post(incSquare); 
    post(); 
    post("indSquare"); 
    post(indSquare); 
    post(); 

} 
+1

你能张贴此功能你所说的重新设置doTest为真? –

+2

你的代码在哪里?我的水晶球坏了,我昨天才订购了一个新的:( – gdoron

+0

)编辑这个问题可能是一个好主意,包括你现在的代码。 –

回答

0

好吧,我修改了原来的演示基于我认为你所要完成的,但它仍然不是很清楚,所以你需要更好地描述你所要完成的,而不是如何根据切换布尔什么在矩形坐标点击测试。您可能会以简单的方式完成您尝试完成的任务,而无需使用基于坐标的命中测试。

演示:

http://jsfiddle.net/DaveAlger/cVPpU/5/

HTML:

<p id="toggle-state">false: center not hit</p> 
<p id="mouse-xy"></p> 

<canvas id="top" class="box" x="200" y="50" width="100" height="100" c="#933" b="#faa"></canvas> 
<canvas id="left" class="box" x="50" y="200" width="100" height="100" c="#993" b="#ffa"></canvas> 
<canvas id="right" class="box" x="350" y="200" width="100" height="100" c="#696" b="#dfd"></canvas> 
<canvas id="bottom" class="box" x="200" y="350" width="100" height="100" c="#369" b="#adf"></canvas> 
<canvas id="center" class="box" x="200" y="200" width="100" height="100" c="#999" b="#ddd"></canvas> 

CSS:

.box{position: absolute;} 
#mouse-xy{float:right;padding:30px;color:#999;font-family:sans-serif;} 

JS:

var isCenterHit = false; 
var checkCenterHit = true; 

// draw canvas rectangles 
$('.box').each(function(i) { 
    //alert(i); 
    var id = $(this).attr('id') 
    var w = $(this).width(); 
    var h = $(this).height(); 
    var c = $(this).attr('c'); 
    var x = $(this).attr('x'); 
    var y = $(this).attr('y'); 

    drawRect(document.getElementById(id).getContext('2d'), w, h, c, id); 
    $(this).offset({top: y, left: x}); 
}); 

function drawRect(ctx, width, height, color, text) { 
    ctx.fillStyle = color; 
    ctx.fillRect(0, 0, width, height); 
    ctx.fillStyle = '#fff'; 
    ctx.font = '30px sans-serif'; 
    ctx.textBaseline = 'top'; 
    ctx.fillText(text, 0, 0); 
} 

// listen for mouse over 
$(document).mousemove(function(e){ 
    var x = e.pageX; 
    var y = e.pageY; 

    var tX = $(e.target).attr('x'); 
    var tY = $(e.target).attr('y'); 
    var tW = $(e.target).width(); 
    var tH = $(e.target).height(); 

    // update mouse location 
    $('#mouse-xy').html("center hit: " + isCenterHit + " | X: " + x + " Y: " + y); 

    // rectangle coordinate hit test (this can be done other ways too) 
    if (x > tX && x < tX + tW && y > tY && y < tY + tH) { 

     // toggle the boolean 
     if (checkCenterHit && $(e.target).attr('id') === 'center') { 
      isCenterHit = !isCenterHit; 
      checkCenterHit = false; 
     } 

     if (isCenterHit) { 
      // do this when center hit state is 'on' 
      $('body').css('background-color',$(e.target).attr('b')); 
      $('canvas').css('cursor','pointer'); 
     } else { 
      // do this when center hit state is 'off' 
      $('body').css('background-color',''); 
      $('canvas').css('cursor',''); 
     } 
    } 
    else { 
     $('body').css('background-color','#ffffff'); 
     checkCenterHit = true; 
    } 
}); 
+0

这很棒,但不幸的是,点击事件需要生活在脚本中,并设置切换 – jamesson

+0

,请检查更新的小提琴。我不完全相信你的“活脚本”的意思这个例子几乎是100%脚本只画布元素HTML,但那些可以动态脚本如果需要 – DaveAlger

+0

创建过此琴表明,只有增加更多矩形一切仍然有效,其中每个时间的中心矩形打和关闭改变行为所有其他的布尔切换一样... http://jsfiddle.net/DaveAlger/cVPpU/6/ – DaveAlger

1

对不起,这不是一个真正的答案,但我编辑了代码以使用循环和数组/地图。这样你可以得到更多的帮助。希望您能够从中学到一些东西,以及:)

所以,你的代码也可能是这样的:

var r 
var s 
var l 

function makeRects(a,b) 
{ 
    r = a-b 
    s = (a/2) - (b/2) 
    l = (a/2) + (b/2) 

    // Place all arrays inside maps, so that we can loop through them later. 
    side = { 
     l: [0, 0, a, b], 
     t: [0, 0, b, a], 
     r: [r, 0, b, b], 
     b: [0, r, b, b], 
    } 

    square = { 
     a: [0, 0, s, s], 
     b: [l, 0, b, s], 
     c: [0, l, s, r], 
     d: [l, l, r, r] 
    } 

    center = { 
     l: [0, s, b, l], 
     t: [s, 0, l, b], 
     r: [r, s, a, l], 
     b: [s, r, l, a], 
     m: [s, s, l, l] 
    } 
} 

function cursor(a,b) 
{ 
    var inside = { 
     a: false, 
     b: false, 
     c: false, 
     d: false, 
     center: true 
    } 

    // This loop will run through every key of the map, and x will hold the key 
    for (var x in square) { 
     if ((a>square[a][x] && a<square[x][2])&&(b>square[x][1] && b<square[x][3])) 
     { 
      inside[x] = true; 
      // Instead of checking if the cursor is inside the center, we assume it 
      // is by default, and if it is found inside a square, inside['center'] is set to false 
      inside['center'] = false; 
      post(x + "Square"); 
      post(); 
     } 
    } 

    // Not sure what you want to do here... 
    if (((inside['center'] && a>s) && a<l) && b<center['l'][3]) 
    { 
    outlet (1, 1) 
    } 

    else if (((inside['center'] && a>s) && a<l) && b>center['r'][0]) 
    { 
    outlet (1, 2) 
    } 

    else if (((inside['center'] && b>s) && b<l) && a<center['t'][3]) 
    { 
    outlet (1, 3) 
    } 


    else if (((inside['center'] && b>s) && b<l) && b>center['b'][1]) 
    { 
    outlet (1, 4) 
    } 

    else 
    { 
    outlet (1, 0) 
    } 


} 
+0

非常感谢这个。回答你的问题,这正是我所问的。当光标位于中心时,我想创建一个名为inCenter的全局布尔值true。它默认情况下不会激怒 - 我需要它来看看我是否进入一个边长等于b的中心广场来将它设置为true。 _一旦这是真的,我可以开始聆听其他广场,这应该将其设置为假。它保持真实,除非其他方块被访问。 – jamesson

+0

这些插座是环境特有的方法,实际上它们可以用警报(不管)来代替。 – jamesson

0

可能是你的命中测试功能需要呼吁一个标志doTest设置为true最初,然后设置为false,一旦中心矩形打

那么你可以一次不同的矩形打