簡體   English   中英

模擬2D彈丸旋轉的最佳方法?

[英]Best method to simulate rotation of a projectile in 2D?

因此,我正在為正在參加的課程開發2D城堡防御風格的游戲,並且在嘗試獲得玩家射擊時拋射弧線正確旋轉時遇到的困難。 我敢肯定你們中的許多人以前都玩過類似的游戲,但是例如,在這里,正是我想要實現的目標的鏈接。

http://www.lostvectors.com/prelude/

我目前有一個箭課程:

public class Arrow
    {
        public Texture2D arrowSprite;
        public double Xvelocity;
        public double Yvelocity;
        public int currentXpos;
        public int currentYpos;
        public int oldXpos;
        public int oldYpos;
        public float currentAngle;
        public float oldAngle;

        public Arrow() 
        {
            arrowSprite = WindowsGame1.Game1.arrow;
            Xvelocity = 10;
            Yvelocity = 10;
            currentXpos = 850;
            currentYpos = 200;
        }
    }

注意:在使動畫正常工作之前,我設置的初始值就位。 解決此問題后,將根據用戶輸入設置值。

我的更新方法中包含以下代碼來更新箭頭:

foreach (Player.Arrow arrow in onscreenArrows)
            {
                arrow.oldXpos = arrow.currentXpos;
                arrow.oldYpos = arrow.currentYpos;
                arrow.currentXpos -= Convert.ToInt32(arrow.Xvelocity);
                arrow.currentYpos -= Convert.ToInt32(arrow.Yvelocity);
                arrow.oldAngle = arrow.currentAngle;
                arrow.currentAngle = Convert.ToSingle(Math.Atan(arrow.Yvelocity/arrow.Xvelocity) * 180 / Math.PI);
                arrow.Yvelocity -= 1;
            }

這是我的draw方法中的代碼段:

foreach (Player.Arrow arrow in onscreenArrows)
        {
            spriteBatch.Draw(arrow.arrowSprite, new Vector2(arrow.currentXpos, arrow.currentYpos), null, Color.White, arrow.currentAngle - arrow.oldAngle, new Vector2(0, 4), 1.0f, SpriteEffects.None, 0);
        }

為了清楚起見,箭頭從屏幕的右側發射,向左移動。 非常抱歉我的代碼很亂。 我對游戲編程還是很陌生,我一直在嘗試使動畫正常工作,然后再執行其他操作。 任何建議將是非常有益的,非常感謝,謝謝!

您的代碼實際上看起來不錯。 我看到的唯一錯誤是,您正在將spriteBatch.Draw函數傳遞為:

arrow.currentAngle - arrow.oldAngle

提供給SpriteBatch.Draw的旋轉是絕對旋轉( MSDN ),因此您只需將其傳遞給arrow.currentAngle

需要明確的是,當前沒有傳遞最后一幀的內存時,當前傳遞的是與最后一幀的角度變化(δ或相對角度)。 您應該給它繪制角度。

更新錯過了數學上的一些問題。

  1. Math.Atan返回一個弧度,而spriteBatch.Draw則期望一個弧度,因此您無需在度和弧度之間進行轉換(實際上,這可能就是為什么您看到它瘋狂地跳躍)。

  2. 如果您正確旅行,您的數學將獲得正確的角度。 要使其向左移動,請采取180度並減去計算出的角度。

經過這些改進,您的代碼將變為:

arrow.currentAngle = Math.Pi - Math.Atan(arrow.Yvelocity/arrow.Xvelocity);

讓我知道事情的后續!

暫無
暫無

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

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