Попытка получить доступ к переменной глобально - PullRequest
0 голосов
/ 15 июля 2011

У меня есть игра-лабиринт, и я пытаюсь создать два таймера одновременно. 1-й (Выход из игры через 300 секунд)

t1.Interval = 30000;
t1.Enabled = true;
t1.Elapsed += new ElapsedEventHandler(hiddenTimer);

public static void hiddenTimer(object source, ElapsedEventArgs e)
    {
        Console.Clear();
        Environment.Exit(1);
    }

2-й (отображает время, оставшееся каждые 1 секунду (как настоящий таймер))

t2.Interval = 1000;
t2.Enabled = true;
t2.Elapsed += new ElapsedEventHandler(showTimer);

public static void showTimer(object source, ElapsedEventArgs e)
    {
        Console.Write(timeLeft);
    }

Я хотел бы передать объявление timeLeft глобально, но оно говорит, что "Ссылка на объект требуется для нестатического поля, метода или свойства ..."

Как бы я это правильно объявил?

Ответы [ 4 ]

7 голосов
/ 15 июля 2011

Создавая статическое свойство:

public static Double TimeLeft { get; set; }

Это если вы хотите, чтобы Publicliy был доступен из всего вашего контекста, если вы хотите, чтобы он был закрытым, просто измените public на private.

Просто примечание, встроенная Timer не поддерживает опрос в течение оставшегося времени до следующего истечения.Либо вы уменьшаете TimeLeft в каждом Elapse событии на 1-секундном таймере, либо можете посмотреть this .

Edit

Вот один из способов сделать это с одним таймером: сначала я объявляю два свойства и одно постоянное поле, которое я использую, не беспокойтесь о том, что они статические, просто так проще запустить его как консольное приложение.

public static Timer SystemTimer { get; set; }
public static double Elapsed { get; set; }

private const double CycleInterval = 1000;

Тогда в моем Main -методе у меня есть следующее, чтобы инициировать мой Timer

SystemTimer = new Timer();
SystemTimer.Interval = CycleInterval;
SystemTimer.Enabled = true;
SystemTimer.Elapsed += Cycle;

SystemTimer.Start();

Имея это, обработчик Cycle -vent может выглядеть так:

static void Cycle(object sender, ElapsedEventArgs e)
{
    Elapsed += CycleInterval;

    if ((Elapsed%5000) == 0.0)
    {
        Console.WriteLine("5 sec elapsed!");
        // Do stuff each 5 sec
    }

    if ((Elapsed % 10000) == 0.0)
    {
        Console.WriteLine("10 sec elapsed!");
        // Do stuff each 10 sec
    }

    Console.WriteLine("Elapsed: {0}", Elapsed);
}

У вас также может быть Elapsed, являющийся TimeSpan, но вы можете реорганизовать его, как хотите.

Вот мой полный исходный код, который я использовал:

using System;
using System.IO;
using System.Timers;

namespace ConsoleApplication5
{
    class Program
    {
        public static Timer SystemTimer { get; set; }
        public static double Elapsed { get; set; }

        private const double CycleInterval = 1000;

        static void Main(string[] args)
        {
            SystemTimer = new Timer();
            SystemTimer.Interval = CycleInterval;
            SystemTimer.Enabled = true;
            SystemTimer.Elapsed += Cycle;

            SystemTimer.Start();

            while (true) ;

        }

        static void Cycle(object sender, ElapsedEventArgs e)
        {
            Elapsed += CycleInterval;

            if ((Elapsed%5000) == 0.0)
            {
                Console.WriteLine("5 sec elapsed!");
                // Do stuff each 5 sec
            }

            if ((Elapsed % 10000) == 0.0)
            {
                Console.WriteLine("10 sec elapsed!");
                // Do stuff each 10 sec
            }

            Console.WriteLine("Elapsed: {0}", Elapsed);
        }
    }
}

И вот как это выглядит, когда я запускаю его:

enter image description here

2 голосов
/ 15 июля 2011

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

Во-вторых, я бы использовал один таймер и отслеживал время отдельно для каждого события:

static DateTime startTime = DateTime.Now;
static DateTime lastTime = DateTime.Now;

В вашем таймере, который должен быть установлен на что-то, чтобы дать большую точность, как 1/10 секунды, сделайте это:

if (DateTime.Now - lastTime > new TimeSpan(0, 0, 1))
   // Update the time here for your 1s clock
lastTime = DateTime.Now;

if (DateTime.Now - startTime > new TimeSpan(0, 0, 300))
    // Exit the game

Ваше время будет более точным.

0 голосов
/ 15 июля 2011

Ваш timeLeft член не является статичным .

Сделать статическим или сделать showTimer метод не статическим.

Привет.

0 голосов
/ 15 июля 2011

Отметьте это статическим:

public static int TimeLeft;
...