From 5a2dbcce613f232f109faf7715753e2556f77c4a Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 3 Apr 2021 19:28:44 +0300 Subject: [PATCH] Test cacti sprites --- Player.py | 81 ++++++++++++++++++++++++----------------------- StandingEnemy.py | 78 ++++++++++++++++++++++++++++++++++++++++----- data/senemy.png | Bin 0 -> 2046 bytes data/senemy.xcf | Bin 0 -> 11610 bytes 4 files changed, 111 insertions(+), 48 deletions(-) create mode 100644 data/senemy.png create mode 100644 data/senemy.xcf diff --git a/Player.py b/Player.py index add853f..b096305 100644 --- a/Player.py +++ b/Player.py @@ -9,45 +9,46 @@ import os class Player(pygame.sprite.Sprite): + imgDir = os.path.join(os.path.dirname(__file__), 'data') + playerImage = pygame.image.load(os.path.join(imgDir, 'player.png'))#.convert() + walkImages = ( + pygame.transform.scale(playerImage.subsurface((0, 0, 16, 24)), (64, 98)), + pygame.transform.scale(playerImage.subsurface((16, 0, 16, 24)), (64, 98)), + pygame.transform.scale(playerImage.subsurface((32, 0, 16, 24)), (64, 98)), + pygame.transform.scale(playerImage.subsurface((16, 0, 16, 24)), (64, 98)), + ) + + upImages = ( + pygame.transform.scale(playerImage.subsurface((0, 24, 16, 24)), (64, 98)), + pygame.transform.scale(playerImage.subsurface((16, 24, 16, 24)), (64, 98)), + pygame.transform.scale(playerImage.subsurface((32, 24, 16, 24)), (64, 98)), + ) + + downImages = ( + pygame.transform.scale(playerImage.subsurface((0, 48, 16, 24)), (64, 98)), + pygame.transform.scale(playerImage.subsurface((16, 48, 16, 24)), (64, 98)), + pygame.transform.scale(playerImage.subsurface((32, 48, 16, 24)), (64, 98)), + ) + + crouchImages = ( + pygame.transform.scale(playerImage.subsurface((0, 72, 16, 16)), (64, 64)), + pygame.transform.scale(playerImage.subsurface((16, 72, 16, 16)), (64, 64)), + ) + + + for array in (walkImages, upImages, downImages, crouchImages): + for image in array: + image.set_colorkey((255,0,255)) + def __init__(self): - self.imgDir = os.path.join(os.path.dirname(__file__), 'data') + pygame.sprite.Sprite.__init__(self) - playerImage = pygame.image.load(os.path.join(self.imgDir, 'player.png')).convert() - - self.walkImages = ( - pygame.transform.scale(playerImage.subsurface((0, 0, 16, 24)), (64, 98)), - pygame.transform.scale(playerImage.subsurface((16, 0, 16, 24)), (64, 98)), - pygame.transform.scale(playerImage.subsurface((32, 0, 16, 24)), (64, 98)), - pygame.transform.scale(playerImage.subsurface((16, 0, 16, 24)), (64, 98)), - ) self.currentWalkImage = 0 - - self.upImages = ( - pygame.transform.scale(playerImage.subsurface((0, 24, 16, 24)), (64, 98)), - pygame.transform.scale(playerImage.subsurface((16, 24, 16, 24)), (64, 98)), - pygame.transform.scale(playerImage.subsurface((32, 24, 16, 24)), (64, 98)), - ) self.currentUpImage = 0 - - self.downImages = ( - pygame.transform.scale(playerImage.subsurface((0, 48, 16, 24)), (64, 98)), - pygame.transform.scale(playerImage.subsurface((16, 48, 16, 24)), (64, 98)), - pygame.transform.scale(playerImage.subsurface((32, 48, 16, 24)), (64, 98)), - ) self.currentDownImage = 0 - - self.crouchImages = ( - pygame.transform.scale(playerImage.subsurface((0, 72, 16, 16)), (64, 64)), - pygame.transform.scale(playerImage.subsurface((16, 72, 16, 16)), (64, 64)), - ) self.currentCrouchImage = 0 - for array in (self.walkImages, self.upImages, self.downImages, self.crouchImages): - for image in array: - image.set_colorkey((255,0,255)) - - pygame.sprite.Sprite.__init__(self) - self.image = self.walkImages[self.currentWalkImage] + self.image = Player.downImages[self.currentDownImage] self.rect = self.image.get_rect() self.rect.center = (100, 400) @@ -138,22 +139,22 @@ class Player(pygame.sprite.Sprite): if self.isOnFloor: if self.isCrouching: self.currentCrouchImage += 1 - if self.currentCrouchImage >= len(self.crouchImages): + if self.currentCrouchImage >= len(Player.crouchImages): self.currentCrouchImage = 0 - self.image = self.crouchImages[self.currentCrouchImage] + self.image = Player.crouchImages[self.currentCrouchImage] else: self.currentWalkImage += 1 - if self.currentWalkImage >= len(self.walkImages): + if self.currentWalkImage >= len(Player.walkImages): self.currentWalkImage = 0 - self.image = self.walkImages[self.currentWalkImage] + self.image = Player.walkImages[self.currentWalkImage] elif self.isJumping: self.currentUpImage += 1 - if self.currentUpImage >= len(self.upImages): + if self.currentUpImage >= len(Player.upImages): self.currentUpImage = 0 - self.image = self.upImages[self.currentUpImage] + self.image = Player.upImages[self.currentUpImage] else: self.currentDownImage += 1 - if self.currentDownImage >= len(self.downImages): + if self.currentDownImage >= len(Player.downImages): self.currentDownImage = 0 - self.image = self.downImages[self.currentDownImage] + self.image = Player.downImages[self.currentDownImage] self.updateCount = 0 diff --git a/StandingEnemy.py b/StandingEnemy.py index adda10f..66fc0e9 100644 --- a/StandingEnemy.py +++ b/StandingEnemy.py @@ -5,23 +5,85 @@ Standing enemy entity class import pygame import random +import os + from Enemy import Enemy class StandingEnemy(Enemy): + imgDir = os.path.join(os.path.dirname(__file__), 'data') + senemyImage = pygame.image.load(os.path.join(imgDir, 'senemy.png'))#.convert() + images = ( + ( + pygame.transform.scale(senemyImage.subsurface((0, 0, 8, 24)), (32, 98)), + pygame.transform.scale(senemyImage.subsurface((8, 0, 8, 24)), (32, 98)), + pygame.transform.scale(senemyImage.subsurface((16, 0, 8, 24)), (32, 98)), + pygame.transform.scale(senemyImage.subsurface((24, 0, 8, 24)), (32, 98)), + pygame.transform.scale(senemyImage.subsurface((32, 0, 8, 24)), (32, 98)), + pygame.transform.scale(senemyImage.subsurface((40, 0, 8, 24)), (32, 98)), + ), + ( + pygame.transform.scale(senemyImage.subsurface((0, 24, 8, 16)), (32, 64)), + pygame.transform.scale(senemyImage.subsurface((8, 24, 8, 16)), (32, 64)), + pygame.transform.scale(senemyImage.subsurface((16, 24, 8, 16)), (32, 64)), + pygame.transform.scale(senemyImage.subsurface((24, 24, 8, 16)), (32, 64)), + pygame.transform.scale(senemyImage.subsurface((32, 24, 8, 16)), (32, 64)), + pygame.transform.scale(senemyImage.subsurface((40, 24, 8, 16)), (32, 64)), + ), + ( + pygame.transform.scale(senemyImage.subsurface((0, 40, 16, 16)), (64, 64)), + pygame.transform.scale(senemyImage.subsurface((16, 40, 16, 16)), (64, 64)), + pygame.transform.scale(senemyImage.subsurface((32, 40, 16, 16)), (64, 64)), + pygame.transform.scale(senemyImage.subsurface((0, 56, 16, 16)), (64, 64)), + pygame.transform.scale(senemyImage.subsurface((16, 56, 16, 16)), (64, 64)), + pygame.transform.scale(senemyImage.subsurface((32, 56, 16, 16)), (64, 64)), + ), + ( + pygame.transform.scale(senemyImage.subsurface((0, 72, 8, 8)), (32, 32)), + pygame.transform.scale(senemyImage.subsurface((8, 72, 8, 8)), (32, 32)), + pygame.transform.scale(senemyImage.subsurface((16, 72, 8, 8)), (32, 32)), + pygame.transform.scale(senemyImage.subsurface((24, 72, 8, 8)), (32, 32)), + pygame.transform.scale(senemyImage.subsurface((32, 72, 8, 8)), (32, 32)), + pygame.transform.scale(senemyImage.subsurface((40, 72, 8, 8)), (32, 32)), + ), + ( + pygame.transform.scale(senemyImage.subsurface((0, 80, 16, 8)), (64, 32)), + pygame.transform.scale(senemyImage.subsurface((16, 80, 16, 8)), (64, 32)), + pygame.transform.scale(senemyImage.subsurface((32, 80, 16, 8)), (64, 32)), + pygame.transform.scale(senemyImage.subsurface((0, 88, 16, 8)), (64, 32)), + pygame.transform.scale(senemyImage.subsurface((16, 88, 16, 8)), (64, 32)), + pygame.transform.scale(senemyImage.subsurface((32, 88, 16, 8)), (64, 32)), + ), + ( + pygame.transform.scale(senemyImage.subsurface((0, 96, 24, 8)), (98, 32)), + pygame.transform.scale(senemyImage.subsurface((24, 96, 24, 8)), (98, 32)), + pygame.transform.scale(senemyImage.subsurface((0, 104, 24, 8)), (98, 32)), + pygame.transform.scale(senemyImage.subsurface((24, 104, 24, 8)), (98, 32)), + pygame.transform.scale(senemyImage.subsurface((0, 112, 24, 8)), (98, 32)), + pygame.transform.scale(senemyImage.subsurface((24, 112, 24, 8)), (98, 32)), + ), + ) + def __init__(self, mainGameClass): Enemy.__init__(self, mainGameClass) - self.subtype = random.randint(1, 5) + for array in self.images: + for image in array: + image.set_colorkey((255,0,255)) - if self.subtype == 1: self.image = pygame.Surface((25, 75)) - elif self.subtype == 2: self.image = pygame.Surface((25, 25)) - elif self.subtype == 3: self.image = pygame.Surface((75, 25)) - elif self.subtype == 4: self.image = pygame.Surface((50, 25)) - elif self.subtype == 5: self.image = pygame.Surface((50, 50)) - else: self.image = pygame.Surface((25, 50)) - self.image.fill((0, 153, 0)) + self.subtype = random.randint(1, len(StandingEnemy.images)) + + self.image = random.choice(StandingEnemy.images[self.subtype-1]) + + # if self.subtype == 1: self.image = pygame.Surface((32, 96)) + # elif self.subtype == 2: self.image = pygame.Surface((32, 64)) + # elif self.subtype == 3: self.image = pygame.Surface((64, 64)) + # elif self.subtype == 4: self.image = pygame.Surface((32, 32)) + # elif self.subtype == 5: self.image = pygame.Surface((64, 32)) + # else: self.image = pygame.Surface((96, 32)) + + # self.image.fill((0, 153, 0)) self.rect = self.image.get_rect() self.height -= self.rect.height/2 diff --git a/data/senemy.png b/data/senemy.png new file mode 100644 index 0000000000000000000000000000000000000000..dfdc17f491364812cf5d0057e56805f9a8199efc GIT binary patch literal 2046 zcmeAS@N?(olHy`uVBq!ia0y~yU@%}{V5s0=Vqjpf&VF{0fq{Xuz$3Dlfk96hgc&QA z+LtjfFtC?+`ns||WnmVOlDNeG!ij-_L9)a(qQp5rH#aq}gu%HeHL)Z$MWH;iBtya7 z(>EZzkx!g~fxW`h#WAGf*4t>`ENO3nd6{WTby}GtyBZF5|KPB6QuraT?|`+N-U8eb8N z|62F@lVJ7QcMprVa%)a!&tCj##VIkdH7|C{MZZYj{^!@nZ@)fX^9wxvQ9VNXt8#qz z+Y{g3O?#ey+^j=v(k=eadmcXhmzgzHqH*i*y!+*Qr|kLtWgc&lwHMpD`PbXi%Wp1m zem%u1;AP$YW_>^P0HycVpME}HzyI!cSMBBN7Qgj=x8&U^^`{fXUkjvYd^6+veXKL7 zvfDS*`Dkgult~u(EGvWd?TGRFG}XqgWKGc$QPNSDyX?!a z4?g)J>;>#)Yqw97k?e}@GLv|d&taLC^P_X2nL&B^ZLWg1yZ8RtY4>CG>EGMWoGzOF z$fTo4R%`p#%F1N>6RiKdkGA~sewns)+t03D57V|TWAR_L;m)}oxA>>_Ypj|5z*A(w z>xHIICY2qN@Rh2vU@2^LV&47ZW6^(?0)?|VJKts8;4i$E!O?!`-Mej{u0?t5E_*ml z{cpfj{vM8fx`pl;*NhlvC+xUgHgm6JWJLbWnnfmQQ#8yr#cs+k+*$H7(IjP4k;V3F zcjJzib-tO%zssxj$!_OuDN>tl7n<<3O;Z&N*{bl7@%V!4?deT-PcSQ;?@e1@7P5JY zp!_DCU`uBqYr%(EAI)0$&sn8hd3`)uO5vgNrFlBH@8+(Ik-puTd2-?3_m6C!pKgC4 zxytTg)Ew^z>z>#iS1@I@^fLMO^>OZgsZhbsr&vq9XFpNj>%G`S!)0x$=8fa>@%L-1 z)`u=(R=lokw!Fz8$jM#)k`hng^dLp~O^I(lX(@VowZ-`QuJQ`i&A76@GcbU8wcv`Q zQ+%hp{WG}gSzq^aUXAa!`AN?=?ub$Ae903TVehh2q zov*GOcO=>G#=oAQ6SNnrygB}qpCd%jc;nN>^8yc?Zgh!$^?vDI-NN|Dl1F~M>`YT% zu$SqVtY=B!cY3$Rn*E2y#FgP-cq@?!`f}r91AwRpeYlrqTBms&7br{q9gw9{DkMX zB*ND{=r2_LwDN}OY^{AR)@g<6DQ`Da_S`a=y>jPfUENK-MU!6bYg%!5TB)vHzsT}y zcO^Xi-+5-;zjFD(L`N2tV9&>oiZrh!S9323?K6m4`0D4{=+~><^-gE*yl-Ij`p1X2 z#oo&tR~pKf9xN^_PTl-w*|-1oc2i>bOE`I?KWK{>E|CoO*QpM5GjJ$4J~wdP@0}qR z7fQU_v8`r-LRUoN>wb-ECnR?7Udv|hw(qHmS%tfo-7}ME({C1UynFW=D^pe){|@1c zcPF+AvnXjTX1-iFd0Dp}cSp&GfSe6xwLiYyG&RxkpWt>mCQ9Yp?|(0@%T@9{!`{UPPc{>o4EZ0sw^YC6SYypg@Mz-I;bM zX;)=ecFZ@G&$2u^>&VPM@AIap3Ep0`;X?eR1Vi~vhMD_?`aPHMJi4+@a8*RXjp&HO z2QIEZRV~0RHr+e?mja)ps=>chk-ecVLKbyfug{H2iQ9AbOVNLqsP#+bk8YCOquA4B z(Nr;IPI9NMfv=SOG>5$|L7Tg0ukN_)5!co`+5PjHW8d2Myzlq3ZRHP5eX1pV>Zycw zgVo>Nx>m&xawltQmG>%?Z%cgmMSi1Xb;FhYj!TlDxK@b^6J?4G94Saf)i82PuTe`77ESU z9JSk0mR0%CjTZ{uzl3BKHEVXuU*evrC(v|rv9|K+LYCyL`93+f?C+`FTyP^L(M^5Y zedi#X$9vWY9*LT?W9HvE`h0W6<-IZjm}b0_dhY%u(0*~fw(E={|Lb?_y92QOtp*ft=M}8e(>bHXMs~Z(qIq_y>u=r9yTkg~h2W=ZFNIJozJFQS!MLui{_n Xlx>f?>-n02fq}u()z4*}Q$iB}o|4zY literal 0 HcmV?d00001 diff --git a/data/senemy.xcf b/data/senemy.xcf new file mode 100644 index 0000000000000000000000000000000000000000..3766c54b09374b03d19752a20708601e6e4e2958 GIT binary patch literal 11610 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 VbY@5l!P=vs1<(u(3^t&Zp8#Zn#l8Rl literal 0 HcmV?d00001