Как добавить круговой таймер в XNA? - PullRequest
0 голосов
/ 16 января 2012

У меня есть 2D гоночная игра, которую я разрабатываю.Вот скриншот игры в XNA; http://oi41.tinypic.com/vxhy5y.jpg.Я хочу знать, как создать круговой таймер.Так, например, «если car1blue / car2red сталкивается с таймером запуска флажка, и если они сталкиваются во второй раз, остановите таймер».Будет ли это работать в теории?Если это работает в теории, как мне сделать это в XNA?

Если хотите, я мог бы предоставить код, который я сделал до сих пор.

Большое спасибо!

РЕДАКТИРОВАТЬ;Возможно ли, если бы вы могли показать мне, какой код идет куда?

Ответы [ 2 ]

0 голосов
/ 16 января 2012

В соответствии с запросом здесь приведена реализация, которая потребуется в вашем примере пустого проекта XNA, опять же, я ТОЛЬКО отвечаю на вопрос, который вы задали выше относительно времени круга:

/* 
    NEW MEMBERS FOR YOU TO IMAGINE YOU HAVE SOME MEANINGFUL RACING GAME 
*/
private Vector2 yourPosition;
private Texture2D yourCar;
private Texture2D yourTrack;
private Rectangle yourStartingLine;

private DateTime currentLapTimestamp = DateTime.Now();
private TimeSpan currentLapTime = new TimeSpan();

public Game1()
{
    graphics = new GraphicsDeviceManager(this);
    Content.RootDirectory = "Content";
}

protected override void Initialize()
{
    // Put your starting line somewhere
    yourStartingLine = new Rectangle(100,100,10,100)

    base.Initialize();  
}

protected override void LoadContent()
{
    yourCar = Content.Load<Texture2D>("YourCarAssetName")
    yourTrack = Content.Load<Texture2D>("YourTrackAssetName")
}

protected override void UnloadContent()
{
    // TODO: Unload any non ContentManager content here
}

protected override void Update(GameTime gameTime)
{
    // Check your keyboard input
    UpdatePosition(Keyboard.GetState());
    if(HasPassedStartingLine())
    { UpdateLapTime(); }
    base.Update(gameTime);
}

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);
    DrawTrack();
    DrawCar();
    DrawLapTime();
    base.Draw(gameTime);
}

/* 
    NEW METHODS FOR YOU TO PRETEND DO STUFF
*/  

private void UpdateLapTime()
{
    var newTimestamp = DateTime.Now;
    currentLapTime = newTimestamp - currentLapTimestamp;
}

private bool HasPassedStartingLine()
{
    // Work out if you have passed the starting line
    // and make sure you dont register it again until
    // they have passed the finish line
}

private void UpdatePosition(KeyboardState keyboardState)
{
    // Assumes you work out how to handle your players
    // controls to move the position of the car
}

private void DrawTrack()
{
    // Your rendering logic for the track
}

private void DrawCar()
{
    // Your rendering logic for the car
}

private void DrawLapTime()
{
    // your rendering logic for the lap time
}
0 голосов
/ 16 января 2012

Не зная, как вы все это соединили, не можете ли вы просто сохранить DateTime где-то того времени, когда они прошли линию, поэтому при запуске вы делаете:

public MyGame
{
    DateTime lastLapTimestamp = DateTime.Now;
    TimeSpan lastLapTime = new TimeSpan();
    // other stuff

    public void Update(TimeSpan elapsedTime)
    {
        if(HasCompletedLap)
        {
            var currentLapTimestamp = DateTime.Now;
            lastLapTime = currentLapTimestamp - lastLapTimestamp;
            lastLapTimestamp = currentLaptimeStamp;
        }
        // Other stuff
    }
}

Затем просто отображаете свой lastLapTimeгде бы вы ни хотели увидеть, сколько времени понадобилось, чтобы обойти.

...