diff --git a/gamedata/assets/shooter/0.png b/gamedata/assets/shooter/0.png new file mode 100644 index 0000000..0fbcef7 Binary files /dev/null and b/gamedata/assets/shooter/0.png differ diff --git a/gamedata/assets/shooter/1.png b/gamedata/assets/shooter/1.png new file mode 100644 index 0000000..189d28b Binary files /dev/null and b/gamedata/assets/shooter/1.png differ diff --git a/gamedata/assets/shooter/2.png b/gamedata/assets/shooter/2.png new file mode 100644 index 0000000..92c419f Binary files /dev/null and b/gamedata/assets/shooter/2.png differ diff --git a/gamedata/assets/shooter/3.png b/gamedata/assets/shooter/3.png new file mode 100644 index 0000000..732ba2d Binary files /dev/null and b/gamedata/assets/shooter/3.png differ diff --git a/gamedata/assets/shooter/4.png b/gamedata/assets/shooter/4.png new file mode 100644 index 0000000..92c419f Binary files /dev/null and b/gamedata/assets/shooter/4.png differ diff --git a/gamedata/assets/shooter/5.png b/gamedata/assets/shooter/5.png new file mode 100644 index 0000000..189d28b Binary files /dev/null and b/gamedata/assets/shooter/5.png differ diff --git a/gamedata/assets/shooter/spike.png b/gamedata/assets/shooter/spike.png new file mode 100644 index 0000000..6a2287a Binary files /dev/null and b/gamedata/assets/shooter/spike.png differ diff --git a/gamedata/objects/ingame/ennemies/ennemy.py b/gamedata/objects/ingame/ennemies/ennemy.py index 6de2427..2d334d2 100644 --- a/gamedata/objects/ingame/ennemies/ennemy.py +++ b/gamedata/objects/ingame/ennemies/ennemy.py @@ -22,6 +22,8 @@ class Ennemy(Movable): self.candie = True self.cancombo = True + self.onscreen = True + self.nodes = nodes self.customvalues = customvalues @@ -32,6 +34,16 @@ class Ennemy(Movable): def step(self): + self.onscreen = True + if self.rect.center[0] < self.game.globals["camerax"]-self.respawnmargin: + self.onscreen = False + if self.rect.center[0] > self.game.globals["camerax"]+self.game.globals["cameraw"]+self.respawnmargin: + self.onscreen = False + if self.rect.center[1] < self.game.globals["cameray"]-self.respawnmargin: + self.onscreen = False + if self.rect.center[1] > self.game.globals["cameray"]+self.game.globals["camerah"]+self.respawnmargin: + self.onscreen = False + if not self.dead: super().step() # Check for collision with player @@ -65,11 +77,7 @@ class Ennemy(Movable): self.player.canfastfall = True self.player.upcombo() elif self.respawn: - - if self.rect.center[0] < self.game.globals["camerax"]-self.respawnmargin: - self.dead = False # Respawn - if self.rect.center[0] > self.game.globals["camerax"]+self.game.globals["cameraw"]+self.respawnmargin: - self.dead = False # Respawn - + if not self.onscreen: + self.dead = False else: self.game.gameloop.delid(self.id) diff --git a/gamedata/objects/ingame/ennemies/projectile.py b/gamedata/objects/ingame/ennemies/projectile.py new file mode 100644 index 0000000..372e9fc --- /dev/null +++ b/gamedata/objects/ingame/ennemies/projectile.py @@ -0,0 +1,34 @@ +from gamedata.objects.ingame.ennemies.ennemy import Ennemy + +class Projectile(Ennemy): + + def __init__(self,*args): + + super().__init__(*args) + + self.flip = self.customvalues["flip"] + self.sprite = self.game.pygame.transform.flip(self.game.sprite_lib["shooter/spike.png"],self.flip,False) + self.rect[2],self.rect[3] = self.sprite.get_size() + self.rect[0]-=(self.rect[2])/2 + self.rect[1]-=(self.rect[3])/2 + + self.spd = 120 + self.candie = False + self.collisions = False + + def step(self): + + movement = -self.spd*self.game.dt + if self.flip: + movement*=-1 + + self.horspd=movement + + super().step() + + if not self.onscreen: + self.game.gameloop.delid(self.id) + + def draw(self): + + self.game.window.blit(self.sprite,[self.rect[0]-self.game.globals["camerax"],self.rect[1]-self.game.globals["cameray"]]) diff --git a/gamedata/objects/ingame/ennemies/shooter.py b/gamedata/objects/ingame/ennemies/shooter.py new file mode 100644 index 0000000..26f6b97 --- /dev/null +++ b/gamedata/objects/ingame/ennemies/shooter.py @@ -0,0 +1,44 @@ +from gamedata.objects.ingame.ennemies.ennemy import Ennemy +from gamedata.objects.ingame.ennemies.projectile import Projectile + +class Shooter(Ennemy): + + def __init__(self,*args): + + super().__init__(*args) + + self.sprites = self.game.getSpriteDir("shooter/") + self.projectilesprite = self.game.getSpriteDir("shooter/spike.png") + self.sprite = self.sprites[0] + self.spriteindex = 0 + self.animspeed = 6 + + self.rect[2],self.rect[3] = self.sprite.get_size() + + self.rect[0]+=(16-self.rect[2])/2 + self.rect[1]+=(16-self.rect[3])/2 + + self.shoottimer = self.game.lib.Timer(2) + + self.candie = False + + def step(self): + + if self.spriteindex == 0: + self.sprite = self.sprites[0] + if self.shoottimer.tick(self.game.dt): + self.spriteindex+=self.animspeed*self.game.dt + # Shoot + p = Projectile(self.rect.center[0],self.rect.center[1],self.game,self.nodes,self.customvalues) + self.game.gameloop.summon(p) + else: + self.spriteindex+=self.animspeed*self.game.dt + self.sprite = self.sprites[int(self.spriteindex)%len(self.sprites)] + if int(self.spriteindex)>=len(self.sprites): + self.spriteindex = 0 + + super().step() + + def draw(self): + sprite = self.game.pygame.transform.flip(self.sprite,self.customvalues["flip"],False) + self.game.window.blit(sprite,(self.rect[0]-self.game.globals["camerax"],self.rect[1]-self.game.globals["cameray"])) diff --git a/gamedata/objects/ingame/ennemies/squid.py b/gamedata/objects/ingame/ennemies/squid.py index 11ccb60..f104fb0 100644 --- a/gamedata/objects/ingame/ennemies/squid.py +++ b/gamedata/objects/ingame/ennemies/squid.py @@ -12,6 +12,8 @@ class Squid(Ennemy): self.rect[2],self.rect[3] = self.deadsprite.get_size() + self.flip = False + self.speed = 40 self.spriteindex = 0 @@ -54,6 +56,9 @@ class Squid(Ennemy): self.spriteindex += self.speed*self.game.dt*0.15 + if self.player: + self.flip = self.player.rect.center[0]>self.rect.center[0] + super().step() # Actually move @@ -63,4 +68,5 @@ class Squid(Ennemy): self.sprite = self.sprites[int(self.spriteindex)%len(self.sprites)] if self.fallingway>0: self.sprite = self.sprites[1] - self.game.window.blit(self.sprite,[self.rect[0]-self.game.globals["camerax"],self.rect[1]-self.game.globals["cameray"]]) + sprite = self.game.pygame.transform.flip(self.sprite,self.flip,False) + self.game.window.blit(sprite,[self.rect[0]-self.game.globals["camerax"],self.rect[1]-self.game.globals["cameray"]]) diff --git a/gamedata/objects/ingame/movable.py b/gamedata/objects/ingame/movable.py index e698034..ee0841b 100644 --- a/gamedata/objects/ingame/movable.py +++ b/gamedata/objects/ingame/movable.py @@ -21,55 +21,62 @@ class Movable(BaseObject): self.hrest = 0 self.vrest = 0 + self.collisions = True + def step(self): - self.move(self.horspd,self.verspd) + self.move(self.horspd,self.verspd,collisions=self.collisions) - def move(self,movex,movey): + def move(self,movex,movey,collisions = True): hstoped = False hor = int(movex+self.hrest) self.hrest = movex+self.hrest-hor - while abs(hor)>0: - if hor>=self.tilew: - diffx = self.tilew - elif hor<=-self.tilew: - diffx = -self.tilew - else: - diffx = hor - rect = self.checkcollisions(diffx,0) - if rect: - hor = 0 - self.hrest = 0 - hstopped = True - if diffx>0: - self.rect.right = rect.left + if collisions: + while abs(hor)>0: + if hor>=self.tilew: + diffx = self.tilew + elif hor<=-self.tilew: + diffx = -self.tilew else: - self.rect.left = rect.right - else: - hor-=diffx - self.rect[0]+=diffx + diffx = hor + rect = self.checkcollisions(diffx,0) + if rect: + hor = 0 + self.hrest = 0 + hstopped = True + if diffx>0: + self.rect.right = rect.left + else: + self.rect.left = rect.right + else: + hor-=diffx + self.rect[0]+=diffx vstoped = False ver = int(movey+self.vrest) self.vrest = movey+self.vrest-ver - while abs(ver)>0: - if abs(ver)>self.tileh: - diffy = self.tileh*abs(ver)/ver - else: - diffy = ver - rect = self.checkcollisions(0,diffy) - if rect: - vstopped = True - ver = 0 - self.vrest = 0 - if diffy>0: - self.rect.bottom = rect.top + if collisions: + while abs(ver)>0: + if abs(ver)>self.tileh: + diffy = self.tileh*abs(ver)/ver else: - self.rect.top = rect.bottom - else: - ver-=diffy - self.rect[1]+=diffy + diffy = ver + rect = self.checkcollisions(0,diffy) + if rect: + vstopped = True + ver = 0 + self.vrest = 0 + if diffy>0: + self.rect.bottom = rect.top + else: + self.rect.top = rect.bottom + else: + ver-=diffy + self.rect[1]+=diffy + else: + self.rect[0]+=hor + self.rect[1]+=ver def checkcollisions(self,offx,offy,classic=True,semi=True): temprect = self.rect.copy() diff --git a/gamedata/objects/ingame/tileset.py b/gamedata/objects/ingame/tileset.py index eb4ff96..b00caee 100644 --- a/gamedata/objects/ingame/tileset.py +++ b/gamedata/objects/ingame/tileset.py @@ -6,6 +6,7 @@ from gamedata.objects.ingame.ennemies.spring import Spring from gamedata.objects.ingame.ennemies.waterchange import WaterChange from gamedata.objects.ingame.ennemies.trashbag import TrashBag from gamedata.objects.ingame.ennemies.squid import Squid +from gamedata.objects.ingame.ennemies.shooter import Shooter from gamedata.objects.ingame.endflag import EndFlag from gamedata.objects.levels import Levels from gamedata.objects.ripple import Ripple @@ -84,7 +85,7 @@ class TilesetRenderer(BaseObject): self.bgm.set_volume(self.game.globals["bgmvolume"]) self.bgm.play(-1) spawnlists = {"Spawns":self.spawns} - ennemies = {"Robot":Robot,"Crate":Crate,"Balloon":Balloon,"Spring":Spring,"WaterChange":WaterChange,"Levels":Levels,"End":EndFlag,"TrashBag":TrashBag,"Ripple":Ripple,"Squid":Squid} + ennemies = {"Robot":Robot,"Crate":Crate,"Balloon":Balloon,"Spring":Spring,"WaterChange":WaterChange,"Levels":Levels,"End":EndFlag,"TrashBag":TrashBag,"Ripple":Ripple,"Squid":Squid,"Shooter":Shooter} self.queue = [] # For spawning ennemies after beeing initialized if "layers" in json.keys() and type(json["layers"]).__name__=="list": solidlayer = False