From a773aeb4a6a64d65d5ca2ecc903bd2708f98e571 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Thu, 25 Nov 2021 15:11:23 +0100 Subject: [PATCH] Added shooter ennemy --- gamedata/assets/shooter/0.png | Bin 0 -> 846 bytes gamedata/assets/shooter/1.png | Bin 0 -> 839 bytes gamedata/assets/shooter/2.png | Bin 0 -> 820 bytes gamedata/assets/shooter/3.png | Bin 0 -> 812 bytes gamedata/assets/shooter/4.png | Bin 0 -> 820 bytes gamedata/assets/shooter/5.png | Bin 0 -> 839 bytes gamedata/assets/shooter/spike.png | Bin 0 -> 663 bytes gamedata/objects/ingame/ennemies/ennemy.py | 20 +++-- .../objects/ingame/ennemies/projectile.py | 34 ++++++++ gamedata/objects/ingame/ennemies/shooter.py | 44 ++++++++++ gamedata/objects/ingame/ennemies/squid.py | 8 +- gamedata/objects/ingame/movable.py | 79 ++++++++++-------- gamedata/objects/ingame/tileset.py | 3 +- 13 files changed, 144 insertions(+), 44 deletions(-) create mode 100644 gamedata/assets/shooter/0.png create mode 100644 gamedata/assets/shooter/1.png create mode 100644 gamedata/assets/shooter/2.png create mode 100644 gamedata/assets/shooter/3.png create mode 100644 gamedata/assets/shooter/4.png create mode 100644 gamedata/assets/shooter/5.png create mode 100644 gamedata/assets/shooter/spike.png create mode 100644 gamedata/objects/ingame/ennemies/projectile.py create mode 100644 gamedata/objects/ingame/ennemies/shooter.py diff --git a/gamedata/assets/shooter/0.png b/gamedata/assets/shooter/0.png new file mode 100644 index 0000000000000000000000000000000000000000..0fbcef7e245966d7650e5059e8e4e062526525ec GIT binary patch literal 846 zcmV-U1F`&xP)EX>4Tx04R}tkv&MmKpe$iQ^l`V2Ro=ZWT;LSL`5963Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2zhIPS;0dyl(!fKV$k&1xG5G`(yl zVo@=bUKKlD(Stz*(TgsbS;m|s#o;-=?&0I>U4&nDK!8MxA${!$H?`6RvC z)WSzV-!^b@-PDvl;Bp5Tcrs*Db|gPdA)5u>&*+=dK>sb!z2^4T*vIJukfg5SH^9Lm zFq)(6b&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00AaRL_t(I%e9m-OT;h~fWH*yF5SF?F2%|54$)CE*}YLzha-0yw4w zARGjo$EReIT&;E1;)9yZF(o>m54WwoCS^iq6eTHT-{T{>n%fmnF-b2Rs`*)bL{UzK z(C;WpQtr|dRWTdAaHu4WRRi$7j#X03zH0sSe+?;#lC&1nkFwAcX?kxq$x^=&mi4jy Y013Z|`>3%2_5c6?07*qoM6N<$g6pYpO#lD@ literal 0 HcmV?d00001 diff --git a/gamedata/assets/shooter/1.png b/gamedata/assets/shooter/1.png new file mode 100644 index 0000000000000000000000000000000000000000..189d28bf6f2644ff050f5b09a41a430b8500e912 GIT binary patch literal 839 zcmV-N1GxN&P)EX>4Tx04R}tkv&MmKpe$iQ^l`V2Ro=ZWT;LSL`5963Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2zhIPS;0dyl(!fKV$k&1xG5G`(yl zVo@=bUKKlD(Stz*(TgsbS;m|s#o;-=?&0I>U4&nDK!8MxA${!$H?`6RvC z)WSzV-!^b@-PDvl;Bp5Tcrs*Db|gPdA)5u>&*+=dK>sb!z2^4T*vIJukfg5SH^9Lm zFq)(6b&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00AFKL_t(I%VS_50Oa{({xeVt9-8=+m;e^86zP>VBnLfFvCKxXoiQMo-mSR5I)wuoPmLXfgw3!C5rg*lRHsd#)uv+w;C4_6{BkPaVTNN zglq^5+;OmC*#GYZ!yN}JI7T;wfq?-fHkr^3VPIfj@UmB7U|?Wic)V{NgO|MuoR1B_ z3}b}3D7SGE!zWW=xYuB|GB7Y;c-O?s8_u3wpU3d<(-TINFv@M5#IR{nC(al{Hwva;U|^6Jmd0zy!?#Z{(i80xBn;#>PQnmF_6kv11Y3T?X9!h`5e8}%YydTfiumn> RSW^H1002ovPDHLkV1in5UV#7r literal 0 HcmV?d00001 diff --git a/gamedata/assets/shooter/2.png b/gamedata/assets/shooter/2.png new file mode 100644 index 0000000000000000000000000000000000000000..92c419f0a13bb3c4779014a95db923f644650840 GIT binary patch literal 820 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 RSW^H1002ovPDHLkV1in5UV#7r literal 0 HcmV?d00001 diff --git a/gamedata/assets/shooter/spike.png b/gamedata/assets/shooter/spike.png new file mode 100644 index 0000000000000000000000000000000000000000..6a2287ad62f81dc73d319635bef612beec683c98 GIT binary patch literal 663 zcmV;I0%-k-P)EX>4Tx04R}tkv&MmKpe$iQ^l`V2Ro=ZWT;LSL`5963Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2zhIPS;0dyl(!fKV$k&1xG5G`(yl zVo@=bUKKlD(Stz*(TgsbS;m|s#o;-=?&0I>U4&nDK!8MxA${!$H?`6RvC z)WSzV-!^b@-PDvl;Bp5Tcrs*Db|gPdA)5u>&*+=dK>sb!z2^4T*vIJukfg5SH^9Lm zFq)(6b&q#VGd000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{003`EL_t&-(_>&D0Oa{({>$^p{AXZbU|__h0LIR3oW#Ju zz`!uMK97L~n}Tci=P^uQ^aaBZMwlX83K$p|7|v|l%5ePTP6n2TpPn!>FfcG^DJEf9 xeP-KMRFet0+0xvdfq{X6;rPj&3=E`%1^{!iCFhNxzf%AJ002ovPDHLkV1l|T77hRa literal 0 HcmV?d00001 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