簡體   English   中英

沿方向和速率移動鼠標

[英]Moving mouse in direction and rate

我正在嘗試創建一個由操縱桿的右指尖控制的簡單鼠標模擬器。 我試圖讓鼠標沿指示桿的方向移動,並以平滑的壓力值梯度指示速度,但嘗試這樣做時卻遇到了許多障礙。

第一個是如何將角度准確轉換為准確的X和Y值。 我找不到正確實現角度的方法。 以我的方式,對角線的移動速度可能比紅衣主教快得多。 我當時想為X值添加Math.Cos(angle),為Y值添加Math.Sin(angle)來增加鼠標的大小,但是我想不出一種方法來設置它。

第二,是鼠標的平穩移動,這可能是兩者中更重要的。 由於SetPosition()函數僅適用於整數,因此像素隨時間移動的速率似乎非常有限。 我擁有的代碼非常基礎,僅注冊1-10的整數值。 這不僅會在加速度上產生小的“跳躍”,而且還會限制對角線的移動。 目標是使每秒10像素左右,程序以100hz運行,每個周期輸出0.1像素移動。

我以為我可以跟蹤X和Y值的像素“小數”,並在將它們構建為整數時將其添加到軸上,但是我想有一種更有效的方法仍然不會激怒SetPosition()函數。

我覺得Vector2對象應該完成此操作,但是我不知道該角度如何適合。

樣例代碼:

        //Poll Gamepad and Mouse.  Update all variables.
    public void updateData(){

        padOne = GamePad.GetState(PlayerIndex.One, GamePadDeadZone.None);
        mouse = Mouse.GetState();

        currentStickRX = padOne.ThumbSticks.Right.X;
        currentStickRY = padOne.ThumbSticks.Right.Y;
        currentMouseX = mouse.X;
        currentMouseY = mouse.Y;
        angle = Math.Atan2(currentStickRY, currentStickRX);

        vectorX = (int)( currentStickRX*10 );
        vectorY = (int)( -currentStickRY*10 );
        mouseMoveVector.X = vectorX;
        mouseMoveVector.Y = vectorY;


        magnitude = Math.Sqrt(  Math.Pow( (currentStickRX - 0), 2 ) + Math.Pow( (currentStickRY - 0), 2 )  );
        if (magnitude > 1){
            magnitude = 1;
        }

        //Get values not in deadzone range and re-scale them from 0-1
        if(magnitude >= deadZone){
            activeRange = (magnitude - deadZone)/(1 - deadZone);
        }

        Console.WriteLine();  //Test Code
    }

    //Move mouse in in direction at specific rate.
    public void moveMouse(){
        if (magnitude > deadZone){
            Mouse.SetPosition( (currentMouseX + vectorX), (currentMouseY + vectorY));
        }


        previousStickRX = currentStickRX;
        previousStickRY = currentStickRY;
        previousActiveRange = activeRange;
    }

注意:我正在使用所有xna框架。

無論如何,如果我沒有正確解釋這些內容,我們深表歉意。 我還沒有找到一個好的資源,我搜索的矢量示例僅以整數增量從A點移動到B點。

任何部分的任何幫助,我們將不勝感激。

我自己還沒有嘗試過,但是從我的角度來看,您應該在讀取后將墊軸歸一化,這樣對角線的移動速度將與基數軸相同。 對於第二部分,我將在浮動變量(例如Vector2)中跟蹤鼠標,並在設置鼠標位置時進行強制轉換(可能會更好地舍入)。

public void Start()
{
   mousePosV2 = Mouse.GetState().Position.ToVector2();
}

public void Update(float dt)
{
   Vector2 stickMovement = padOne.ThumbSticks.Right;
   stickMovement.Normalize();
   mousePosV2 += stickMovement*dt*desiredMouseSpeed; 

   /// clamp here values of mousePosV2 according to Screen Size
   /// ...

   Point roundedPos = new Point(Math.Round(mousePosV2.X), Math.Round(mousePosV2.Y));
   Mouse.SetPosition(roundedPos.X, roundedPos.Y);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM