我有一个迷宫游戏,我试图一次创建两个计时器。 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);
}
2nd(显示每1秒剩余的时间(如真实计时器))
t2.Interval = 1000;
t2.Enabled = true;
t2.Elapsed += new ElapsedEventHandler(showTimer);
public static void showTimer(object source, ElapsedEventArgs e)
{
Console.Write(timeLeft);
}
我想在全局范围内传递声明timeLeft,但它说“非静态字段,方法或属性需要一个对象引用......”
我如何正确宣布?
答案 0 :(得分:7)
通过制作静态属性:
public static Double TimeLeft { get; set; }
如果您希望Publicliy可以从您的整个上下文访问,如果您想将其设为私有,只需将public
更改为private
。
只是旁注,内置Timer
不支持轮询剩下的时间,直到下一次过去。您可以在1秒定时器的每个TimeLeft
- 事件中减少Elapse
,也可以查看this。
修改强>
这是使用一个计时器的一种方法,首先我声明了两个属性和一个我使用的常量字段,不要打扰它们是静态的,这样就更容易以控制台应用程序的形式运行它。 / p>
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
- 事件处理程序可能如下所示:
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);
}
}
}
这就是我跑步时的样子:
答案 1 :(得分:2)
首先,如果你希望它的行为像全局变量,你应该将你的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
这样的时间会更准确。
答案 2 :(得分:0)
将其标记为静态:
public static int TimeLeft;
答案 3 :(得分:0)
您的timeLeft
会员不是静态。
使其静态或使showTimer
方法非静态。
问候。