event_queue :: EventQueue :: add
Register anevent
in the queue to be active in delay
units of time.
event_queue :: EventQueue :: add_at
Register anevent
in the queue executed at a specific time.
event_queue :: EventQueue :: defaultinit
event_queue :: EventQueue :: time=
Global time since the creation of the queueevent_queue :: EventQueue :: update
Add a given amount of time and return all the events that were active during the delay.event_queue $ EventQueue :: SELF
Type of this instance, automatically specialized in every classevent_queue :: EventQueue :: add
Register anevent
in the queue to be active in delay
units of time.
event_queue :: EventQueue :: add_at
Register anevent
in the queue executed at a specific time.
core :: Object :: class_factory
Implementation used byget_class
to create the specific class.
core :: Object :: defaultinit
event_queue :: EventQueue :: defaultinit
core :: Object :: is_same_instance
Return true ifself
and other
are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself
the same as other
in a serialization context?
core :: Object :: is_same_type
Return true ifself
and other
have the same dynamic type.
core :: Object :: output_class_name
Display class name on stdout (debug only).event_queue :: EventQueue :: time=
Global time since the creation of the queueevent_queue :: EventQueue :: update
Add a given amount of time and return all the events that were active during the delay.
# Queuing and management of arbitrary events in a timeline
class EventQueue[E]
# Comparator used by the queue
private var event_comparator = new EventComparator
# Efficient queue
private var queue = new MinHeap[EventInfo[E]](event_comparator)
# List of current active event
private var actives = new Array[EventInfo[E]]
# List of previously active event
private var old_actives = new Array[EventInfo[E]]
# Global time since the creation of the queue
var time = 0.0
# Nearest deadline, used to optimise queue access
#
# `inf` if no deadline is set
private var next: Float = inf
# Register an `event` in the queue to be active in `delay` units of time.
#
# If `duration` is given, this is duration after what the event is automatically discarded.
# If `null`, 0.0 or not given, the event will be executed only once
# Use `inf` for an event with an infinite duration.
fun add(event: E, delay: Float, duration: nullable Float): EventInfo[E]
do
return add_at(event, time + delay, duration)
end
# Register an `event` in the queue executed at a specific time.
fun add_at(event: E, start: Float, duration: nullable Float): EventInfo[E]
do
if start < next then next = start
var ei = new EventInfo[E](event, self, start, duration or else 0.0)
queue.add ei
return ei
end
# Add a given amount of time and return all the events that were active during the delay.
#
# Note that events that expired during the delay are marked `has_expired` and are still returned.
fun update(dt: Float): SequenceRead[EventInfo[E]]
do
var time = self.time
time += dt
self.time = time
# Switch things
var tmp = old_actives
old_actives = actives
actives = tmp
# Discard dead events
actives.clear
for ei in old_actives do
if not ei.has_expired then actives.add ei
end
# Start new events
if time >= next then loop
if queue.is_empty then
next = inf
break
end
var ei = queue.peek
if ei.start > time then
next = ei.start
break
end
ei = queue.take
if not ei.has_expired then
actives.add ei
ei.occurrences = 0
end
end
if actives.is_empty then return actives
# Update event information
for ei in actives do ei.update(time, dt)
return actives
end
end
lib/event_queue/event_queue.nit:168,1--255,3