Exemple #1
0
    def avoid_light_old(self, player_diff, player_distance):
        #Get the brightness at a few points and go in the direction that it's
        #Use green light for some reason
        elapsed = globals.time - self.last_random
        if elapsed < self.random_segments:
            return
        self.last_random = globals.time
        self.fleeing = True
        sp = self.screen_pos
        self.pixel_data = glReadPixels(sp.x - self.width * 2,
                                       sp.y - self.width * 2, self.width * 4,
                                       self.height * 4, GL_RGB, GL_FLOAT)[:, :,
                                                                          1:3]
        max_index = numpy.argmax(self.pixel_data[:, :, 1:2])
        min_index = numpy.argmin(self.pixel_data[:, :, 1:2])
        indices = numpy.unravel_index((max_index, min_index),
                                      self.pixel_data.shape)
        max_index = indices[0][0], indices[1][0], indices[2][0]
        min_index = indices[0][1], indices[1][1], indices[2][1]
        #print 'max=',max_index,self.pixel_data[max_index]
        #print 'test',self.pixel_data[indices]
        d = Point(indices[0][0] - indices[0][1],
                  indices[1][0] - indices[1][1]).unit_vector()
        if d.length() == 0:
            self.seek_player(player_diff, player_distance)
            self.move_direction *= -1

        self.move_direction = d.unit_vector() * self.speed
Exemple #2
0
    def avoid_light_old(self, player_diff, player_distance):
        #Get the brightness at a few points and go in the direction that it's
        #Use green light for some reason
        elapsed = globals.time - self.last_random
        if elapsed < self.random_segments:
            return
        self.last_random = globals.time
        self.fleeing = True
        sp = self.screen_pos
        self.pixel_data = glReadPixels(sp.x-self.width*2,sp.y-self.width*2,self.width*4,self.height*4,GL_RGB,GL_FLOAT)[:,:,1:3]
        max_index = numpy.argmax(self.pixel_data[:,:,1:2])
        min_index = numpy.argmin(self.pixel_data[:,:,1:2])
        indices = numpy.unravel_index((max_index,min_index),self.pixel_data.shape)
        max_index = indices[0][0],indices[1][0],indices[2][0]
        min_index = indices[0][1],indices[1][1],indices[2][1]
        #print 'max=',max_index,self.pixel_data[max_index]
        #print 'test',self.pixel_data[indices]
        d = Point(indices[0][0]-indices[0][1],indices[1][0]-indices[1][1]).unit_vector()
        if d.length() == 0:
            self.seek_player(player_diff, player_distance)
            self.move_direction *= -1

        self.move_direction = d.unit_vector()*self.speed
Exemple #3
0
class Actor(object):
    texture = None
    width = None
    height = None
    threshold = 0.01
    initial_health = 100
    max_speed = 0.25
    max_square_speed = max_speed**2

    def __init__(self, map, pos):
        self.map = map
        self.tc = globals.atlas.TextureSpriteCoords('%s.png' % self.texture)
        self.quad = drawing.Quad(globals.quad_buffer, tc=self.tc)
        self.size = Point(float(self.width) / 16, float(self.height) / 16)
        self.corners = self.size, Point(-self.size.x, self.size.y), Point(
            -self.size.x, -self.size.y), Point(self.size.x, -self.size.y)
        self.corners = [p * 0.5 for p in self.corners]
        self.corners_polar = [(p.length(), ((1 + i * 2) * math.pi) / 4)
                              for i, p in enumerate(self.corners)]
        self.radius_square = (self.size.x / 2)**2 + (self.size.y / 2)**2
        self.radius = math.sqrt(self.radius_square)
        self.corners_euclid = [p for p in self.corners]
        self.current_sound = None
        self.last_update = None
        self.dead = False
        self.move_speed = Point(0, 0)
        self.move_direction = Point(0, 0)
        self.pos = None
        self.last_damage = 0
        self.health = self.initial_health
        self.interacting = None
        self.SetPos(pos)
        self.set_angle(3 * math.pi / 2)

    def RemoveFromMap(self):
        if self.pos != None:
            bl = self.pos.to_int()
            tr = (self.pos + self.size).to_int()
            for x in xrange(bl.x, tr.x + 1):
                for y in xrange(bl.y, tr.y + 1):
                    self.map.RemoveActor(Point(x, y), self)

    def AdjustHealth(self, amount):
        self.health += amount
        if self.health > self.initial_health:
            self.health = self.initial_health
        if self.health < 0:
            #if self.dead_sound:
            #    self.dead_sound.play()
            self.health = 0
            self.dead = True
            self.Death()

    def damage(self, amount):
        if globals.time < self.last_damage + self.immune_duration:
            #woop we get to skip
            return
        self.last_damage = globals.time
        self.AdjustHealth(-amount)

    def SetPos(self, pos):
        self.RemoveFromMap()
        self.pos = pos

        self.vertices = [((pos + corner) * globals.tile_dimensions).to_int()
                         for corner in self.corners_euclid]

        bl = pos
        tr = bl + self.size
        bl = bl.to_int()
        tr = tr.to_int()
        #self.quad.SetVertices(bl,tr,4)
        self.quad.SetAllVertices(self.vertices, 4)
        for x in xrange(bl.x, tr.x + 1):
            for y in xrange(bl.y, tr.y + 1):
                self.map.AddActor(Point(x, y), self)

    def TriggerCollide(self, other):
        pass

    def set_angle(self, angle):
        self.angle = angle
        self.corners_polar = [(p.length(),
                               self.angle + ((1 + i * 2) * math.pi) / 4)
                              for i, p in enumerate(self.corners)]
        cnums = [cmath.rect(r, a) for (r, a) in self.corners_polar]
        self.corners_euclid = [Point(c.real, c.imag) for c in cnums]

    def Update(self, t):
        self.Move(t)

    def Move(self, t):
        if self.last_update == None:
            self.last_update = globals.time
            return
        elapsed = (globals.time - self.last_update) * globals.time_step
        self.last_update = globals.time

        self.move_speed += self.move_direction * elapsed
        if self.move_speed.SquareLength() > self.max_square_speed:
            self.move_speed = self.move_speed.unit_vector() * self.max_speed

        friction = self.move_speed.unit_vector() * 0.03 * elapsed
        if friction.SquareLength() < self.move_speed.SquareLength():
            #self.move_speed *= 0.7*(1-(elapsed/1000.0))
            self.move_speed -= friction
        else:
            self.move_speed = Point(0, 0)

        if self.interacting:
            self.move_speed = Point(0, 0)

        amount = self.move_speed * elapsed

        bl = self.pos.to_int()
        tr = (self.pos + self.size).to_int()
        for x in xrange(bl.x, tr.x + 1):
            for y in xrange(bl.y, tr.y + 1):
                try:
                    for actor in self.map.data[x][y].actors:
                        if actor is self:
                            continue
                        distance = actor.pos - self.pos
                        if distance.SquareLength(
                        ) < self.radius_square + actor.radius_square:
                            overlap = self.radius + actor.radius - distance.length(
                            )
                            adjust = distance.unit_vector() * -overlap
                            #print type(self),self.radius,actor.radius,distance.length(),overlap,adjust
                            amount += adjust * 0.1
                            self.TriggerCollide(actor)
                            #We've hit, so move us away from it's centre by the overlap
                except IndexError:
                    pass

        #check each of our four corners
        for corner in self.corners:
            pos = self.pos + corner
            target_x = pos.x + amount.x
            if target_x >= self.map.size.x:
                amount.x = 0
                target_x = pos.x
            elif target_x < 0:
                amount.x = -pos.x
                target_x = 0

            target_tile_x = self.map.data[int(target_x)][int(pos.y)]
            if target_tile_x.type in game_view.TileTypes.Impassable:
                amount.x = 0

            elif (int(target_x), int(pos.y)) in self.map.object_cache:
                obj = self.map.object_cache[int(target_x), int(pos.y)]
                if obj.Contains(Point(target_x, pos.y)):
                    amount.x = 0

            target_y = pos.y + amount.y
            if target_y >= self.map.size.y:
                amount.y = 0
                target_y = pos.y
            elif target_y < 0:
                amount.y = -pos.y
                target_y = 0
            target_tile_y = self.map.data[int(pos.x)][int(target_y)]
            if target_tile_y.type in game_view.TileTypes.Impassable:
                amount.y = 0
            elif (int(pos.x), int(target_y)) in self.map.object_cache:
                obj = self.map.object_cache[int(pos.x), int(target_y)]
                if obj.Contains(Point(pos.x, target_y)):
                    amount.y = 0

        self.SetPos(self.pos + amount)

        if self.interacting:
            diff = self.interacting.pos + (self.interacting.size *
                                           0.5) - self.pos
            distance = diff.length()
            if distance > 2.5:
                self.deactivate()

    def GetPos(self):
        return self.pos

    def GetPosCentre(self):
        return self.pos

    def click(self, pos, button):
        pass

    def unclick(self, pos, button):
        pass

    @property
    def screen_pos(self):
        p = (self.pos * globals.tile_dimensions -
             globals.game_view.viewpos._pos) * globals.scale
        return p
Exemple #4
0
class Actor(object):
    texture = None
    width   = None
    height  = None
    threshold = 0.01
    initial_health = 100
    max_speed = 0.25
    max_square_speed = max_speed**2
    def __init__(self,map,pos):
        self.map            = map
        self.tc             = globals.atlas.TextureSpriteCoords('%s.png' % self.texture)
        self.quad           = drawing.Quad(globals.quad_buffer,tc = self.tc)
        self.size           = Point(float(self.width)/16,float(self.height)/16)
        self.corners = self.size, Point(-self.size.x,self.size.y), Point(-self.size.x,-self.size.y), Point(self.size.x,-self.size.y)
        self.corners        = [p*0.5 for p in self.corners]
        self.corners_polar  = [(p.length(),((1+i*2)*math.pi)/4) for i,p in enumerate(self.corners)]
        self.radius_square  = (self.size.x/2)**2 + (self.size.y/2)**2
        self.radius         = math.sqrt(self.radius_square)
        self.corners_euclid = [p for p in self.corners]
        self.current_sound  = None
        self.last_update    = None
        self.dead           = False
        self.move_speed     = Point(0,0)
        self.move_direction = Point(0,0)
        self.pos = None
        self.last_damage = 0
        self.health = self.initial_health
        self.interacting = None
        self.SetPos(pos)
        self.set_angle(3*math.pi/2)

    def RemoveFromMap(self):
        if self.pos != None:
            bl = self.pos.to_int()
            tr = (self.pos+self.size).to_int()
            for x in xrange(bl.x,tr.x+1):
                for y in xrange(bl.y,tr.y+1):
                    self.map.RemoveActor(Point(x,y),self)

    def AdjustHealth(self,amount):
        self.health += amount
        if self.health > self.initial_health:
            self.health = self.initial_health
        if self.health < 0:
            #if self.dead_sound:
            #    self.dead_sound.play()
            self.health = 0
            self.dead = True
            self.Death()

    def damage(self, amount):
        if globals.time < self.last_damage + self.immune_duration:
            #woop we get to skip
            return
        self.last_damage = globals.time
        self.AdjustHealth(-amount)

    def SetPos(self,pos):
        self.RemoveFromMap()
        self.pos = pos

        self.vertices = [((pos + corner)*globals.tile_dimensions).to_int() for corner in self.corners_euclid]

        bl = pos
        tr = bl + self.size
        bl = bl.to_int()
        tr = tr.to_int()
        #self.quad.SetVertices(bl,tr,4)
        self.quad.SetAllVertices(self.vertices, 4)
        for x in xrange(bl.x,tr.x+1):
            for y in xrange(bl.y,tr.y+1):
                self.map.AddActor(Point(x,y),self)

    def TriggerCollide(self,other):
        pass

    def set_angle(self, angle):
        self.angle = angle
        self.corners_polar  = [(p.length(),self.angle + ((1+i*2)*math.pi)/4) for i,p in enumerate(self.corners)]
        cnums = [cmath.rect(r,a) for (r,a) in self.corners_polar]
        self.corners_euclid = [Point(c.real,c.imag) for c in cnums]

    def Update(self,t):
        self.Move(t)

    def Move(self,t):
        if self.last_update == None:
            self.last_update = globals.time
            return
        elapsed = (globals.time - self.last_update)*globals.time_step
        self.last_update = globals.time

        self.move_speed += self.move_direction*elapsed
        if self.move_speed.SquareLength() > self.max_square_speed:
            self.move_speed = self.move_speed.unit_vector() * self.max_speed

        friction = self.move_speed.unit_vector()*0.03*elapsed
        if friction.SquareLength() < self.move_speed.SquareLength():
            #self.move_speed *= 0.7*(1-(elapsed/1000.0))
            self.move_speed -= friction
        else:
            self.move_speed = Point(0,0)


        if self.interacting:
            self.move_speed = Point(0,0)

        amount = self.move_speed * elapsed

        bl = self.pos.to_int()
        tr = (self.pos+self.size).to_int()
        for x in xrange(bl.x,tr.x+1):
            for y in xrange(bl.y,tr.y+1):
                try:
                    for actor in self.map.data[x][y].actors:
                        if actor is self:
                            continue
                        distance = actor.pos - self.pos
                        if distance.SquareLength() < self.radius_square + actor.radius_square:
                            overlap = self.radius + actor.radius - distance.length()
                            adjust = distance.unit_vector()*-overlap
                            #print type(self),self.radius,actor.radius,distance.length(),overlap,adjust
                            amount += adjust*0.1
                            self.TriggerCollide(actor)
                            #We've hit, so move us away from it's centre by the overlap
                except IndexError:
                    pass

        #check each of our four corners
        for corner in self.corners:
            pos = self.pos + corner
            target_x = pos.x + amount.x
            if target_x >= self.map.size.x:
                amount.x = 0
                target_x = pos.x
            elif target_x < 0:
                amount.x = -pos.x
                target_x = 0

            target_tile_x = self.map.data[int(target_x)][int(pos.y)]
            if target_tile_x.type in game_view.TileTypes.Impassable:
                amount.x = 0

            elif (int(target_x),int(pos.y)) in self.map.object_cache:
                obj = self.map.object_cache[int(target_x),int(pos.y)]
                if obj.Contains(Point(target_x,pos.y)):
                    amount.x = 0

            target_y = pos.y + amount.y
            if target_y >= self.map.size.y:
                amount.y = 0
                target_y = pos.y
            elif target_y < 0:
                amount.y = -pos.y
                target_y = 0
            target_tile_y = self.map.data[int(pos.x)][int(target_y)]
            if target_tile_y.type in game_view.TileTypes.Impassable:
                amount.y = 0
            elif (int(pos.x),int(target_y)) in self.map.object_cache:
                obj = self.map.object_cache[int(pos.x),int(target_y)]
                if obj.Contains(Point(pos.x,target_y)):
                    amount.y = 0


        self.SetPos(self.pos + amount)

        if self.interacting:
            diff = self.interacting.pos + (self.interacting.size*0.5) - self.pos
            distance = diff.length()
            if distance > 2.5:
                self.deactivate()

    def GetPos(self):
        return self.pos

    def GetPosCentre(self):
        return self.pos

    def click(self, pos, button):
        pass

    def unclick(self, pos, button):
        pass

    @property
    def screen_pos(self):
        p = (self.pos*globals.tile_dimensions - globals.game_view.viewpos._pos)*globals.scale
        return p