2013-05-14 66 views
0

我有一个正在处理的游戏。我试图检测鼠标是否围绕某个点完成了360度旋转。尽管如此,我完全在努力。完整的旋转可以从动态起点向前或向后。确定鼠标是否围绕某个点做了一个完整的圆形

我有现在的工作:(剑)

所以任何属性可以被添加,并开始与我有电流相对于点的角度

所以

angleNow =

and

剑。任何属性都可以添加。我是用像角移动的方向,起始角度等性能瞎搞......

我会后的代码,但它是一种模糊的,完全不正确。

任何人都可以帮我解决这个问题吗?伪代码会很好。希望这是有道理的... ...代码

if (sword.motionDirection == Const.DIRECTION_POSITIVE) { 

     if (rotateAngle >= sword.motionCurrent) { trace("GOOD" + gameCounter); 
      sword.motionCurrent = rotateAngle; // update the current 
     } 
     else { // switch directions 
      trace("SWITCH" + gameCounter); 
      sword.motionCurrent = rotateAngle; sword.motionDirection = Const.DIRECTION_NEGATIVE; sword.motionStart = rotateAngle; 
     } 
    } 

rotateAngle是角度。

谢谢。

回答

0

另一种可能的解决方案是基于点到圆和鼠标开始的点来划分舞台。

您可以通过鼠标和点以及垂直线计算一条直线,以形成舞台的象限。

在这张图片中,鼠标是一个正方形,点是一个点。你可以通过找出它进入的象限来判断鼠标移动的方向。一旦鼠标以正确的顺序(1-4或4-1)进入每个象限,就知道鼠标进入第一象限的那一刻,它将会完成一整圈。

实施例:

鼠标进入象限一个(Q1)的第一然后进入Q2,Q3,和Q4然后。此时,只有再次进入Q1,鼠标才能通过它开始的线并完成一整圈。

Image of Mouse, Point, and quadrants

//Import mouse events 
import flash.events.MouseEvent; 
//on whatever event you want throw function to check_for_circle 

    var bound_Q1:Array = [0,90]; 
    var bound_Q2:Array = [90,180]; 
    var bound_Q3:Array = [180,270]; 
    var bound_Q4:Array = [270,0]; 
    var Q1 = false; 
    var Q2 = false; 
    var Q3 = false; 
    var Q4 = false; 


function check_for_circle(event:MouseEvent){ 
    //Calculate angle bounds for each Quadrant 
    //add logic to make sure degrees wrap at 360 
    bound_Q1[0]=//mouse start degree; 
    bound_Q1[1]=bound_Q1[0]+90; 
    bound_Q2[0]=bound_Q1[1]; 
    bound_Q2[1]=bound_Q2[0]+90; 
    bound_Q3[0]=bound_Q2[1]; 
    bound_Q3[1]=bound_Q3[0]+90; 
    bound_Q4[0]=bound_Q3[1]; 
    bound_Q4[1]=bound_Q1[0]; 
} 

if(rotateAngle>bound_Q1[0] && rotateAngle<bound_Q1[1]/*mouse is in Q1*/){ 
    if(Q1 && Q2 && Q3 && Q4){ 
    //full circle! 
    }else if(Q1 && Q2){ 
    //This means we turned around 
    Q4=false; 
    Q3=false; 
    Q2=false; 
    } 
    //we are in Q1 
    Q1=true; 
} 

if(rotateAngle>bound_Q2[0] && rotateAngle<bound_Q2[1]/*mouse is in Q2*/){ 
    if(Q1 && Q2 && Q3 && Q4){ 
    //we started at Q4 and turned around 
    Q1=false; 
    }else if(Q1 && Q2 && Q3){ 
    //We started at Q1 and turned around 
    Q3=false; 
    Q4=false; 
    } 
    //we are in Q2 
    Q2=true; 
} 

if(rotateAngle>bound_Q3[0] && rotateAngle<bound_Q3[1]/*mouse is in Q3*/){ 
    if(Q1 && Q2 && Q3 && Q4){ 
    //we started at Q1 and turned around 
    Q4=false; 
    }else if(Q4 && Q2 && Q3){ 
    //We started at Q4 and turned around 
    Q2=false; 
    Q1=false; 
    } 
    //we are in Q3 
    Q3=true; 
} 
if(rotateAngle>bound_Q4[0] && rotateAngle<bound_Q4[1]/*mouse is in Q4*/){ 
    if(Q1 && Q2 && Q3 && Q4){ 
    //full circle! 
    }else if(Q4 && Q3){ 
    //This means we turned around 
    Q1=false; 
    Q3=false; 
    Q2=false; 
    } 
    //we are in Q4 
    Q4=true; 
} 
0

如果鼠标在同一个地方开始并结束,则鼠标在该点周围形成一个完整的圆。如果我们严格遵循这个定义,它会在游戏中造成一些问题,因为玩家不需要完成圈子来抛出任何圈子完成事件。

但是如果你做一个命中测试用鼠标所在的坐标鼠标开始,它退出某个方向,当它在一定方向进入,你将能够避免这样的问题。

由于这是一个混乱的话,几乎没有任何意义,我下面有一个鲜艳的颜色图。

让我们假装两件事。首先,蓝点是我们想要限定的点。其次,我们只想在点击后进行我们的圈子测试。

当我们点击我们周围的蓝点的某一点,会出现一个命中测试区域。它是由三个独立的可测试领域,我们姑且称之为left_exit(作为下绿色元素可见),right_exit(如上部绿色元素可见),并center(如红色元素可见)。

命中测试区域出现从而center是鼠标之下,从舞台到蓝点的边缘一直延伸。

当鼠标停留在center,发生什么。

然而,当鼠标移出中心有三种可能出现次数:

  1. 鼠标未能以循环的方式移动,没有击中任何绿地

    在这种情况下,我们知道鼠标未能围成一圈,我们可以取消点击测试。

  2. 鼠标移动到上部的绿色元素right_exit

    在这种情况下,我们知道鼠标正在向特定方向移动,为了保存该方向,我们可以设置一个布尔值(可能被称为hit_right)为true。

  3. 鼠标移动到较低的绿色元素left_exit

    在这种情况下,我们也知道鼠标正在向特定方向移动,我们可以通过设置布尔值(可能称为hit_left)为true来保存该方向。

在情况2和3有两个可能的选项:

  1. 鼠标返回到红色元件center

    在这种情况下,它们不再沿特定方向移动,因此我们可以将某些布尔值设置为false。

  2. 鼠标退出元素并转到相反的绿色元素。

    在这种情况下,圆几乎完成。我们可以将另一个布尔值设置为true。

情况下2之后,有两种可能的选择:

  1. 鼠标离开错误的方向这个绿色元素。

    含义圆仍不完整。

  2. 鼠标进入红色元素center

    含义我们已经完成了一个圆圈。

Mouse Hit Test Circle

//Import mouse events 
import flash.events.MouseEvent; 
//on mouse event MOUSE_DOWN throw function check_for_circle 
stage.addEventListener(MouseEvent.MOUSE_DOWN, check_for_circle); 

    var hit_right = false; 
    var hit_left = false; 

function check_for_circle(event:MouseEvent){ 
    //draw invisible hit-test 
    //make sure that center forms a line from the 
    //point, through the mouse, and to the edge of the stage 
} 

right_exit.addEventListener(MouseEvent.MOUSE_OVER, check_right); 
left_exit.addEventListener(MouseEvent.MOUSE_OVER, check_left); 
center.addEventListener(MouseEvent.MOUSE_OVER, check_center); 
//add MOUSE_OUT checks as well 
//and if you are scared that people will try to cheat, 
//add a MOUSE_LEAVE function to the stage 

function check_right(event:MouseEvent){ 
    hit_right = true; 
} 
function check_left(event:MouseEvent){ 
    hit_left = true; 
} 
function check_center(event:MouseEvent){ 
    if(hit_left && hit_right){ 
    //yay it worked! 
    } 
    else{ 
    hit_left = false; 
    hit_right = false; 
} 

我希望这有助于!

+0

谢谢,我参加了一个裂缝它,并有以下它的一些麻烦。我认为我有主要想法,就像在影片剪辑中提到的那样,并确保鼠标按照正确的顺序进行测试。 虽然,我正在寻找一个可能的简单解决方案。我在逻辑上仍然存在一些缺陷,但至少在正面方向上工作正常。我也摆脱了一个动态的“起点”,以简化它。 – 2013-05-14 20:48:56

+0

我不能为我的生活弄清楚如何发布代码,但这里是未知的: '\t if(rotateAngle> lastAngle)lastAngle = rotateAngle; \t否则如果(rotateAngle 350 && rotateAngle> = 0){ \t \t \t迹( “PossibleCircle&重置” +计数); \t \t \t lastAngle = 0; \t \t} \t} \t否则{ \t \t迹( “elsed”); \t} ' 它可以在正方向上移动,但如果向后移动,它可能会使鼠标移动。 角度rotateAngle是相对于其盘旋的点和鼠标。我真的只是想看看鼠标是否在所有点上移动。 – 2013-05-14 21:03:52

+0

如果我不能以这种方式工作,我会再看看你的方式,谢谢你的完整例子。 – 2013-05-14 21:05:23