簡體   English   中英

如何創建一個計時器來計數10秒?

[英]How can i create a timer to count 10 seconds?

我的目標是當我的強力球與玩家的飛船相撞時,它會提高背景的滾動速度,並使敵方飛船的速度提高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);
    }
}

我想到這樣的事情(有其他幾種方法可以做到這一點)。 一旦強力球碰撞,您就可以提高速度。 您將實現一個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();
}

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對象的官方文檔

這是創建10秒計時器的代碼:

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

            }

這將運行10秒鍾,您也可以在需要的時候在while循環中執行一些操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM