from gamedata.objects.base import BaseObject import random,math class Lemming(BaseObject): def __init__(self,x,y,game,speedmargin=5): super().__init__(x,y,game) self.direction = random.randint(0,360) self.radius = 30 # Radius in which the mouse can click self.basespeed = 50+random.randint(-speedmargin,speedmargin) # Speed that he normally walks by self.normalspeed = self.basespeed # Speed "objective" self.speed = 0 # Current speed, leaning towards objective speed self.selected = False # If beeing redirected self.cachedrel = [] # Storing relative movement of mouse self.cachedrelsize = 10 self.mincachedsize = 5 # Used for movement self.restx = 0 self.resty = 0 # Sprites self.orientations = ["Right","Left","Left","Right"] self.sprites = {} for i in self.orientations: self.sprites[i] = game.getSpriteDir("lemmings/"+i+"/") self.spriteindex = 0 self.animspeed = 0.2 def step(self): # Lean towards the normal speed if self.selected: self.normalspeed = 0 else: self.normalspeed = self.basespeed self.speed += (self.normalspeed-self.speed)*self.game.dt*3 # Getting x and y velocity diffx = math.cos(math.radians(self.direction))*self.speed diffy = math.sin(math.radians(self.direction))*self.speed self.move(diffx*self.game.dt,diffy*self.game.dt) # Mouse selection mouse=self.game.inputs["mouse"] distance = math.sqrt((mouse["campos"][0]-self.rect.center[0])**2+(mouse["campos"][1]-self.rect.center[1])**2) if self.selected: # Caching mouse relative movement self.cachedrel.append(mouse["rel"]) if len(self.cachedrel)>self.cachedrelsize: self.cachedrel.pop(0) # Releasing it if mouse["click"]==0 or distance>4*self.radius: self.launch() if self.game.inputs["mouse"]["click"]==1: if distance<=self.radius: self.selected = True # Animation self.spriteindex+=self.game.dt*self.animspeed*self.speed def launch(self): # Launch itself in the mouse direction if len(self.cachedrel)>self.mincachedsize: averagerel = [sum([x[i] for x in self.cachedrel])/len(self.cachedrel) for i in range(2)] self.direction = math.degrees(math.atan2(averagerel[1],averagerel[0])) self.speed = self.basespeed*2 self.cachedrel = [] self.selected = False def move(self,x,y): # Remember the digits, pygame rects only move with integers velx = x+self.restx vely = y+self.resty self.restx = velx-int(velx) self.resty = vely-int(vely) self.rect[0]+=int(velx) self.rect[1]+=int(vely) def draw(self): orientation = self.orientations[int(self.direction%360/361*4)] sprites = self.sprites[orientation] self.game.lib.drawcenter(self.game,sprites[int(self.spriteindex)%len(sprites)],self.rect.center[0],self.rect.center[1])