Проблема стрельбы снарядами XNA / C # - нужен один снаряд за один раз, чтобы стрелять по пробелу - PullRequest
1 голос
/ 27 февраля 2012

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

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

Добавить код снаряда ниже

введите код здесь

//add projectile if spacebar is pressed

private void AddProjectile(Vector2 position)
{
    //i need somthing like this to make bullets autofire on phone
    //while (TouchPanel.IsGestureAvailable)
    //{
    //    Projectile projectile = new Projectile();
    //    projectile.Initialize(GraphicsDevice.Viewport, projectileTexture, position);
    //    projectiles.Add(projectile);
    //}

   if (currentKeyboardState.IsKeyDown(Keys.Space) ||
     currentGamePadState.Buttons.A == ButtonState.Pressed)
   {
       Projectile projectile = new Projectile();
       projectile.Initialize(GraphicsDevice.Viewport, projectileTexture, position);
       projectiles.Add(projectile);
   }
}

Обновить код снаряда ниже

private void UpdateProjectiles()
{
    //update projectiles
    for (int i = projectiles.Count - 1; i >= 0; i--)
    {

        if (currentKeyboardState.IsKeyDown(Keys.Space) ||
            currentGamePadState.Buttons.A == ButtonState.Pressed)
        {

           //adds particle to first projectile but not again until the next fire butotn press
            //particleEngine.EmitterLocation = new Vector2(projectiles[i].Position.X, projectiles[i].Position.Y);
            projectiles[i].Update();
            projectileOn = true;


        }
        //if projectiles not being fired remove them from the game screen 
        else
        {
            projectiles.RemoveAt(i);
        }



    }

}

Метод Draw, который рисует снаряды на экране

//draw the projectiles
            //***********************************************************
             //using the if here allows control of projectiles to pass...
             //...to the "currentstate of the spacebar (is pressed = fire)
             /***/

            if (currentKeyboardState.IsKeyDown(Keys.Space) ||
                currentGamePadState.Buttons.A == ButtonState.Pressed)
            {
                for (int i = 0; i < projectiles.Count; i++)
                {
                    projectiles[i].Draw(spriteBatch);

                }
            }

            //remove projectiles and reset
            if (currentKeyboardState.IsKeyUp(Keys.Space) ||
                currentGamePadState.Buttons.A == ButtonState.Released)
            {


                UpdateProjectiles();
            }

Итак, это то, что я имею до сих пор, и, как указано, я могу заставить снаряд работать нормально, я просто не могу заставить их продолжать свою жизнь (до столкновения или до достижения конца экрана), как только я отпущу пробел клавиатуры.

1 Ответ

1 голос
/ 27 февраля 2012

Краткий обзор проблем, которые я вижу, которые вызывают ваши проблемы:

  • Вы проверяете, нажимаются ли клавиши / кнопки во время ваших методов добавления, обновления и рисования.
  • Если клавиша не нажата, вы удаляете элемент во время обновления, а не рисуете его во время рисования.

Чтобы выполнить то, что, я думаю, вы пытаетесь выполнить, яСделайте что-нибудь в этом духе (разумеется, с учетом ваших потребностей):

private void Update(GameTime gameTime)
{
   // Only add a new projectile if Space or A is pressed
   if (currentKeyboardState.IsKeyDown(Keys.Space) ||
      currentGamePadState.Buttons.A == ButtonState.Pressed)
   {
      AddProjectile(); // some method that adds a new projectile to 'projectiles'
   }

   // Update all existing projectiles, regardless of button press.
   // This will allow your projectiles to continue flying after they have been fired.
   for (int i = 0; i < projectiles.Count; i++)
   {
      projectiles[i].Update();
      if (projectiles[i].Dead) // check if projectiles[i] is out of bounds or has collided with something
      {
         projectiles.RemoveAt(i);
         i--;
      }
   }
}

private void Draw(GameTime gameTime)
{
   // Draw all existing projectiles, regardless of button press.
   for (int i = 0; i < projectiles.Count; i++)
   {
      projectiles[i].Draw(spriteBatch);
   }
}

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

Имеет смысл?

...