Exemplo n.º 1
0
 def set_image(self, image):
     if image is None:
         self._cObj.SetImage(None)
         return
     if isinstance(image, Bitmap):
         image = ResourceManager._create_image(image)
     elif isinstance(image, pygame.Surface):
         image = ResourceManager._create_image(Bitmap(image))
     elif not isinstance(image, ImageInstance):
         image = ResourceManager.get_image(image)        
     self._image = image
     self._cObj.SetImage(image._cObj)
Exemplo n.º 2
0
 def __init__(self, frames, fps=None, secs=1, mode=StopMode, start_frame=0, start_direction=1):
     _CAction.__init__(self)
     if isinstance(frames, basestring):
         frames = ResourceManager.get_pattern(frames)
     self.frames = frames
     if fps is not None:
         self.delay = 1.0/fps
     else:
         self.delay = float(secs)/len(self.frames)
     self.mode = mode
     self.frame = start_frame
     self.direction = start_direction
Exemplo n.º 3
0
 def __init__(self,
              frames,
              fps=None,
              secs=1,
              mode=StopMode,
              start_frame=0,
              start_direction=1):
     _CAction.__init__(self)
     if isinstance(frames, basestring):
         frames = ResourceManager.get_pattern(frames)
     self.frames = frames
     if fps is not None:
         self.delay = 1.0 / fps
     else:
         self.delay = float(secs) / len(self.frames)
     self.mode = mode
     self.frame = start_frame
     self.direction = start_direction
Exemplo n.º 4
0
 def emit(cls, system, position=None):
     node = None
     if isinstance(position, Node):
         node = position
     cls.prepare()
     cobj = cls._cImpl()
     cobj.InitFrom(cls._cTemplate)
     if node is not None:
         cobj.AttachTo(node._cObj)
     else:
         cobj.SetPosition(_c.Vec2(*position))
     cobj.SetSystem(system._cObj)
     pyobj = ParticleEmitterInstance(cobj)
     pyobj._argcache = cls._argcache
     if cls.image is not None:
         image = ResourceManager.get_image(cls.image)
         if image is None:
             raise ValueError("could not load image %r" % imagename)
         pyobj.image = image
         cobj.image = image._cObj
     cobj.Start()
     return pyobj
Exemplo n.º 5
0
 def emit(cls, system, position=None):
     node = None
     if isinstance(position, Node):
         node = position
     cls.prepare()
     cobj = cls._cImpl()
     cobj.InitFrom(cls._cTemplate)
     if node is not None:
         cobj.AttachTo(node._cObj)
     else:
         cobj.SetPosition(_c.Vec2(*position))
     cobj.SetSystem(system._cObj)
     pyobj = ParticleEmitterInstance(cobj)
     pyobj._argcache = cls._argcache
     if cls.image is not None:
         image = ResourceManager.get_image(cls.image)
         if image is None:
             raise ValueError("could not load image %r" % imagename)
         pyobj.image = image
         cobj.image = image._cObj
     cobj.Start()
     return pyobj
Exemplo n.º 6
0
    def run(self, initialScene, *args, **kw):
        """Run the Director mainloop until program exit
        """
        try:
            # This is a long and ugly function that hasn't been splitted into smaller parts
            # because of performance considerations.
            #
            
            import pygame
            pygame.init()
            from Opioid2D.public.Mouse import Mouse
            
            # Bind functions to local names in order to increase performance
            sleep = time.sleep
            throttle = pygame.time.Clock()
            flip = pygame.display.flip
            get_ticks = pygame.time.get_ticks
            cD = self._cDirector
            OM = ObjectManager
            
            self._scene = None
            self.next_scene = None
            self.next_state = None
            
            now = get_ticks()
            cD.Start(now)

            self.set_scene(initialScene, *args, **kw)
            
            self._running = True            
            start = time.time()
            frames = 0
            self.delta = 0
            ticker = cD.GetTicker()
            old_ticks = now
            self.now = now
            
            # Preload Image subclasses that have been imported and that
            # contain the preload flag.
            for img in ImageMeta.subclasses:
                if img.preload:
                    ResourceManager.get_image(img)
                    
            while self._running:
                # Trigger possible scene change at the beginning of a new frame
                if self.next_scene is not None:
                    self._change_scene()
                
                # Time delta calculation
                ticks = get_ticks()
                self.delta = delta = min(ticks-old_ticks, 25) # limit the virtual clock to a max. advance of 25ms per frame
                old_ticks = ticks
                self.now = now = now + delta
                cD.Iterate(now)
                
                scene = self._scene
                cscene = scene._cObj
                cscene.Tick()
                
                # Event handling
                ev = pygame.event.get()
                if scene._gui is not None:
                    scene._gui.tick(ev)
                scene._handle_events(ev)
                
                # Call Scene tick callbacks
                if scene._tickfunc is not None:
                    scene._tickfunc()
                if ticker.realTick:
                    if scene._realtickfunc is not None:
                        scene._realtickfunc()
                
                # Manage state change within the scene
                while self.next_state is not None:
                    s = self.next_state
                    self.next_state = None
                    self.scene._init_state(s)
                
                # Update the screen
                cD.RenderFrame()
                
                # render software mouse cursor
                ms = Mouse._sprite
                if ms:
                    ms.position = Mouse.position
                    ms._cObj.TraverseFree()
                
                flip()
                
                # Purge managed C++ objects that have been killed on the C++ side.
                OM.purge()
                
                frames += 1
                throttle.tick(100) # limit FPS to 100 for lower CPU usage
            end = time.time()
        finally:
            from Opioid2D import _opi2d
            _opi2d.cleanup()
        return frames/(end-start)
Exemplo n.º 7
0
def newrun(initialScene, *args, **kw):
    """Run the Director mainloop until program exit
    """
    self = PigDirector
    try:
        # This is a long and ugly function that hasn't been splitted into smaller parts
        # because of performance considerations.
        
        import pygame
        pygame.init()
        from Opioid2D.public.Mouse import Mouse
        
        # Bind functions to local names in order to increase performance
        sleep = time.sleep
        throttle = pygame.time.Clock()
        flip = pygame.display.flip
        get_ticks = pygame.time.get_ticks
        cD = self._cDirector
        OM = ObjectManager
        
        self._scene = None
        self.next_scene = None
        self.next_state = None
        self.paused = False
        self.project_started = False
        
        now = get_ticks()
        cD.Start(now)

        self.set_scene(initialScene, *args, **kw)
        
        self._running = True            
        start = time.time()
        frames = 0
        self.delta = 0
        ticker = cD.GetTicker()
        old_ticks = now
        self.now = now
        self.switch_scene = None
        # Preload Image subclasses that have been imported and that
        # contain the preload flag.
        for img in ImageMeta.subclasses:
            if img.preload:
                ResourceManager.get_image(img)
        while self._running:
            # Trigger possible scene change at the beginning of a new frame
            if self.next_scene is not None:
                scene = None
                self._change_scene()
            if self.switch_scene is not None:
                scene = None
                if isclass( self.switch_scene):
                    self._scene = self.switch_scene()
                else:
                    self._scene = self.switch_scene
                cD.SetScene( self._scene._cObj)
                if isclass( self.switch_scene):
                    self._scene.enter()
                self.switch_scene = None
                import wx
                wx.CallAfter(wx.GetApp().refresh)
            # Time delta calculation
            ticks = get_ticks()
            self.delta = delta = min(ticks-old_ticks, 25) # limit the virtual clock to a max. advance of 25ms per frame
            old_ticks = ticks
            self.now = now = now + delta
            cD.Iterate(now)
            
            scene = self._scene
            cscene = scene._cObj
            if not self.paused:
                cscene.Tick()
                
                # Call Scene tick callbacks
                if scene._tickfunc is not None:
                    scene._tickfunc()
                if ticker.realTick:
                    if scene._realtickfunc is not None:
                        scene._realtickfunc()
                
            # Event handling
            ev = pygame.event.get()
            if scene.mouse_manager is not None:
                scene.mouse_manager.tick(ev)
            scene._handle_events(ev)

            # Manage state change within the scene
            while self.next_state is not None:
                s = self.next_state
                self.next_state = None
                self.scene._init_state(s)            
                        
            # Update the screen
            cD.RenderFrame()
            
            # render software mouse cursor
            ms = Mouse._sprite
            if ms:
                ms.position = Mouse.position
                ms._cObj.TraverseFree()
            
            flip()
            
            # Purge managed C++ objects that have been killed on the C++ side.
            OM.purge()
            
            frames += 1
            throttle.tick(100) # limit FPS to 100 for lower CPU usage
        end = time.time()
    finally:
        from Opioid2D import _opi2d
        _opi2d.cleanup()
    return frames/(end-start)    
Exemplo n.º 8
0
 def transform(self, mode):
     from Opioid2D.public.ResourceManager import ResourceManager
     k = self._key
     if mode not in k.mode:
         return ResourceManager.get_image(k, mode=k.mode + [mode])
     return self
Exemplo n.º 9
0
 def transform(self, mode):
     from Opioid2D.public.ResourceManager import ResourceManager
     k = self._key
     if mode not in k.mode:
         return ResourceManager.get_image(k, mode=k.mode+[mode])
     return self
Exemplo n.º 10
0
class Sprite(Node):
    """The Sprite is a Node that has a graphical presentation
    
    The usual way to use Sprites is to subclass the Sprite class
    and set the following class attributes:
        
    group - name of the SpriteGroup that instances of your sprite are automatically added to (can also be a list of names)
    image - name of the imagefile that is loaded for all instances
    layer - name of the layer that the instance is automatically placed on creation
    lighting - boolean setting for automatically enabling or disabling lighting for instances
    
    """
    __metaclass__ = SpriteMeta


    _init_image = None
    _init_layer = None

    group = None

    lighting = False
    
    def __new__(cls, *arg, **kw):
        obj = SpritePool.get_object()
        obj.__class__ = cls
        return obj

    def __init__(self, img=None):
        """Create a Sprite that uses the given image
        
        The image given can be an Image object or a string containing
        the image filename.
        """
        self._preinit(img)
        self.on_create()
        
    def _preinit(self, img):
        if img is None:
            img = self._init_image
        if not hasattr(self, "_cObj") or self._cObj is None:
            self._cObj = _c.Sprite()
        self.set_image(img)

        self._init()
        self._get_physics()
        
        group = self.group
        if group is not None:
            if type(group) not in (list, tuple):
                group = (group,)
            for g in group:
                self.join_group(g)
        if self._init_layer is not None:
            self.set_layer(self._init_layer)
        self.enable_lighting(self.lighting)
        
    def delete(self):
        if self.deleted:
            return
        self.on_delete()
        Node.delete(self)

    def on_create(self):
        """Callback that is invoked when the Sprite object is created.
        
        Override in subclasses"""
        pass
    
    def on_delete(self):
        """Callback that is invoked when the Sprite object is deleted.
        
        Override in subclasses"""
        pass

    def join_group(self, name):
        """Join a new sprite group"""
        scene = Director.scene
        group = scene.get_group(name)
        self._cObj.JoinGroup(group._cObj)

    def leave_group(self, name):
        """Leave a sprite group"""
        scene = Director.scene
        grp = scene.get_group(name)
        self._cObj.LeaveGroup(grp._cObj)

    def enable_lighting(self, flag):
        """Enable or disable lighting for this sprite"""
        self._cObj.EnableLighting(flag)

    def set_color(self, rgba):
        if len(rgba) == 3:
            rgba = rgba + (1,)
        self._cObj.GetColor().set(*rgba)
    def get_color(self):
        c = self._cObj.GetColor()
        return (c.red, c.green, c.blue, c.alpha)
    color = property(get_color, set_color, doc="Color of the sprite in (r,g,b,a)")

    def set_alpha(self, alpha):
        self._cObj.GetColor().alpha = alpha
    def get_alpha(self):
        return self._cObj.GetColor().alpha
    alpha = property(get_alpha, set_alpha, doc="Alpha value of the sprite")

    def set_image(self, image):
        if image is None:
            self._cObj.SetImage(None)
            return
        if isinstance(image, Bitmap):
            image = ResourceManager._create_image(image)
        elif isinstance(image, pygame.Surface):
            image = ResourceManager._create_image(Bitmap(image))
        elif not isinstance(image, ImageInstance):
            image = ResourceManager.get_image(image)        
        self._image = image
        self._cObj.SetImage(image._cObj)
    def get_image(self):
        return self._image
    #current_image = property(get_image, set_image)
    
    def get_hotspot(self):
        if self._image is None:
            return 0,0
        h = self._image.hotspot
        return h.x,h.y
    def set_hotspot(self, (x,y)):
        if self._image is None:
            return
        img = ResourceManager.get_image(self._image, hotspot=(x,y))
        self.image = img
Exemplo n.º 11
0
 def create_single(self, s):
     surf = self.create_surface(s)
     img = ResourceManager._create_image(Bitmap(surf))
     return Sprite(img)
Exemplo n.º 12
0
 def create_single(self, s):
     surf = self.create_surface(s)
     img = ResourceManager._create_image(Bitmap(surf))
     return Sprite(img)