0

我有一个正在开发的游戏。我正在尝试检测鼠标是否围绕某个点进行了完整的 360 度旋转。不过,我完全在逻辑上苦苦挣扎。完整的旋转可以从动态起点向前或向后。

我现在必须处理的事情:

所以可以添加任何属性,并且首先我有相对于点的当前角度(一把剑。)

所以

角度现在 =

剑。可以添加任何属性。我在搞乱诸如角度移动的方向,起始角度等属性......

我会发布代码,但它有点晦涩且完全不正确。

谁能帮我解决这个问题?伪代码会很好。希望这是有道理的......好代码

    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 是角度。

谢谢。

4

2 回答 2

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

    意味着我们已经完成了一个循环。

鼠标命中测试圈

//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;
}

我希望这有帮助!

于 2013-05-14T10:36:51.113 回答
0

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

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

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

例子:

鼠标先进入第一象限 (Q1),然后进入 Q2、Q3,然后是 Q4。此时,只有再次进入Q1,鼠标才会越过它开始的那条线,完成一整圈。

鼠标、点和象限的图像

//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;
}
于 2013-05-15T01:23:42.870 回答