如何创建一个计数10秒的计时器?

时间:2016-03-10 15:45:29

标签: c# xna-4.0

我的目标是当我的强力球与玩家的船发生碰撞时,它会提升背景的滚动速度和敌人的速度,持续10秒。我已经提出了一些代码来做到这一点但是当我运行游戏并击中强力球时,背景和敌舰仅加速2-3秒而不是10秒。

idk我做错了所以有人可以帮帮我吗? 这就是我到目前为止所做的:

// Do the collision bewtween the player and the powerball
for (int i = 0; i < powerballs.Count; i++)
{
    rectangle3 = new Rectangle((int)powerballs[i].Position.X,
        (int)powerballs[i].Position.Y,
        powerballs[i].Width,
        powerballs[i].Height);

    // Determine if the two objects collided with each other
    if (rectangle1.Intersects(rectangle3))
    {
        boost = true;
        powerballs[i].Active = false;
    }
    else
        boost = false;

    float elasped = (float)gameTime.ElapsedGameTime.TotalSeconds;
    timer -= elasped;
    if (boost == true && timer < 10f)
    {                   
            for (int j = 0; j < enemies.Count; j++)
            {
                // Increased enemy speed variable
                float newEnemySpeed = 30f;

                // Setting increased speed to each enemy in the list 
                enemies[j].SetNewMoveSpeed(newEnemySpeed);
            }
            //Increased Background speed variables
            int newBackgroundSpeed1 = -5;
            int newBackgroundSpeed2 = -10;

            // Setting increased Background speed
            bgLayer1.SetNewSpeed(newBackgroundSpeed1);
            bgLayer2.SetNewSpeed(newBackgroundSpeed2);;
    }
    else
    {
        for (int k = 0; k < enemies.Count; k++)
        {
            // Set emeny speed back to normal
            enemies[k].SetNewMoveSpeed(6f);
        }
        // Set background speed back to normal
        bgLayer1.SetNewSpeed(-1);
        bgLayer2.SetNewSpeed(-2);
    }
}

3 个答案:

答案 0 :(得分:2)

想到这样的事情(还有其他几种方法可以做到这一点)。一旦强力球碰撞,你就会提高速度。您将实现一个ITimerDispatchableEvent,它可以将速度恢复正常。

class Timer {
    private double _time;
    private readonly IList<ITimerDispatchableEvent> _events;

    public Timer(double currentTime) {
      _time = currentTime
    }

    // Update this on each call back during the main loop
    public void Update(double deltaTime) {
        _time += deltaTime;
        Dispatch();
    }

    private void Dispatch() {
        // Iterate events
        // if event.FireTime <= _time
        //   event.Fire();
    }

    public void AddEvent(ITimerDispatchableEvent event) {
        _events.add(event);
    }
}

public interface ITimerDispatchableEvent {
    // the absolute time to fire. E.g. if we want to fire in 10seconds
    // this will be Timer._time += 10 (assuming deltaTime is in seconds)
    double FireTime { get; }
    void Fire();
}

答案 1 :(得分:0)

float elasped = (float)gameTime.ElapsedGameTime.TotalSeconds; timer -= elasped;

为什么不尝试TimeSpan对象?

/**Class Attributes**/
TimeSpan t;
/**End**/
for (int i = 0; i < powerballs.Count; i++)
{
    rectangle3 = new Rectangle((int)powerballs[i].Position.X,
        (int)powerballs[i].Position.Y,
        powerballs[i].Width,
        powerballs[i].Height);

    // Determine if the two objects collided with each other
    if (rectangle1.Intersects(rectangle3))
    {
        boost = true;
        powerballs[i].Active = false;

        //reset timer if collide, and intanciate them the first time\\
        t = new TimeSpan();
    }
    else
    {
        boost = false;
    }
    if (boost == true && t.Milliseconds <= 10000)
    {                   
            for (int j = 0; j < enemies.Count; j++)
            {
                // Increased enemy speed variable
                float newEnemySpeed = 30f;

                // Setting increased speed to each enemy in the list 
                enemies[j].SetNewMoveSpeed(newEnemySpeed);
            }
            //Increased Background speed variables
            int newBackgroundSpeed1 = -5;
            int newBackgroundSpeed2 = -10;

            // Setting increased Background speed
            bgLayer1.SetNewSpeed(newBackgroundSpeed1);
            bgLayer2.SetNewSpeed(newBackgroundSpeed2);;

            //increment Timer with the gameTime\\
            t+=gameTime.ElapsedGameTime;
    }
    else
    {
        for (int k = 0; k < enemies.Count; k++)
        {
            // Set emeny speed back to normal
            enemies[k].SetNewMoveSpeed(6f);
        }
        // Set background speed back to normal
        bgLayer1.SetNewSpeed(-1);
        bgLayer2.SetNewSpeed(-2);
    }
}   

有关TimeSpan对象的更多信息,请the official documentation

答案 2 :(得分:-2)

以下是创建10秒计时器的代码:

long startTicks = System.Environment.TickCount;
            long tenSeconds = 10000;
            while (ticksElapsed > tenSeconds)
            {
                long ticksElapsed = System.Environment.TickCount - startTicks;

            }

这将运行10秒钟,如果需要,你可以在while循环中执行某些操作。