【发布时间】:2015-12-08 21:51:11
【问题描述】:
我正在制作电子游戏,特别是现在我想制作伪动画门。
我的意思是,当我的游戏中的门被使用时,它的图像应该从“关闭”变为“打开”,然后游戏必须等待大约半秒,然后才应该加载另一个区域。 问题是,该计时器实际上并没有等待所需的时间,或者至少并不总是这样做。有时它会像预期的那样持续 500 毫秒,有时会持续更短的时间。
我正在使用以下代码:
当使用门时
imgLockerRoomOpenDoor.Visibility = Visibility.Visible;
tmrDoorOpening.Tick += new EventHandler(tmrLockerRoomDoorOpening);
tmrDoorOpening.Interval = new TimeSpan(0, 0, 0, 0, 500);
tmrDoorOpening.Start();
“tmrLockerRoomDoorOpening”代码:
tmrDoorOpening.Stop();
AreaTransition();
areaHibernation1.Visibility = Visibility.Visible;
areaHibernation1.IsEnabled = true;
areaHibernation1.Margin = new Thickness(55, 31, 0, 0);
ActionsReset();
定时器声明:
public static System.Windows.Threading.DispatcherTimer tmrDoorOpening = new System.Windows.Threading.DispatcherTimer();
AreaTransition 用于隐藏所有游戏区域,所以不要认为它相关。
为什么定时器的工作时间不同?我怎样才能将其设置为相同?
我举个例子。 有两个房间。
1) 我在 1 号房间。
2) 我点击门。
3) 门图像变为打开,程序等待 1/2 分钟,然后房间 1 消失,我出现在房间 2。
4) 我回到房间 1。门已关闭图像。
5) 我再次点击门,但现在打开的门出现的时间较短。
【问题讨论】:
-
你试过不同的定时器吗?就个人而言,我会尝试
System.Timers.Timer并利用“一次性”功能。此计时器只能触发一次,因此您不必担心真正停止/重新启动。它也是一个线程计时器。 -
你说这个计时器是一次性的。如果我想重复该操作,我可以重置它吗?我不希望它自动重复,但我确实希望在需要时重复它。
-
启动“正常”计时器,当事件触发时,您显式地停止它,然后在需要时重新启动它。
System.Timers.Timer有一个AutoReset属性。如果将其设置为false,则计时器将在事件触发时自动停止,您不必明确停止。当然你可以随时重新开始! -
你应该小心你调用
tmrDoorOpening.Tick += new EventHandler(tmrLockerRoomDoorOpening);的地方确保你每次点击门时不要添加一个新的处理程序。记住你做了计时器static。在这种情况下,我个人不会在表格上做的事情。你在重用窗口/页面吗? -
@Dbuggy 你说得对——我什至没有看到计时器被声明为
static。每当一扇门被击中时,我都会创建一个新的计时器实例,并将“门实例”传递给计时器,以便计时器知道要处理哪扇门。