示例#1
0
class Entity:
    INIT_ORDER = ["model", "style", "position", "size", "graphics"]

    def __init__(self, name):
        self.name = name
        self.model = {}

        self._log = MessageLogger()
        self.log = self._log.log
        self.get_message = self._log.get_message
        self.get_log = self._log.get_log

        self.clock = Clock(name + " clock")
        self.rect = Rect((1, 1), (0, 0))
        self.controllers = []

        self.control_freeze = False
        self.visible = True
        self._graphics = None
        self._style = {}

        self.sounds = {}
        self.meters = {}

        self.event = None
        self.event_handler = EventHandler(self)
        self.handle_event = self.event_handler.handle_event

        self.queue_events({"name": "on_spawn"})

    def __repr__(self):
        c = self.__class__.__name__
        n = self.name

        return "{}: '{}'".format(c, n)

    def queue_events(self, *events):
        self.event_handler.queue_events(*events)

    def add_listener(self, event_name, response):
        if "target" in response:
            target = response["target"]
        else:
            target = self

        l = {"name": event_name, "target": target, "response": response}

        self.event_handler.listeners.append(l)

    def update(self):
        for m in self.get_update_methods():
            m()

    def get_update_methods(self):
        um = [self.clock.tick]

        if self.controller:
            um.append(self.controller.update)

        if self.graphics:
            um.append(self.graphics.update)

        return um

    def move(self, dxdy):
        self.rect.move(dxdy)

    def kill(self):
        self.control_freeze = True
        dying = {
            "name": "on_dying",
            "duration": DYING_TIME,
        }
        self.queue_events(dying, "on_death")

    @property
    def graphics(self):
        return self._graphics

    @graphics.setter
    def graphics(self, value):
        if isinstance(value, Graphics):
            self._graphics = value

        else:
            self.set_graphics(value)

    @property
    def controller(self):
        if self.controllers:
            return self.controllers[0]

    @property
    def image(self):
        if self.graphics:
            return self.graphics.get_image()

        else:
            return False

    @property
    def draw_point(self):
        return self.position

    @property
    def position(self):
        return self.get_position()

    @position.setter
    def position(self, value):
        x, y = value
        self.set_position(x, y)

    def get_position(self):
        return self.rect.position

    def set_position(self, x, y):
        self.rect.position = x, y

        self.handle_event("on_change_position")

    @property
    def size(self):
        return self.get_size()

    @size.setter
    def size(self, value):
        w, h = value
        self.set_size(w, h)

    def get_size(self):
        return self.rect.size

    def set_size(self, w, h):
        self.rect.size = w, h

        self.handle_event("on_change_size")

    @property
    def style(self):
        if not self._style:
            self._style = DEFAULT_STYLE.copy()

        return self._style

    @style.setter
    def style(self, value):
        self.set_style(value)

    def set_style(self, style):
        if type(style) is dict:
            self.style.update(style)

        if type(style) is str:
            self._style = load_style(style)

        if self.graphics:
            self.graphics.reset_image()

    def set_meters(self, d):
        for name in d:
            self.meters[name] = Meter(name, *d[name])

    def get_meter_value(self, name):
        return self.meters[name].value

    def set_graphics(self, graphics, *args, **kwargs):
        self._graphics = graphics(self, *args, **kwargs)

        self.handle_event("on_change_size")

    def set_resources(self, *dict_names):
        for name in dict_names:
            rd = load_resource("resource_dicts")[name]

            for key in rd:
                file_name = rd[key]
                self.add_resource(key, file_name)

    def add_resource(self, key, file_name):
        item = load_resource(file_name)
        ext = file_name.split(".")[-1]

        if ext in SOUND_EXT:
            self.sounds[key] = item

    def set_controller(self, arg, clear=True):
        if type(arg) is str:
            cont = load_controller(arg)

        else:
            name = arg.pop("name")
            cont = make_controller(name, arg)

        if not clear:
            self.controllers.append(cont)

        else:
            self.controllers = [cont]

    def set_controllers(self, controllers):
        for c in controllers:
            self.set_controller(c.name, clear=False)

    def set_controller_index(self, layer, index):
        file_name = layer.controllers[index].name

        self.set_controller(file_name)

    def set_command_inputs(self, *commands):
        for name in commands:
            c = load_resource("command_inputs")[name]

            for controller in self.controllers:
                controller.add_command_input(name, c)

    def set_event_passers(self, target, *event_names):
        for name in event_names:
            l = {"name": name, "target": target}

            self.event_handler.listeners.append(l)

    def set_event(self, event):
        self.event = event.copy()

    def set_model(self, d, update=False):
        if not update:
            self.model = d

        else:
            self.model.update(d)
示例#2
0
    def setCityProperty(self, id, city, tiles=[]):
        self._stop = xbmc.abortRequested
        if self._stop: return
        #[u'city', u'outlook', u'temp', u'url', u'country', u'coords', u'time', u'unit', u'icon']
        ok = False
        try:
            b_prop = "weatherworld.city.%i." % id

            lat = float(city["coords"]["lat"][1])
            long = float(city["coords"]["long"][1])
            posx, posy = self.getPosition(lat, long, self.mapwidth,
                                          self.mapheight)

            rect = Rect(posx, posy, self.tilewidth, self.tileheight)
            flipx, flipy = 0, 0
            offsetx, offsety = 0, 0
            if rect.right > self.mapwidth: flipx, offsetx = 1, -self.tilewidth
            if rect.bottom > self.mapheight:
                flipy, offsety = 1, -self.tileheight
            if offsetx or offsety: rect.move(posx + offsetx, posy + offsety)

            collide = False
            for tile in tiles:
                collide = rect.colliderect(tile) is not None
                if collide: break
            if collide:
                self.window.setProperty(b_prop + "name", "")
                return ok, tiles

            tiles.append(rect)
            self.window.setProperty(b_prop + "flipx", str(flipx))
            self.window.setProperty(b_prop + "flipy", str(flipy))

            try:
                localtime = get_user_time_format(city["time"])
            except:
                localtime = city["time"]

            self.window.setProperty(b_prop + "name",
                                    city["city"] + ", " + city["country"])
            self.window.setProperty(b_prop + "outlook", city["outlook"])

            celsius, unit = fahrenheit2celsius(city["temp"], city["unit"])
            self.window.setProperty(b_prop + "temperature", celsius)
            self.window.setProperty(b_prop + "unit", unit)

            self.window.setProperty(b_prop + "localtime", localtime)
            self.window.setProperty(b_prop + "icon", city["icon"])
            self.window.setProperty(b_prop + "latitude",
                                    city["coords"]["lat"][0])
            self.window.setProperty(b_prop + "longitude",
                                    city["coords"]["long"][0])

            # get old pos
            oldx, oldy = self.window.getProperty(
                b_prop + "posx"), self.window.getProperty(b_prop + "posy")
            self.window.setProperty(b_prop + "posx", str(posx))
            self.window.setProperty(b_prop + "posy", str(posy))
            start = "0,0"
            if oldx.isdigit() and oldy.isdigit():
                start = "%s,%s" % (oldx, oldy)

            control = self.controls[2600 + id]
            if control:
                control.setAnimations([(
                    'conditional',
                    'condition=true effect=slide start=%s end=%i,%i time=500 easing=inout tween=easing'
                    % (start, posx, posy))])

                ok = True
        except:
            ok = "error"
            print_exc()
        return ok, tiles
示例#3
0
    def setCityProperty( self, id, city, tiles=[] ):
        self._stop = xbmc.abortRequested
        if self._stop: return
        #[u'city', u'outlook', u'temp', u'url', u'country', u'coords', u'time', u'unit', u'icon']
        ok = False
        try:
            b_prop = "weatherworld.city.%i." % id

            lat  = float( city[ "coords" ][ "lat" ][ 1 ] )
            long = float( city[ "coords" ][ "long" ][ 1 ] )
            posx, posy = self.getPosition( lat, long, self.mapwidth, self.mapheight )

            rect = Rect( posx, posy, self.tilewidth, self.tileheight )
            flipx, flipy = 0, 0
            offsetx, offsety = 0, 0
            if rect.right > self.mapwidth:   flipx, offsetx = 1, -self.tilewidth
            if rect.bottom > self.mapheight: flipy, offsety = 1, -self.tileheight
            if offsetx or offsety: rect.move( posx+offsetx, posy+offsety )

            collide = False
            for tile in tiles:
                collide = rect.colliderect( tile ) is not None
                if collide: break
            if collide:
                self.window.setProperty( b_prop + "name", "" )
                return ok, tiles

            tiles.append( rect )
            self.window.setProperty( b_prop + "flipx", str( flipx ) )
            self.window.setProperty( b_prop + "flipy", str( flipy ) )

            try: localtime = get_user_time_format( city[ "time" ] )
            except: localtime = city[ "time" ]

            self.window.setProperty( b_prop + "name",        city[ "city" ] + ", " + city[ "country" ] )
            self.window.setProperty( b_prop + "outlook",     city[ "outlook" ] )

            celsius, unit = fahrenheit2celsius( city[ "temp" ], city[ "unit" ] )
            self.window.setProperty( b_prop + "temperature", celsius )
            self.window.setProperty( b_prop + "unit",        unit )

            self.window.setProperty( b_prop + "localtime",   localtime )
            self.window.setProperty( b_prop + "icon",        city[ "icon" ] )
            self.window.setProperty( b_prop + "latitude",    city[ "coords" ][ "lat" ][ 0 ] )
            self.window.setProperty( b_prop + "longitude",   city[ "coords" ][ "long" ][ 0 ] )

            # get old pos
            oldx, oldy = self.window.getProperty( b_prop + "posx" ), self.window.getProperty( b_prop + "posy" )
            self.window.setProperty( b_prop + "posx",        str( posx ) )
            self.window.setProperty( b_prop + "posy",        str( posy ) )
            start = "0,0"
            if oldx.isdigit() and oldy.isdigit():
                start = "%s,%s" % ( oldx, oldy )

            control = self.controls[ 2600 + id ]
            if control:
                control.setAnimations( [ ( 'conditional', 'condition=true effect=slide start=%s end=%i,%i time=500 easing=inout tween=easing' % ( start, posx, posy ) ) ] )

                ok = True
        except:
            ok = "error"
            print_exc()
        return ok, tiles