0

取り組んでいるゲームがあります。マウスが特定の点を中心に完全に 360 度回転したかどうかを検出しようとしています。しかし、私はロジックに完全に苦労しています。完全な回転は、動的な開始点から前方または後方に行うことができます。

私が今取り組まなければならないこと:

したがって、任意のプロパティを追加できます。まず、ポイント (剣) に対する現在の角度を取得します。

それで

angleNow =

剣。任意のプロパティを追加できます。角度が移動する方向、開始角度などのプロパティをいじっていました...

私はコードを投稿しますが、それは曖昧で完全に間違っています。

誰でもこれで私を助けることができますか? 疑似コードは良いでしょう。うまくいけば、これはある程度理にかなっています...まあコード

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

回転角度は角度です。

ありがとう。

4

2 に答える 2

0

別の可能な解決策は、円を描くポイントとマウスが開始するポイントに基づいてステージを分割することです。

ステージの四分円を形成するために、マウスと点を通る線と垂線を計算できます。

この画像では、マウスは四角で、点は点です。マウスがどの象限に入るかを調べることで、マウスが移動する方向を知ることができます。マウスが正しい順序 (1-4 または 4-1) で各象限に入ると、マウスが入った第 1 象限に入った瞬間に完全な円を描くことがわかります。

例:

マウスは最初に象限 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 に答える
0

始点と終点が同じである場合、マウスは点の周りに完全な円を描いています。この定義に正確に従うと、ゲームで問題が発生する可能性があります。これは、プレイヤーがサークル完了イベントをスローするためにサークルを完了する必要がないためです。

ただし、マウスが開始する位置、特定の方向に出る位置、特定の方向に入る位置のマウス座標でヒット テストを行うと、このような問題を回避できます。

これはほとんど意味のない言葉の寄せ集めだったので、以下に明るい色の図を示します。

2つのことをふりましょう。まず、青い点が外接したい点であること。2 つ目は、クリックした後にのみサークル テストを実行することです。

青い点の周りの特定のポイントをクリックすると、ヒット テスト エリアが表示されます。それは 3 つの個別のテスト可能領域で構成されており、それらをleft_exit(下の緑の要素としてright_exit表示される)、(上の緑の要素として表示される)、およびcenter(赤の要素として表示される) と呼びましょう。

マウスの下にヒット テスト領域が表示さcenterれ、ステージの端から青い点まで伸びます。

マウスが にある間はcenter、何も起こりません。

ただし、マウスが中心から外れた場合、次の 3 つの可能性があります。

  1. マウスは円を描くように移動できず、緑色の領域にもヒットしませんでした

    この場合、マウスが円を描くのに失敗したことがわかり、ヒット テストをキャンセルできます。

  2. マウスが上の緑色の要素に移動しましたright_exit

    この場合、マウスが特定の方向に移動していることがわかります。その方向を保存するために、ブール値 (おそらく と呼ばれるhit_right) を true に設定できます。

  3. マウスが下の緑色の要素に移動しましたleft_exit

    hit_leftこの場合、マウスが特定の方向に移動していることもわかっており、ブール値 (おそらく と呼ばれる) を trueに設定することでその方向を保存できます。

ケース 2 と 3 には、次の 2 つのオプションがあります。

  1. マウスが赤い要素に戻りますcenter

    その場合、それらは特定の方向に移動していないため、特定のブール値を false に設定できます。

  2. マウスは要素から出て、反対側の緑色の要素に移動します。

    この場合、円はほぼ完成します。もう 1 つのブール値を true に設定できます。

ケース 2 の後、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 に答える