0

私はプログラミングが初めてで、円またはボールをマウスから遠ざける 2D アプレットを作成しようとしています。このプログラムの物理演算を機能させるには、オブジェクトをボールのように動作させ、マウスを移動可能な丘のように動作させるようにします。マウスがボールに近づくと、マウスはボールをより速く遠くに反発し、マウスがボールから遠ざかるとボールの速度が低下し、最終的には動きを止めます。マウスとオブジェクトの間の合計距離と、x と y の距離の両方を考慮する必要があるため、オブジェクトの動きがスムーズでよりリアルになります。私が抱えている最大の問題は、2 点間の距離が大きくなっても、ボールが離れていく速度が比較的一定のままであることです。現在、速度は x または y の距離に定数を掛けたものです。総距離で割ります。これは、マウスがオブジェクトに近づくと多かれ少なかれ機能し、必要に応じてレートが増加しますが、マウスが離れると失敗します。速度を減少させ、マウスが遠ざかると最終的に 0 になるようにしたいのですが、現在の設定では、x 距離も距離が増加するにつれて増加し、速度が減少したとしても、私が望むほどには減少しません。 . 私が今持っている方法は、おそらくすべて一緒に削る必要があります。助けてくれてありがとう. レートは、私が望むほど減少することはありません。私が今持っている方法は、おそらくすべて一緒に削る必要があります。助けてくれてありがとう. レートは、私が望むほど減少することはありません。私が今持っている方法は、おそらくすべて一緒に削る必要があります。助けてくれてありがとう.

    public void mouseMoved (MouseEvent e) 
{
    //distance between x coord
    xd=e.getX()-x;
    //distance between y coord
    yd=y-e.getY();
    //total distance between mouse and ball
    d=Math.sqrt((Math.pow(xd,2))+(Math.pow(yd,2)));

    //rate of x change
    xrate=(Math.sqrt(Math.pow(xd,2))*4)/(d);
    //rate of y change
    yrate=(Math.sqrt(Math.pow(yd,2))*4)/(d);

    //determines movement of ball based on position of the mouse relative to the ball
    if(xd>0)
    {
        x=x-((int)(xrate));
    }
    if(xd<0)
    {
        x=x+((int)(xrate));
    }
    if(yd>0)
    {
        y=y+((int)(yrate));
    }
    if(yd<0)
    {
        y=y-((int)(yrate));
    }

    //updates x and y coords of ball
    repaint();
}
4

2 に答える 2

0

これを試して-

//rate of x change
xrate=(1.0/(d))*20; //20 is just a random constant I guessed
//rate of y change
yrate=(1.0/(d))*20;
于 2012-06-11T03:45:55.223 に答える
0

あなたは間違った計算をしただけです。

 //total distance between mouse and ball
 d=Math.sqrt((Math.pow(xd,2))+(Math.pow(yd,2)));
 //rate of x change
 xrate=(Math.sqrt(Math.pow(xd,2))*4)/(d);   

これについて考えます :

x コードのみを移動すると、yd が 0 になり、d=|xd| になります。

xrate = |xd|*4/(d) = d*4/d = 4.

xd と yd に関連付けられた xrate と yrate を作成するだけで、タスクを達成する簡単な方法があります。

これを試すことができます:

if(xd==0){
  xd = 0.1;//minimum distance
}
if(yd==0){
  yd = 0.1;
}

xrate = (1/xd)*10; // you can change number 100 for proper speed
yrate = (1/yd)*10;
x = x - xrate;
y = y - yrate;

これが役立つことを願っています。

于 2012-06-11T07:10:29.960 に答える