XNA / c # Я не могу заставить свои снаряды стрелять по одному и закончить их соответствующую продолжительность жизни, если отпущу пробел - PullRequest
0 голосов
/ 26 февраля 2012

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

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

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

enter code here


 //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 Ответ

3 голосов
/ 10 ноября 2012

РЕДАКТИРОВАТЬ: Просто понял, что это спросили несколько месяцев назад. OOPS. Хотя я оставлю свой ответ, если кто-нибудь найдет его полезным.

Хорошо, насколько я могу судить, ваша проблема заключается в вашем UpdateProjectiles() коде. В частности, по адресу:

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

Это означает, что когда вы не нажмете пробел, вы удалите все снаряды из списка. Кроме того, в вашем коде розыгрыша вы звоните UpdateProjectiles(), особенно когда отпускается пробел, который очистит ваш список снарядов.

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

//adds projectiles - only if the spacebar was pressed this update, 
//ensuring that only ONE projectile is added per press:

if (currentKeyboardState.IsKeyDown(Keys.Space) && previousKeyboardState.IsKeyUp(Keys.Space))
{
    projectiles.Add(new Projectile());
}

//updates the projectiles:

for(int i = 0; i < projectiles.Count; ++i)
{
    projectiles[i].Update();
}

//checks if projectiles have collided or are out of bounds:

foreach(projectile p in projectiles)
{
    if (PROJECTILE IS OUT OF BOUNDS || HAVE COLLIDED WITH STUFF)
    {
        DO WHAT NEEDS TO BE DONE;
        projectiles.Remove(p);
        break;
    }
}

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

//draws the projectiles regardless of whether the spacebar is pressed
foreach (projectile p in projectiles)
{
    p.Draw(spriteBatch);
}

Это означает, что вы будете рисовать все снаряды в списке (или ни одного, если он пуст), независимо от того, нажата пробел или нет. Я также рекомендовал бы перемещать UpdateProjectiles(), чтобы быть только в вашем вызове Update(), так как это освобождает ваши методы рисования, чтобы просто заниматься рисованием.

Я не утверждаю, что это самый эффективный способ сделать это, но он выполнит свою работу. Однако следует отметить, что вы сможете удалить только 1 снаряд за вызов UpdateProjectiles(), но это не должно быть проблемой (по крайней мере, по моему опыту), поскольку вы обновляете много раз во-вторых, и редко будут удаляться два снаряда в одном обновлении.

Надеюсь, это поможет:)

...