Diliup Gabadamudalige Ответов: 1

Ошибка при вращении снаряда и выстреле


Код написан на языке C#, а IDE-визуальная среда Studio2017.my код и активы находятся по адресу diliupg / Space_Battles — Bitbucket[^].

Мой код вращения космического корабля имеет что-то неправильное, потому что, когда я стреляю, снаряд стреляет из середины космического корабля. Других ошибок нет. Как я могу заставить космический корабль стрелять спереди?

Что я уже пробовал:

Я создаю лазерный выстрел, когда нажимаю пробел вот так:
<pre>

if (keyboard.IsKeyDown(Keys.Space) && shoot)
{
    shoot = false;
    //is.fireInst.Play();
    this.fire.Play(.2f, .9f, 0);
    lazerX = (float)(spritePosX - (0) * Math.Cos(rotationAngle));
    lazerY = (float)(spritePosY - (0) * Math.Sin(rotationAngle));
 
    Projectile projectile = new Projectile(heroLazer, "heroLazer",
        lazerX, lazerY, rotationAngle);
 
    Game1.AddProjectile(projectile);
}
// then in the projectile class:

public Projectile(Texture2D lazerSprite, string spriteName,
    float posx, float posy, float heading)
{
    projectileSprite = lazerSprite;
    type = spriteName;
    spriteRotOrigin = new Vector2(projectileSprite.Width / 2, projectileSprite.Height / 2);
    spriteHeading = heading;
    spritePosX = posx; // the x position of the lazer
    spritePosY = posy; // the y position of the lazer
 
    spritePos = new Vector2(spritePosX, spritePosY);
    drawRectangle = new Rectangle((int)spritePosX, (int)spritePosY,
        projectileSprite.Width / 2, projectileSprite.Height / 2);
 
}
// then in the update method

<pre>public void update(GameTime gameTime, KeyboardState keyboard)
{
    //projectile active or not?
    if (active == true)
    {
        projectileAge += gameTime.ElapsedGameTime.Milliseconds;
 
        spritePosX += (float)(Math.Sin(spriteHeading) *
            gameTime.ElapsedGameTime.TotalMilliseconds) * ProjectileMoveAmount;
        spritePosY -= (float)(Math.Cos(spriteHeading) *
            gameTime.ElapsedGameTime.TotalMilliseconds) * ProjectileMoveAmount;
 
        spritePos = new Vector2(spritePosX, spritePosY);
    }
    if (projectileAge > projectileLife)
    {
        active = false;
    }
}
// then in the draw method like this
<pre lang="c#">public void Draw(SpriteBatch spriteBatch)
 {
     //spriteBatch.Draw(projectileSprite, drawRectangle, Color.White);
 
     spriteBatch.Draw(projectileSprite, spritePos, null,
         Color.FromNonPremultiplied(255, 255, 255, 255), spriteHeading,
         spriteRotOrigin, 1.0f, SpriteEffects.None, 0f);
 
 }

1 Ответов

Рейтинг:
2

Diliup Gabadamudalige

Я решил эту проблему с помощью следующего кода

if (keyboard.IsKeyDown(Keys.Space) && shoot)
 {
     shoot = false;

     this.fire.Play(.2f, .9f, 0);

     // the code below will position a projectile at the top
     // of any rotating sprite facing the sprite direction

     lazerX = spritePosX + HeroSprite.Width / 2 * (float)Math.Sin(rotationAngle);
     lazerY = spritePosY - HeroSprite.Height / 2 * (float)Math.Cos(rotationAngle);

     Projectile projectile = new Projectile(heroLazer, "heroLazer",
         lazerX, lazerY, rotationAngle);

     Game1.AddProjectile(projectile);
 }


а потом с этим кодом

public void update(GameTime gameTime, KeyboardState keyboard)
 {
     //projectile active or not?
     if (active == true)
     {
         projectileAge += gameTime.ElapsedGameTime.Milliseconds;

         ProjectilePosX += (float)(Math.Sin(spriteHeading) *
             gameTime.ElapsedGameTime.TotalMilliseconds) * ProjectileMoveAmount;
         ProjectilePosY -= (float)(Math.Cos(spriteHeading) *
             gameTime.ElapsedGameTime.TotalMilliseconds) * ProjectileMoveAmount;

         spritePos = new Vector2(ProjectilePosX, ProjectilePosY);
     }
     if (projectileAge > projectileLife)
     {
         active = false;
     }
 }