Example #1
0
class GameObject:
    def __init__(self):
        self.id = ""
        self.angle = 0
        self.screen_relative = False
        self.screen_relative_pos = None
        self.body = None
        self.screen_factor = 1
        self.img_loop = False
        self.fixtures = []
        self.pos = Vector2()
        self.not_rot_pos = Vector2()
        self.size = Vector2()
        self.rect = None
        self.click_rect = None
        self.remove = False
        self.event = None

    def scale(self, x, y):

        self.size = self.size*Vector2(x*CONST.scale_speed+1,
                                      y*CONST.scale_speed+1)
        """update body"""
        if self.body:
            physics_manager.remove_body(self.body)
            self.body = physics_manager.add_body(self.not_rot_pos, BodyType.static)
            physics_manager.add_box(self.body,Vector2(),self.size/2)
        self.update_rect()
    
    def update_rect(self):
        pos = Vector2()
        if self.pos:
            pos = self.pos
        if self.screen_relative_pos:
            pos = pos+self.screen_relative_pos*engine.get_screen_size()
        self.rect = Rect(pos, self.size, self.angle)

        center_pos = Vector2()
        if self.body:
            center_pos = physics_manager.get_body_position(self.body)
            if self.screen_relative_pos:
                center_pos = center_pos - self.screen_relative_pos*engine.get_screen_size()

            self.not_rot_pos = center_pos

        v = self.size/2
        v.rotate(-self.angle)
        if self.angle > 0:
            pos = self.not_rot_pos + (v-self.size/2)
        else:
            pos = self.not_rot_pos + (self.size/2-v)

        size_y = Vector2(self.size.x, 0)
        size_y.rotate(self.angle)
        v = Vector2(self.size.x, self.size.y + math.fabs(size_y.y))
        self.click_rect = Rect(self.not_rot_pos-v/2, v)

    def move(self, delta):
        self.pos = self.pos+delta
        if self.body:
            body_pos = physics_manager.get_body_position(self.body)
            physics_manager.set_body_position(self.body,body_pos+delta)
        self.update_rect()

    def set_pos(self,init_pos,delta_pos):
        delta_move = delta_pos-(self.pos-init_pos)
        self.move(delta_move)

    def set_angle(self, angle, center=True):
        pos = Vector2()

        self.angle = angle % 360
        if self.angle > 180:
            self.angle -= 360

        if self.body:
            self.body.angle = self.angle*math.pi/180
        if center:
            if self.body:
                pos = physics_manager.get_body_position(self.body)
                if self.screen_relative_pos:
                    pos = pos - self.screen_relative_pos*physics_manager.get_screen_size()
                self.not_rot_pos = pos - self.size/2
                v = self.size/2
                v.rotate(self.angle)
                self.pos = self.not_rot_pos - v + self.size/2
        else:
            '''TODO: Readjust body pos'''
            pass

        self.update_rect()
        
    def check_click(self, mouse_pos, screen_pos):
        if CONST.debug:
            from game_object.text import Text
            if isinstance(self, Text):
                log("Check click for text: "+self.text)
        if not self.screen_relative:
            point_pos = screen_pos + mouse_pos
        else:
            point_pos = mouse_pos
        if self.click_rect and not self.screen_relative:
            return self.click_rect.collide_point(point_pos)
        elif self.rect:
            return self.rect.collide_point(point_pos)
        else:
            return False

    def execute_event(self):
        if self.event:
            self.event.execute()

    def loop(self,screen):

        screen_pos = level_manager.level.screen_pos
        pos = (0,0)
        if self.pos:
            pos = self.pos
        
        if self.screen_relative_pos is not None:
            pos = pos + self.screen_relative_pos*engine.get_screen_size()
        
        if self.screen_relative:
            pos = self.pos
        else:
            pos = pos-screen_pos
        if CONST.debug and False:
            self.update_rect()
            if not self.screen_relative:
                img_manager.draw_rect(screen, screen_pos, self.rect, (0,0,255,200), self.angle)
                if self.click_rect:
                    img_manager.draw_rect(screen,screen_pos,self.click_rect,(0,255,0,100))

    def set_position(self,pos):
        if self.screen_relative_pos:
            self.pos = (pos[0]-self.screen_relative_pos[0],pos[1]-self.screen_relative_pos[1])
        else:
            self.pos = pos