我有一个应用程序,可以通过地图控件上的指定位置移动汽车。我正在使用下面的代码来实现此功能。但是现在我想为此设置一个持续时间。我的意思是,汽车应该在从起点到终点的特定时间到达。我该怎么做。我将持续时间传递给计时器,如代码所示。
class WrappedFunction(object):
def __call__(self, func):
def wrapper(*args, **kwargs):
print(args)
print(kwargs)
# NOTE: `WrappedFunction` instance is available in `self`
return wrapper
class Foo:
@WrappedFunction() # wrap directly, without an intermediary
def mem_fun(self, msg):
pass
foo = Foo()
foo.mem_fun('hi')
# (<__main__.Foo object at 0x000001A2216CDBA8>, 'hi')
# {}
但是现在发生的情况是汽车到达时间比持续时间快,并且在 public class PathAnimation
{
private const int _delay = 30;
private DispatcherTimer _timerId;
private int? _duration;
private int _frameIdx = 0;
private bool _isPaused;
private DateTime _timerStart = DateTime.Now;
public PathAnimation(IntervalCallback intervalCallback,int? duration)
{
_duration = duration;
_timerId = new DispatcherTimer();
_timerId.Interval = new TimeSpan(0, 0, 0, 0, _delay);
_timerId.Tick += (s, a) =>
{
if (!_isPaused)
{
if (intervalCallback != null)
{
intervalCallback(AppGlobals._intervalLocs[_frameIdx], AppGlobals._intervalIdx[_frameIdx], _frameIdx);
}
if ((DateTime.Now - _timerStart).TotalMilliseconds >= _duration.Value)
{
_timerId.Stop();
}
_frameIdx++;
}
};
}
public delegate void IntervalCallback(BasicGeoposition loc, int pathIdx, int frameIdx);
public void Play()
{ _timerStart = DateTime.Now;
_frameIdx = 0;
_isPaused = false;
_timerId.Start();
}
public void Pause()
{
_isPaused = true;
}
public void Stop()
{
if (_timerId.IsEnabled)
{
_frameIdx = 0;
_isPaused = false;
_timerId.Stop();
}
}
}
上导致索引不足错误
答案 0 :(得分:0)
但是现在发生的情况是汽车到达时间比持续时间快,并导致索引错误...
我不确定您在这里的逻辑,但为避免得到IndexOutOfRangeException
,应确保集合的Count
始终大于传递给索引器的值,例如:
_timerId.Tick += (s, a) =>
{
if (!_isPaused)
{
if (intervalCallback != null
&& AppGlobals._intervalLocs.Count > _frameIdx
&& AppGlobals._intervalIdx.Count > _frameIdx)
{
intervalCallback(AppGlobals._intervalLocs[_frameIdx], AppGlobals._intervalIdx[_frameIdx], _frameIdx);
}
_frameIdx++;
if ((DateTime.Now - _timerStart).TotalMilliseconds >= _duration.Value)
_timerId.Stop();
}
};