Поворотный спрайт XNA 2D, с реальным поворотным положением (Lunar Lander Exhaust Placement) - PullRequest
1 голос
/ 11 января 2012

Я делаю небольшой клон Lunar Lander, и он работает вполне нормально, теперь я добавил эффекты частиц к посадочному аппарату, поэтому, когда тяга увеличивается, создается эффект частиц, прямо в середине моего корабля.

То, что я хотел бы получить, это то, что созданы Частицы, где выхлоп корабля находится на спрайте. И это поставило меня в тупик. Я знаю, что должен иметь возможность рассчитать его, так как у меня есть угол поворота и текущее местоположение, поэтому я должен иметь возможность получить повернутое местоположение любого пикселя в моем спрайте 64x64.

Мне интересно вычислить значения Lander.exhaust.X и Lander.exhaust.Y. Кто-нибудь может направить меня в правильном направлении.

// это часть кода, я уверен, что он мне не нужен:)

Lander.acceleration.X = Lander.acceleration.X * (0.01f * gameTime.ElapsedGameTime.Seconds); Lander.acceleration.Y = Lander.acceleration.Y * (0.01f * gameTime.ElapsedGameTime.Seconds);

        Lander.velocity.Y = Lander.velocity.Y + (0.05f + Lander.velocity.Y * gameTime.ElapsedGameTime.Seconds);
        Lander.oldvelocity.X = Lander.velocity.X;
        Lander.oldvelocity.Y = Lander.velocity.Y;

        Lander.exhaust.X = (float)Math.Cos(Lander.RotationAngle) * 0.1f + Lander.Position.Y ;
        Lander.exhaust.Y = (float)Math.Sin(Lander.RotationAngle)  * 0.1f  + Lander.Position.X ;


        Lander.Position.Y = Lander.velocity.Y + Lander.Position.Y;
        Lander.Position.X = Lander.velocity.X + Lander.Position.X;



        //if (Lander.Position.Y >= groundlevel + (Lander.mSpriteTexture.Height / 2))
        if (Lander.Position.Y >= groundlevel)
        {
            Lander.Position.Y = groundlevel;
            Lander.velocity.X = 0f;
            Lander.oldvelocity.X = 0f;

        }

        float circle = MathHelper.Pi * 2;
        RotationAngle = RotationAngle % circle;
        Lander.RotationAngle = RotationAngle;
        RotationAngledegrees = MathHelper.ToDegrees(RotationAngle);
        if (keyState.IsKeyDown(Keys.Space))
        {
            Lander.acceleration.X = (float)Math.Cos(Lander.RotationAngle) * 0.1f + Lander.acceleration.X;
            Lander.acceleration.Y = (float)Math.Sin(Lander.RotationAngle) * 0.1f + Lander.acceleration.Y;
            Lander.velocity.X = Lander.oldvelocity.X  + Lander.acceleration.X;
            Lander.velocity.Y = Lander.oldvelocity.Y + Lander.acceleration.Y;
            particleEngine.EmitterLocation = new Vector2(Lander.exhaust.X, Lander.exhaust.Y);

-lasse

1 Ответ

1 голос
/ 12 января 2012
Lander.exhaust.X = (float)Math.Cos(RotationAngle) * 32 + Lander.Position.X;
Lander.exhaust.Y = (float)Math.Sin(RotationAngle) * 32 + Lander.Position.Y;

Возможно, вам придется вычесть или добавить PI/2 к углу, в зависимости от начального угла спрайта, излучатель будет на расстоянии 32 пикселя от положения Lander.

На сторонеобратите внимание, что, вероятно, было бы хорошей идеей поместить каждую часть игры в свой собственный класс, это впоследствии значительно облегчит изменение материала.

И еще одна вещь, когда вы добавите скорость к позиции,Вы можете сделать это:

Lander.Position += Lander.velocity;

Это в основном то же самое.

...