Example #1
0
class GameObject(object):
    __ID = 1

    @classmethod
    def __new_id(cls):
        id = cls.__ID
        cls.__ID += 1
        return id

    def __init__(self, position=(0, 0), rotation=0.0, scale=(1, 1)):
        self.id = GameObject.__new_id()
        self.name = ''
        self.tags = []
        self.enabled = True
        self.visible = True
        self.static = False

        self.__children = WeakList()
        self.__parent = None

        self.__x, self.__y = position
        self.__rotation = rotation
        self.__scale = scale

        self.collider = None

    def __del__(self):
        del self.collider

    # PARENTING ===============================================================
    def add_child(self, child, cascade=True):
        if cascade: child.set_parent(self, False)
        # self.__children.append(weakref.ref(child))
        self.__children.append(child)

    def remove_child(self, child, cascade=True):
        if cascade: child.set_parent(None, False)
        # self.__children.remove(weakref.ref(child))
        self.__children.remove(child)

    def get_children(self):
        return self.__children.to_list()
        # result = []
        # for i in reversed(xrange(len(self.__children))):
        #     c = self.__children[i]()
        #     if c is None:
        #         del self.__children[i]
        #     else:
        #         result.insert(0, c)

        # return result
    children = property(get_children)

    def get_parent(self):
        if self.__parent is None: 
            return None
        return self.__parent()
    def set_parent(self, value, cascade=True):
        if cascade:
            if self.parent is not None : 
                self.parent.remove_child(self, False)
            if value is not None:
                value.add_child(self, False)

        if value is not None:
            self.__parent = weakref.ref(value)
        else:
            self.__parent = value
    parent = property(get_parent, set_parent)

    def __contains__(self, child):
        return child in self.get_children()
    # =========================================================================

    # COLLISION ===============================================================
    def add_circle_collider(self, position=None, radius=None):
        if position is None:
            position = self.position

        if radius is None:
            radius = 1

        self.collider = batma.CircleCollider(position, radius)

    def add_box_collider(self, position=None, half_width=None, half_height=None):
        if position is None:
            position = self.position

        if half_width is None:
            half_width = 1

        if half_height is None:
            half_height = 1

        self.collider = batma.BoxCollider(position, half_width, half_height)
    # =========================================================================

    # SPATIAL =================================================================
    def get_x(self):
        return self.__x
    def set_x(self, value):
        if self.collider:
            delta = value - self.__x
            self.collider.x += delta
        self.__x = value
    x = property(get_x, set_x)

    def get_y(self):
        return self.__y
    def set_y(self, value):
        if self.collider:
            delta = value - self.__y
            self.collider.y += delta
        self.__y = value
    y = property(get_y, set_y)

    def get_position(self):
        return Vector2(self.__x, self.__y)
    def set_position(self, value):
        self.x = value[0]
        self.y = value[1]
    position = property(get_position, set_position)

    def get_rotation(self):
        return self.__rotation
    def set_rotation(self, value):
        self.__rotation = value%360
    rotation = property(get_rotation, set_rotation)

    def get_scale(self):
        return self.__scale
    def set_scale(self, value):
        if isinstance(value, (int, long, float)):
            value = Vector2(value, value)
        self.__scale = value
    scale = property(get_scale, set_scale)

    def transform(self):
        gl.glTranslatef(self.x, self.y, 0)

        if self.rotation != 0.0:
            gl.glRotatef(self.rotation, 0, 0, -1)

        if self.scale != (1.0, 1.0):
            gl.glScalef(self.scale[0], self.scale[1], 0)
    # =========================================================================

    def update(self, tick):
        pass

    def draw(self):
        pass
        
    def __repr__(self): return '<GameObject "%s">'%(self.name or self.id)
Example #2
0
class GameObject(object):
    __ID = 1

    @classmethod
    def __new_id(cls):
        id = cls.__ID
        cls.__ID += 1
        return id

    def __init__(self, position=(0, 0), rotation=0.0, scale=(1, 1)):
        self.id = GameObject.__new_id()
        self.name = ''
        self.tags = []
        self.enabled = True
        self.visible = True
        self.static = False

        self.__children = WeakList()
        self.__parent = None

        self.__x, self.__y = position
        self.__rotation = rotation
        self.__scale = scale

        self.collider = None

    def __del__(self):
        del self.collider

    # PARENTING ===============================================================
    def add_child(self, child, cascade=True):
        if cascade: child.set_parent(self, False)
        # self.__children.append(weakref.ref(child))
        self.__children.append(child)

    def remove_child(self, child, cascade=True):
        if cascade: child.set_parent(None, False)
        # self.__children.remove(weakref.ref(child))
        self.__children.remove(child)

    def get_children(self):
        return self.__children.to_list()
        # result = []
        # for i in reversed(xrange(len(self.__children))):
        #     c = self.__children[i]()
        #     if c is None:
        #         del self.__children[i]
        #     else:
        #         result.insert(0, c)

        # return result

    children = property(get_children)

    def get_parent(self):
        if self.__parent is None:
            return None
        return self.__parent()

    def set_parent(self, value, cascade=True):
        if cascade:
            if self.parent is not None:
                self.parent.remove_child(self, False)
            if value is not None:
                value.add_child(self, False)

        if value is not None:
            self.__parent = weakref.ref(value)
        else:
            self.__parent = value

    parent = property(get_parent, set_parent)

    def __contains__(self, child):
        return child in self.get_children()

    # =========================================================================

    # COLLISION ===============================================================
    def add_circle_collider(self, position=None, radius=None):
        if position is None:
            position = self.position

        if radius is None:
            radius = 1

        self.collider = batma.CircleCollider(position, radius)

    def add_box_collider(self,
                         position=None,
                         half_width=None,
                         half_height=None):
        if position is None:
            position = self.position

        if half_width is None:
            half_width = 1

        if half_height is None:
            half_height = 1

        self.collider = batma.BoxCollider(position, half_width, half_height)

    # =========================================================================

    # SPATIAL =================================================================
    def get_x(self):
        return self.__x

    def set_x(self, value):
        if self.collider:
            delta = value - self.__x
            self.collider.x += delta
        self.__x = value

    x = property(get_x, set_x)

    def get_y(self):
        return self.__y

    def set_y(self, value):
        if self.collider:
            delta = value - self.__y
            self.collider.y += delta
        self.__y = value

    y = property(get_y, set_y)

    def get_position(self):
        return Vector2(self.__x, self.__y)

    def set_position(self, value):
        self.x = value[0]
        self.y = value[1]

    position = property(get_position, set_position)

    def get_rotation(self):
        return self.__rotation

    def set_rotation(self, value):
        self.__rotation = value % 360

    rotation = property(get_rotation, set_rotation)

    def get_scale(self):
        return self.__scale

    def set_scale(self, value):
        if isinstance(value, (int, long, float)):
            value = Vector2(value, value)
        self.__scale = value

    scale = property(get_scale, set_scale)

    def transform(self):
        gl.glTranslatef(self.x, self.y, 0)

        if self.rotation != 0.0:
            gl.glRotatef(self.rotation, 0, 0, -1)

        if self.scale != (1.0, 1.0):
            gl.glScalef(self.scale[0], self.scale[1], 0)

    # =========================================================================

    def update(self, tick):
        pass

    def draw(self):
        pass

    def __repr__(self):
        return '<GameObject "%s">' % (self.name or self.id)