view engine/extensions/fife_timer.py @ 349:493f7492f0ba

Fixed a problem with Camera::render() involving the way it calculates the animation frame number.
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Thu, 03 Sep 2009 23:22:28 +0000
parents 48c99636453e
children dfd48d49c044
line wrap: on
line source

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# ####################################################################
#  Copyright (C) 2005-2009 by the FIFE team
#  http://www.fifengine.de
#  This file is part of FIFE.
#
#  FIFE is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2.1 of the License, or (at your option) any later version.
#
#  This library is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library; if not, write to the
#  Free Software Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
# ####################################################################

import fife

"""
Convenient timers
=================

Usage::
  import timer
  timer.init( my_fife_engine.getTimeManager() )
  def spam():
     print "SPAM SPAM ",
     return "More spam?" # a string is a true value, so it's repeated.
  repeater = timer.repeatCall(500,spam)
  def stop_spam():
     repeater.stop()
     print "BACON EGGS AND SPAM"
  timer.delayCall(50000,stop_spam)

"""


_manager = None
_alltimers = {}

def init(timemanager):
	"""
	Initialize timers.

	@param timemanager: A L{fife.TimeManager} as retuned by L{fife.Engine.getTimeManager}.
	"""
	global _manager
	_manager = timemanager

class Timer(fife.TimeEvent):
	def __init__(self,delay=0,callback=None):
		super(Timer,self).__init__(0)
		self.manager = _manager
		self.is_registered = False
		self.callback = callback
		self.setPeriod(delay)

	def start(self):
		if self.is_registered:
			return
		self.is_registered = True
		global _alltimers
		_alltimers[self]=1
		self.manager.registerEvent(self)

	def stop(self):
		if not self.is_registered:
			return
		self.is_registered = False
		global _alltimers
		del _alltimers[self]
		self.manager.unregisterEvent(self)

	def updateEvent(self,delta):
		if callable(self.callback):
			self.callback()

def delayCall(delay,callback):
	"""
	Delay a function call by a number of milliseconds.

	@param delay Delay in milliseconds.
	@param callback The function to call.

	@return The timer.
	"""
	timer = Timer(delay)
	def cbwa(c, *args):
		c(*args)
	def real_callback(c, t):
		t.stop()
		c()
		
	timer.callback = cbwa(real_callback, callback, timer)
	timer.start()
	return timer

from traceback import print_exc
def repeatCall(period,callback):
	"""
	Repeat a function call.

	@param period Period between calls in milliseconds.
	@param callback The function to call.

	@return The timer.

	The call is repeated until the callback returns a False
	value (i.e. None) or the timer is stopped.
	"""
	timer = Timer(period)
	def real_callback():
		try:
			if not callback():
				timer.stop()
		except Exception:
			print_exc()
			timer.stop()

	timer.callback = real_callback
	timer.start()
	return timer

__all__ = [init,Timer,delayCall,repeatCall]