From 08bd3e9517b0f3e886877034f9aff26fbe71acb7 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Mon, 29 Mar 2021 20:08:22 +0300 Subject: [PATCH 01/35] Updated cloud system --- Cloud.py | 15 +++++++++------ Drakora.pyw | 42 ++++++++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/Cloud.py b/Cloud.py index a532a2d..b327d3f 100644 --- a/Cloud.py +++ b/Cloud.py @@ -8,19 +8,22 @@ import random class Cloud(pygame.sprite.Sprite): - def __init__(self, mainGameClass): + def __init__(self, mainGameClass, cloudType): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((random.randint(150, 350), random.randint(50, 150))) - self.image.fill((random.randint(235, 255), - random.randint(235, 255), - random.randint(235, 255))) + + color = 255 - 15 * (3-cloudType) + self.image.fill((color, color, color)) + self.rect = self.image.get_rect() self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, mainGameClass.getScreenHeight()/2 - random.randint(100, - mainGameClass.getScreenHeight()/2-100)) - self.speed = random.randint(1, 3)*mainGameClass.getGameSpeed() / 6 + mainGameClass.getScreenHeight()/2-100)+50*(2-cloudType)) + self.speed = cloudType*mainGameClass.getGameSpeed() / 6 + + self.__doubleX = float(self.rect.x) diff --git a/Drakora.pyw b/Drakora.pyw index 1e4ae6b..0275f47 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -51,7 +51,7 @@ class Drakora(): if self.player: self.player.kill() self.player = Player() - self.sprites.add(self.player) + self.players.add(self.player) self.__score = 0 self.isGameOver = False @@ -68,34 +68,36 @@ class Drakora(): def __init__(self): + random.seed() + pygame.init() + self.screenSize = (800, 600) + self.screen = pygame.display.set_mode(self.screenSize) + pygame.display.set_caption('Drakora') + self.clock = pygame.time.Clock() + self.buttonsPause = (pygame.K_p,) self.buttonsQuit = (pygame.K_F10,) self.buttonsNewGame = (pygame.K_RETURN,) - self.screenSize = (800, 600) self.targetFps = 120 self.floorHeight = 50 + self.players = pygame.sprite.Group() self.floors = pygame.sprite.Group() self.enemies = pygame.sprite.Group() - self.clouds = pygame.sprite.Group() + self.cloudGroups = (pygame.sprite.Group(), + pygame.sprite.Group(), + pygame.sprite.Group(),) self.player = None + self.floors.add(Floor(self)) + self.speedUpRate = 25 self.godmodeCount = 0 self.isGodmode = False - random.seed() - pygame.init() - self.screen = pygame.display.set_mode(self.screenSize) - pygame.display.set_caption('Drakora') - self.clock = pygame.time.Clock() - - self.sprites = pygame.sprite.Group() - self.floors.add(Floor(self)) - self.sprites.add(self.floors) font = pygame.font.match_font('liberation mono') self.fontScore = pygame.font.Font(font, 32) @@ -130,7 +132,9 @@ class Drakora(): def render(self): self.screen.fill((102, 153, 255)) - self.sprites.draw(self.screen) + for cloudGroup in self.cloudGroups: cloudGroup.draw(self.screen) + self.enemies.draw(self.screen) + self.players.draw(self.screen) self.floors.draw(self.screen) self.renderText('%d'%(self.__score), @@ -216,14 +220,17 @@ class Drakora(): self.doCheats() if not self.isGameOver and not self.isPaused: - self.sprites.update() + for cloudGroup in self.cloudGroups: cloudGroup.update() + self.enemies.update() + self.players.update() + self.floors.update() self.enemyCD -= self.__gameSpeed if random.randint(1, 200) == 1: - cloud = Cloud(self) - self.clouds.add(cloud) - self.sprites.add(cloud) + cloudType = random.randint(0, 2) + cloud = Cloud(self, cloudType) + self.cloudGroups[cloudType].add(cloud) if self.enemyCD <= 0: self.enemyChance += (1/self.targetFps) * self.enemyChance/8 @@ -252,7 +259,6 @@ class Drakora(): self.enemyCD = self.getNextEnemyCD() self.enemies.add(enemy) - self.sprites.add(enemy) self.collideCheck() From f97c8e6198cde928a00657fbeb32d39f1acfb142 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Mon, 29 Mar 2021 20:40:11 +0300 Subject: [PATCH 02/35] Cloud fixed on new game --- Drakora.pyw | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Drakora.pyw b/Drakora.pyw index 0275f47..1912296 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -48,6 +48,10 @@ class Drakora(): for enemy in self.enemies: enemy.kill() + for cloudGroup in self.cloudGroups: + for cloud in cloudGroup: + cloud.kill() + if self.player: self.player.kill() self.player = Player() From 8ba29ab9e54399f2273a57ab02a30a358c7c23ca Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Fri, 2 Apr 2021 00:06:40 +0300 Subject: [PATCH 03/35] Jump update (step 1) --- Player.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Player.py b/Player.py index 2e89c71..87d5de7 100644 --- a/Player.py +++ b/Player.py @@ -4,6 +4,7 @@ Player entity class import pygame +import math class Player(pygame.sprite.Sprite): @@ -57,7 +58,7 @@ class Player(pygame.sprite.Sprite): def update(self): if not self.speed: self.rect.y += 1 - self.speed += 0.09 * self.gameSpeed + self.speed += 0.07 * self.gameSpeed self.rect.y += self.speed if not self.isDownJump: @@ -80,9 +81,9 @@ class Player(pygame.sprite.Sprite): self.standup() if self.isJumping: - if self.isDownJump and self.hoverCount < 8: - self.speed -= (1 - self.speed/(15+ - self.hoverCount*3)) * self.gameSpeed/2 + maxHoverCount = 30 + if self.isDownJump and self.hoverCount < maxHoverCount: + self.speed -= self.gameSpeed/10 * (math.sin(2*math.pi*self.hoverCount/(2*maxHoverCount)+math.pi/2)+1)/2.5+0.2 self.hoverCount += 1 else: From f1a7a7b61706fae67c7c0b89c3eb1ffc090a07d3 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Fri, 2 Apr 2021 11:45:15 +0300 Subject: [PATCH 04/35] Jump update (step 2) --- Drakora.pyw | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- Player.py | 22 +++++++++++++++------- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 1912296..b15aae7 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -36,11 +36,23 @@ class Drakora(): return self.floorHeight + def speedUp(self): + self.__gameSpeed *= 2 + + + def speedDown(self): + if self.__gameSpeed > 2: self.__gameSpeed /= 2 + + + def speedReset(self): + self.__gameSpeed = 2 + + def addScore(self, score): self.__score += score if self.__score%self.speedUpRate == 0: - self.__gameSpeed += self.__score/self.speedUpRate + self.speedUp() self.speedUpLabelCD = self.targetFps @@ -61,7 +73,7 @@ class Drakora(): self.isGameOver = False self.isPaused = False - self.__gameSpeed = 2 + self.speedReset() self.enemyCount = 0 self.enemyChance = 100.0 @@ -70,6 +82,10 @@ class Drakora(): self.nextEnemyMustBeFlying = False self.enemyCD = self.getNextEnemyCD() + self.speedUpCheatLabelCD = 0 + self.speedDownCheatLabelCD = 0 + self.speedResetCheatLabelCD = 0 + def __init__(self): random.seed() @@ -164,6 +180,24 @@ class Drakora(): self.fontGodmode, (255, 255, 255), (self.getScreenWidth()/2,40)) + if self.speedUpCheatLabelCD: + self.speedUpCheatLabelCD -= 1 + self.renderText('speed up', + self.fontGodmode, (255, 255, 255), + (self.getScreenWidth()/2,60)) + + if self.speedDownCheatLabelCD: + self.speedDownCheatLabelCD -= 1 + self.renderText('speed down', + self.fontGodmode, (255, 255, 255), + (self.getScreenWidth()/2,60)) + + if self.speedResetCheatLabelCD: + self.speedResetCheatLabelCD -= 1 + self.renderText('speed reset', + self.fontGodmode, (255, 255, 255), + (self.getScreenWidth()/2,60)) + pygame.display.flip() @@ -194,8 +228,19 @@ class Drakora(): def doCheats(self): if self.isPressedKeysUpdated: pressedKeysStr = ''.join(self.pressedKeys) + if pressedKeysStr.endswith('godmode'): self.isGodmode = not self.isGodmode + elif pressedKeysStr.endswith('speedup'): + self.speedUp() + self.speedUpCheatLabelCD = 60 + elif pressedKeysStr.endswith('speeddown'): + self.speedDown() + self.speedDownCheatLabelCD = 60 + elif pressedKeysStr.endswith('speedreset'): + self.speedReset() + self.speedResetCheatLabelCD = 60 + self.isPressedKeysUpdated = False diff --git a/Player.py b/Player.py index 87d5de7..c7016f8 100644 --- a/Player.py +++ b/Player.py @@ -58,9 +58,6 @@ class Player(pygame.sprite.Sprite): def update(self): if not self.speed: self.rect.y += 1 - self.speed += 0.07 * self.gameSpeed - self.rect.y += self.speed - if not self.isDownJump: self.hoverCount = 0 @@ -81,10 +78,21 @@ class Player(pygame.sprite.Sprite): self.standup() if self.isJumping: - maxHoverCount = 30 - if self.isDownJump and self.hoverCount < maxHoverCount: - self.speed -= self.gameSpeed/10 * (math.sin(2*math.pi*self.hoverCount/(2*maxHoverCount)+math.pi/2)+1)/2.5+0.2 - self.hoverCount += 1 +# maxHoverCount = 30 + if self.gameSpeed <= 2: maxHoverCount = 30 + elif self.gameSpeed <= 4: maxHoverCount = 23 + elif self.gameSpeed <= 8: maxHoverCount = 16 + elif self.gameSpeed <= 16: maxHoverCount = 9 + elif self.gameSpeed <= 32: maxHoverCount = 5 + elif self.gameSpeed <= 64: maxHoverCount = 2 + else: maxHoverCount = 1 + if self.isDownJump and self.hoverCount < maxHoverCount: + self.speed -= self.gameSpeed/8 * ((math.cos(2*math.pi*self.hoverCount/(2*maxHoverCount))+1)/2.5+0.2) + self.hoverCount += 1 else: self.isJumping = False + else: + self.speed += 0.07 * self.gameSpeed + + self.rect.y += self.speed From 159ded5c2cce3c8c670764d4f0de52a8f1718168 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Fri, 2 Apr 2021 15:21:36 +0300 Subject: [PATCH 05/35] Sprite and animation test --- Player.py | 28 ++++++++++++++++++++++++++-- data/player.xcf | Bin 0 -> 3338 bytes data/player1.png | Bin 0 -> 1094 bytes data/player2.png | Bin 0 -> 1053 bytes data/player3.png | Bin 0 -> 1083 bytes 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 data/player.xcf create mode 100644 data/player1.png create mode 100644 data/player2.png create mode 100644 data/player3.png diff --git a/Player.py b/Player.py index c7016f8..4072adb 100644 --- a/Player.py +++ b/Player.py @@ -5,13 +5,28 @@ Player entity class import pygame import math +import os class Player(pygame.sprite.Sprite): def __init__(self): + self.imgDir = os.path.join(os.path.dirname(__file__), 'data') + + self.walkImages = ( + pygame.image.load(os.path.join(self.imgDir, 'player1.png')).convert(), + pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(), + pygame.image.load(os.path.join(self.imgDir, 'player3.png')).convert(), + pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(), + ) + self.currentWalkImage = 0 + + for image in self.walkImages: + image.set_colorkey((255,0,255)) + pygame.sprite.Sprite.__init__(self) - self.image = pygame.Surface((50, 75)) - self.image.fill((153, 151, 0)) + self.image = self.walkImages[self.currentWalkImage] + # self.image = pygame.Surface((50, 75)) + # self.image.fill((153, 151, 0)) self.rect = self.image.get_rect() self.rect.center = (100, 400) self.speed = 0.0 @@ -24,6 +39,7 @@ class Player(pygame.sprite.Sprite): self.buttonsJump = (pygame.K_UP, pygame.K_SPACE,) self.buttonsCrouch = (pygame.K_DOWN,) self.gameSpeed = 1 + self.updateCount = 0 def crouch(self): @@ -56,6 +72,14 @@ class Player(pygame.sprite.Sprite): def update(self): + self.updateCount += 1 + if self.updateCount == 15: + self.currentWalkImage += 1 + if self.currentWalkImage >= len(self.walkImages): + self.currentWalkImage = 0 + self.image = self.walkImages[self.currentWalkImage] + self.updateCount = 0 + if not self.speed: self.rect.y += 1 if not self.isDownJump: diff --git a/data/player.xcf b/data/player.xcf new file mode 100644 index 0000000000000000000000000000000000000000..57e15a15eff6e1fd00d9486444c397c2ef46f7bc GIT binary patch literal 3338 zcmYe#%q>u;NKR8IGcYt{U|?VnU|?X705KRC7^X2WFbFa*FfcMQFfa%+Ffed9Ph(&J zVFm^U5e5bZ76t|eNd^W6F(@0PPLzRx;UfbB124#E-Q@h-+|;}hkbxjcA?Kph#FEq$ zh4Rdj3ZhBE>3P=p3dX+|TNo7u|LUDdhW{M`4Mp}AueolUo zf(DqWWUh0vT_5E_Mqg*3>goB=tBm8nGv z#vm1J(9rzPz`&pgV%s->gc&$MY%q&~ffI?Xgv6FXVuLIN#Sln~0+Kj45}OB!&5Ok5 z2gNo>BNVekjKLeWyi_b5H|Nj}()L2c}{xdTCS7S9{R{IZ@WLINi`1PLwB+cscpMm-R z7X}}O{|r7p3?R(>|1*P{4+Db`mR9poV_+~*V*qo1FsOknQ)6H<0crlvz@+xq zgaOQB{m;bkUya2C;#d~7{|p@eSr{0>j{m`+2C~tIf&Kq?2-C!bf%X4i1~mre|9=?} z>^~rjS^hIJfJ|fjuf)KT&B?%&{hxs;n}gv;b^^nHhJ@^Fb_T|Tp8*U331Bu`0!ubC z17iSd0?U79hW`Pq3Csa34D10M46NC#4F9v47#On|85px!8NLQ&GcY7DWM?xZB(O4k z3&;*&U`Pl6bAARS1TX{yFfb*sGB5@FO<-VPO5kMpAHb5p$-ol8$H15k;xRM)htiA* z>>#Tc{zGZTY#~I1g+aoADeON32!kRl%!%PYgHu=-IKrHqj2VoboWjDO5$41a297Xe zV^$|{gc-9sF&jf8%oq`2VW2So!Vt#rpCK%a0fa#jW*o-A-~{40Ie{b0ILw%V!O55b z%>BV&46@9afyoJ^`9A}b@n0tfFb@>O|BYFkAdY1*hDI3J@jn=hK@k=PjxaFO$q5`` z#^4A;u>XK8MnqUWV*@B}z|u2vW;X(*YfuIOWdM+(p`O`c^#;ga3=9lxX;21;f&~D` zuOPW5kRTMpIKx%}33I!33P2K}Ca_iJA!mNCZ?A zfHFIy2@}IVPzw}?8UFe(FmQu2H4ivb!$@$Z=K0UWz)IT;{WBmtAb}wPoQJ;! zBm^WdfVkic&6vQ%@E<8d^Dz9+=41FDz{l`E0fHH`#SoDI&I6FlOZN=?gTXk=*onaj zoJT>CVC-b`7aR#;kVr6Q00qAjoCIf7NF?CNq~Jyo z6Esm0%BIZYp4D%Dzsa&A;9h41k1VS?_mp)7awSmax4ig{9n%RWG2T~P( z0cTcFZUxuOUqCgpi3x+68Urk|GMO-9W>!|U{|w+d#)p-G^*gs{5pPd-OAQkc#aP|h}Z*cwm z1ynyfIWZU;Gr+PplM^Fm_GUGPMq3y(+QPumW^4?OHYZS({{Jrni1&xV7!qy9kh&Vw PT8_@wOXPUhO$rg{=dM}dD5dt z8au>f{zR^^+F|kf)dMY#CVPdvJijizphxAN3tfBI%fElP_kG`;T6T_JuFGpKNGy1{ zZKj{vk(|6xp8ZNJjDk_=DQS|$lcqGi|FO%x;eC1Gyr=QspT7wGEXK^F^ijvyXLdz% zMb>3Ai}%9rk)C0l=R4hfcPV^SzAoB--$FcAtRn5onI+FV7avL5*gTalO*L3~o=V@! zS$;pAt|d?XESA1DD0yx5Cvmq=zfKul&*W3=bk%We;$StM64=;l@zzRH>{7|R4j?L3w6B*H;dD&;!=Klc6A*`jL4_Ac>YdQnw4r$13)54XwdzR$I9EY1om{NRas znOnb=(Wib=Tz>XOxm5PgoeYG_RrAIbn&%&DVDC-@SWtd%x-0e}5TFq>B1vA5Se|U|?WN@^*J&_|L$= z@Lx`KavcK$180FpWHAGSo-znCRxGtIV_;xlFY)wsWq-=T#3Q847Q0QJfq_A?#5JPC zIX^cyHLrxhxhOTUBsE2$JhLQ2!QIn0AiR-JoPmK!*3-o?q~g}wIeWdB9YtExkN8~> z5o=odfcu5;62FP3ZrywCnVYp*WZN&MS>h2JM09jQHpIQQ{0HU}>KdGv1C3*IB4cUGz^Ffy3P z1!gmTWmx}AKAhjxKK{1w1O|o^%rzfB{UYwU$}FRS5{p7_I>wXbME}huEM~O)%YdGA)EQH{Ce3}oI4k8WfNjxkbCf% z;dTArin5@uZSn8sM=&xl9N@D(u!=RS`oQ_?<=39?K08g6fq}u|7h{xt^t=hHFUI&@ z=67IX`0$ibaf$TXFnPQ3X)~hFKR?F_cAHbs;ic)ts}f&-j|3UDMef4h{X1|?;-E{^bJf53=O*~4_ujbRc_Ha$rAab zmw!1u7#Monf9`46D(`UES~{dRd&M*N>d7xTl^7XBzBXKxo^zh>`aS&yb_GTTpJ?ui z^yaX2=Rx`QU%CB(JLVO2hC8;UHG%_ozwLrAGnMY`IrPf?g-r8J1tA89yEYEhCD$sM z?rlh$dQVPOn}LBr<27T{{pjCcv*$CLSnWSBQ(S?O;Q^!HSS$~0Zk8#5zZZ!r51_n=8KbLh*2~7ZmgU(3+ literal 0 HcmV?d00001 diff --git a/data/player2.png b/data/player2.png new file mode 100644 index 0000000000000000000000000000000000000000..65d44c5a6e0e5c861ae88748fc26e5c08c87c3be GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU`XI#V_;xdd$i;Q0|R4grn7T^r?ay{K~a8M zW=<*tgT}<#iMAex9VFWBFPqvGBJ)P!(S(IokpiNE>T8_@wOXPUhO$rg{=dM}dD5dt z8au>f{zR^^+F|kf)dMY#CVPdvJijizphxAN3tfBI%fElP_kG`;T6T_JuFGpKNGy1{ zZKj{vk(|6xp8ZNJjDk_=DQS|$lcqGi|FO%x;eC1Gyr=QspT7wGEXK^F^ijvyXLdz% zMb>3Ai}%9rk)C0l=R4hfcPV^SzAoB--$FcAtRn5onI+FV7avL5*gTalO*L3~o=V@! zS$;pAt|d?XESA1DD0yx5Cvmq=zfKul&*W3=bk%We;$StM64=;l@zzRH>{7|R4j?L3w6B*H;dD&;!=Klc6A*`jL4_Ac>YdQnw4r$13)54XwdzR$I9EY1om{NRas znOnb=(Wib=Tz>XOxm5PgoeYG_RrAIbn&%&DVDC-@SWtd%x-0e}5TFq>B1vA5Se|U|?WN@^*J&_|L$= z@Lx`KavcK$180FpWHAGSo-znCRxGtIV_;xlFY)wsWq-=T#3Q87|N55+0|SF(iEBiO zbAE1aYF-J0b5UwyNotBhd1gt5g1e`0KzJjcI0FOY7f%<*kcwMx=NS4Ob`Wqa7nBuR zvfu$r41=G8??f$A+vlFXS*t|06fizuny4{RLxZ97)|Gz~%S@!+-#YQWT+DOByl?gA z&)ql|`)Zd-vh0$X+ziF+1sSyp%VWN>?7Fg%iGiVkGqvIA&)2uFE>NFvz4D6B0VakS zJ2$;!HDTT}uRh{F|F6HdW;U=gILJP@eEfa-`yZ*FuY6y#MZD-;`l+X9L*M^+^J2>k z$*r$hbQlfq|jm3v)FnK#G@1A$h7Z)?>FfhDo2>J5i!e+~_8@~Pr8Rc-B=f>XsJB=Ju z@7gC+#uz(27pR(JzOm;J6T^&Zwl{CTZ-4YL^{3U^nTaP)bzIx*4mLvM(}wU{#v$jo zp96bE;aQ^hwBvhk?KYn|PeF{q!R6s^=8&!L#TA%0FfiP@#(3{$!j`;%mw)D`w?PEn z$(QV_KQK%5(;EXZh67uEG2YwdXnb&%@&`Ua9fpSga~Y>)+4~;=Wo`x#NZ3_+;KqC2 tBvu9nhT79x>$dMGzvjV~z{n7CRsP1IjhpHin)N~IJYD@<);T3K0RVFl&!qqW literal 0 HcmV?d00001 diff --git a/data/player3.png b/data/player3.png new file mode 100644 index 0000000000000000000000000000000000000000..f53bd49949899c6c3decd8b4d3e765bf15551373 GIT binary patch literal 1083 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU`XI#V_;xdd$i;Q0|R4grn7T^r?ay{K~a8M zW=<*tgT}<#iMAex9VFWBFPqvGBJ)P!(S(IokpiNE>T8_@wOXPUhO$rg{=dM}dD5dt z8au>f{zR^^+F|kf)dMY#CVPdvJijizphxAN3tfBI%fElP_kG`;T6T_JuFGpKNGy1{ zZKj{vk(|6xp8ZNJjDk_=DQS|$lcqGi|FO%x;eC1Gyr=QspT7wGEXK^F^ijvyXLdz% zMb>3Ai}%9rk)C0l=R4hfcPV^SzAoB--$FcAtRn5onI+FV7avL5*gTalO*L3~o=V@! zS$;pAt|d?XESA1DD0yx5Cvmq=zfKul&*W3=bk%We;$StM64=;l@zzRH>{7|R4j?L3w6B*H;dD&;!=Klc6A*`jL4_Ac>YdQnw4r$13)54XwdzR$I9EY1om{NRas znOnb=(Wib=Tz>XOxm5PgoeYG_RrAIbn&%&DVDC-@SWtd%x-0e}5TFq>B1vA5Se|U|?WN@^*J&_|L$= z@Lx`KavcK$180FpWHAGSo-znCRxGtIV_;xlFY)wsWq-=T#3RgjO6}M#1_lPn64!_l z=ltB<)VvY~=c3falGGH1^30M91$R&1fbd2>aRvq^Ax{^_kcwMx=h*rkF%W6Vb!lf2 z5t-A#eSmX?=C(!4p4&uEo|VNNwS%FcajM2d4Go6QTUTa!)KzVotMkb`c8jN(RHfSc z^PQSYM68a*y^s;OV9ogZ8mHlrW&9JIl2{!WSl&!vkC?T8*WPu%7z$;@zp|(>FwRxZ z(pw<+;Od{lzxKWQy4IGF(}AI|fnR?A{Kb!_Kg?Vcsi}X&;@gz&*{3gle0k9GnsL-| zP7emA4-E64iKegqyyn^0^4I_3{596vD==~>h@be*YGQujdqwsN^(jupyebTg6%FT^ z*L?r=@MGX*_PTx5DIj;~ykHE|yKsxSZr{G{b@%h)A{hl382hRko}HhjJ|$~Q$mJ`{ z6Bt;2JZcd5)LOQhFaDOd&e`YQzgavOm^zr9!VYh(E?$-R`af9P=c)tW{+@lx$(3Dq z;L?t&mT!t*EcjC8T3Hkpl=IJc@>}}i53T?6!p;Yrjg~Vk|JxwSz$h@GpIIlu*qQ6C z^onO&mzjV6!zk3ya4zwk_=abUBDbWsJYrh^OnvjoD=ZTkSVF!woa8*W_wd^1tREOu z7#Kf4W4d>5!J=aJ(=wo`HdZ!PC{xWt~$(69Bz0(klP} literal 0 HcmV?d00001 From cdc8362c75eb41a9e3566b7d3e8a9671313c2e65 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Fri, 2 Apr 2021 16:28:19 +0300 Subject: [PATCH 06/35] More SAA test --- Player.py | 53 +++++++++++++++++++++++++++++++------------ data/player.xcf | Bin 3338 -> 7110 bytes data/player1.png | Bin 1094 -> 904 bytes data/player2.png | Bin 1053 -> 879 bytes data/player3.png | Bin 1083 -> 901 bytes data/playerDown1.png | Bin 0 -> 906 bytes data/playerDown2.png | Bin 0 -> 904 bytes data/playerUp1.png | Bin 0 -> 905 bytes data/playerUp2.png | Bin 0 -> 904 bytes 9 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 data/playerDown1.png create mode 100644 data/playerDown2.png create mode 100644 data/playerUp1.png create mode 100644 data/playerUp2.png diff --git a/Player.py b/Player.py index 4072adb..7488748 100644 --- a/Player.py +++ b/Player.py @@ -13,15 +13,28 @@ class Player(pygame.sprite.Sprite): self.imgDir = os.path.join(os.path.dirname(__file__), 'data') self.walkImages = ( - pygame.image.load(os.path.join(self.imgDir, 'player1.png')).convert(), - pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(), - pygame.image.load(os.path.join(self.imgDir, 'player3.png')).convert(), - pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(), + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'player1.png')).convert(), (64, 98)), + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(), (64, 98)), + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'player3.png')).convert(), (64, 98)), + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(), (64, 98)), ) self.currentWalkImage = 0 - for image in self.walkImages: - image.set_colorkey((255,0,255)) + self.upImages = ( + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'playerUp1.png')).convert(), (64, 98)), + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'playerUp2.png')).convert(), (64, 98)), + ) + self.currentUpImage = 0 + + self.downImages = ( + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'playerDown1.png')).convert(), (64, 98)), + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'playerDown2.png')).convert(), (64, 98)), + ) + self.currentDownImage = 0 + + for array in (self.walkImages, self.upImages, self.downImages): + for image in array: + image.set_colorkey((255,0,255)) pygame.sprite.Sprite.__init__(self) self.image = self.walkImages[self.currentWalkImage] @@ -72,14 +85,6 @@ class Player(pygame.sprite.Sprite): def update(self): - self.updateCount += 1 - if self.updateCount == 15: - self.currentWalkImage += 1 - if self.currentWalkImage >= len(self.walkImages): - self.currentWalkImage = 0 - self.image = self.walkImages[self.currentWalkImage] - self.updateCount = 0 - if not self.speed: self.rect.y += 1 if not self.isDownJump: @@ -102,7 +107,6 @@ class Player(pygame.sprite.Sprite): self.standup() if self.isJumping: -# maxHoverCount = 30 if self.gameSpeed <= 2: maxHoverCount = 30 elif self.gameSpeed <= 4: maxHoverCount = 23 elif self.gameSpeed <= 8: maxHoverCount = 16 @@ -120,3 +124,22 @@ class Player(pygame.sprite.Sprite): self.speed += 0.07 * self.gameSpeed self.rect.y += self.speed + + self.updateCount += 1 + if self.updateCount == 15: + if self.isOnFloor: + self.currentWalkImage += 1 + if self.currentWalkImage >= len(self.walkImages): + self.currentWalkImage = 0 + self.image = self.walkImages[self.currentWalkImage] + elif self.isJumping: + self.currentUpImage += 1 + if self.currentUpImage >= len(self.upImages): + self.currentUpImage = 0 + self.image = self.upImages[self.currentUpImage] + else: + self.currentDownImage += 1 + if self.currentDownImage >= len(self.downImages): + self.currentDownImage = 0 + self.image = self.downImages[self.currentDownImage] + self.updateCount = 0 diff --git a/data/player.xcf b/data/player.xcf index 57e15a15eff6e1fd00d9486444c397c2ef46f7bc..c028ccab74028747345186cc74206fcb8640eb53 100644 GIT binary patch delta 1026 zcmeB@I%Yn>iP3JOvk0T*3&nyTnU<08=G$FM3IS9?bFu9OPScs8< zfq^d|C$TcMNWmq)JWs)B@&v{Uf_5-P5SnS;@dc#1LP|nXe@;mK;uXY<`)Rf`4;RWE>4(_xD;VNGQj2|uKz6OAQAQV-2Zc2|3M_r z|3Byc|33%!ln%mE+zkH%m<<01a6=>PZvaC87XygoVfYikzz_iUn*lbzas6j8=KjxQ z%=`bZ@qc43Fv;`(kMaNi#%z<(yk`hbf+`Si!AM?E5|m=%1*bt!gz>`Dpf*15af3a^ z|DW+3_y7OrIAGDGj>~5t|1kvcGcX2#e9QrhFl~IE;s$$%|39NK_y7OK9Fr4RWhVDC zK422G1xJZsBrHk<3qet`S(DkAnMqU&EGg;+lN5~uONy}zFioDqcxLi1PJSkd^I%01 PuVIQLnK#>Won`_6d4N17 delta 145 zcmX?R-X%4`iBWQ+vk0SP1p^qcrh+L3PA&+|z%bd7O?dK6ah}P+0uPv&DknR#Nii`^ zoy^E3#>BLC@^6Wj$$re{n^lDVFfp;EO?G6HW^4jWvdw}@a&CSs%Fe{X!~il&M1_%Y bGPlGoCN5#HNnHAq8M(w6-8cW1IL!nA(fT0! diff --git a/data/player1.png b/data/player1.png index d7b8b60effb01b7a2f1b26d475760b01acc349e2..6feac732cc7920dca473e7a28f2e0e4110a4aef5 100644 GIT binary patch delta 444 zcmX@c(ZR0R8Q|y6%O%Cdz`(%k>ERN@z`!8Dz`!8E!N$PA@OeQk&ql>rjGX5f0vL>I zxE3W(KEkNT&dX^URlDf%YZtwnnlu7@2raI(dlioey)hedt_g28P2Xi;Q_^NY2eP@OiA{na0lCaH*cP zgTqVw+`b7n^cg0sa8Q_1I#uWE*N3V%Ui&;2^0;>V`Ereu*N>;)NSW=>H$iE~JpFU^ z_vPwp4?M8$NO`r8Cv3!R{m zZm>et;r@ZYFFEeVbc>#8T>qSVir$9%?-sEfNhsfD`{1_&)9GD@>UML_lK7Euj@z*5 z&i?Q9ADiqABKFDqf5_UrZ~fo%$Bbt*cc#ofvCgZ?WvzL_n>VSkg^}SGa~L9CD&06= zb8^Y+m4?eo9-7=y49I_fGJ(xnJTvUrPDL$?gEh=^PCtG=E71He0|Nttr>mdKI;Vst E0L*j39RL6T delta 636 zcmeBRKgOZh8Q|y6%O%Cdz`(%k>ERN@z`)?Zz`&5e!N$PAu=Z%li;ar27&-qlFfja= zQ=MEl`3R#TJCBeuTkJOZ$!{3d>zQOdT^vIyZoQqe*NfRvq&5AB-vtq|rlk+KUkESp zn|SKhz2}~}S*u01{bHIW9+eCMv%}F>G(6-Ip~W$MoAAxb)}IyJatUkA&V?sjk4tU?LZo&G?mJef=}} zaDG?&_}ju07#L14*L?i=+j2);tUbS}_S;s8_IX9M*77m)W#_8dE-stbz{1eL{=;N_ z;m$o?S#j~(_uYTZx$`f(3Ijt{t$bY?p(N)O^AU(?!jk<*Y$rZ%7VVO z#lM>$!N|aHfY0{8D%Py(1Lv=oUwgj$>@?AO1_lO;UyM=q(eoy(z8K?sncsnl;loo# z#U;{j!{qJCr_G2y|NI;$*l|ulhnJ=ouS$IVJrZQr7P$+1_wTfEJUmM^YF2pv1E|NFf{C{JaA>!Rk=myBunIzUjF6uU|{HN zum8EHVXM5uVQcA--s~06+^Z+QX8GNF-E7F_8)}05% z^S^TY19!|T>I`>mOKSv&?|$0_UuG)Z+jHoZ`wN-on+ie<4tH%Fs!Og_GTqydHuavI zsx|`ygT`ydsQb~szh=*8HnG}&V5YbNBZK(^M!&P3d+)dAhMv8Cj(Y+FgH->c%?DSW kXW9C$--dycK|!+q0_Ps%hDY3L3=9kmp00i_>zopr05d-cdH?_b diff --git a/data/player2.png b/data/player2.png index 65d44c5a6e0e5c861ae88748fc26e5c08c87c3be..8f72db55d7004f29f83449afeb042e9342645075 100644 GIT binary patch delta 418 zcmbQs@t#ewGr-TCmrII^fq{Y7)59f*fq_AQfq_ASgN=cK;q!u8o{fsL7&*@|1TYxa za4kxne1uVvotKM8FSJr)@*75tdN)rO#}JFtOGB*lS{!(4-Ac4oHMiXmE?~4^G-VYv zwS7L*>Pm>nmWND<`VCuBm*{TuP|AHPB0X918FNt21h&(46@TXW@}&JaoMb6*Lh`_a zTn10QS*N%ZTpcHP@Kt?UVD+LdzLbrDA?Cd~&njl)JFImA)`xUD=i`512Zx z7r(!J=+6AR$!p6);u4+HkBJ^n=yQtpkhr-uAm-WZ&btiNIvfR7GUnk@t=D$Vd-3`( azkcr7^H$c`9~c-I7(8A5T-G@yGywoM)2kr> delta 594 zcmaFQHkU)OGr-TCmrII^fq{Y7)59f*fq}t+fq@}`gN=cKVeQe97aJ94F>?NAU|{$! zr#iWA@)1Twb{-*p{@1@uCck0SsQ=>W;uunK>+Kvvzrzj!uH}NVLQ57rV2NSybMT$0 zWorA}(>H6C$d&@e2TT(+CTeIfbl$r1Z(^B=)cac}-j|DcZkYG2{`|Qc=VD*&GD((Q zGLxI3n7tsQR$+O}SC(B@HZn0VG;pRiJpK9l_SFUI6RuZY@j1Z6Fk|PYcdRDNd*;>G zN8IQC_4n4y237_K*$0=8zfXVvBlYu@?`yV*7rjeA_4I7$`yX#!Y?&ds^)-tQ1B20l z=apA~ep>XR^6&1izwh~Ue3Re6z;J_m%5$b&<`-U9 z`S0Z-85tN3bVw$=Wz9-IaQ=Gvi{HE7YHKqv)H4)(VJ`Wflj?M3aiITY{sT-5AFeWL zPL+NeCU0lu-Sh7G;$kKp28LG+AzwaR*lhWA!`J^Hvm9>o+}OK+r;%goUHgQ}7-OgB z0#$R&H})K2Vwh3Q_U7&P?TERN@z`!8Dz`!8E!N$PA@OeQk&ql>rjGX5f0vL>I zxE3W(KEkNT&dVk0Wq0w#vDyYK_yf{V3XGOwq3V#bffQY+12pp>(jSaH9!6Qm#7{oIzjmdOWyR=-|Wf` z^Rx5Bxt{4=Hu+t1^~9yuSc*O=q?^s`a7ukOJ1qH-xrJuXz3Zy>iyp2yCCTvqbGdcBMD)W0(>f5SAUjR zM0swp;Mn*;sN-z)`{cwoY|poERN@z`)?Zz`&5e!N$PAu=Z%li;ar27&-qlFfja= zQ=MEl`3R#TJC88qDYav}Ccj}+uV)hSba4!+xb=39t=|y?k(OMSb`}wlISt$gI9F(H zTeR%CP4whhS=>=O7z!GvYE0D7VCcMcWu`}6)uy>RpUh*oc$!I7s=YtoskubN>R8+h z8G#GdjK8mO8Xj53Kfx)9)q#QK%>?#{S^IbGUH6NjP*(gaiwXndT;(ji1#%Cr{yAL# zYu~G{Yi$`h9T*B5_~rM{U;KFb!^}02n)*j9zD?<#efr|Zmj^ws8Al!G^k886z%c)r zX!`2UYo2{AfBi4cUt_Jk0wafl_=)eVCgvBuS7fhHpW;-^tHQuo(Qux5&G%mqKL%cA zuiICh0&Ql0|gj~MDJb{7b$D;;; zPpxIE`QmSR>zsY={hP&ufvJPpDeUmp>f%+2um6MeF@CN(@a^x}r<`2bbq6l(sA~D9 z_{D-RRj!pqVL>_nj3>XPFaFT_KQHWjz}aXy!}7lkq6~}z6Z)BTB8;86-b$}{wso2L z_dkq6^$iW@65ok$c*ZDlOM1&AruEO%H=n%1GLeBLiETyIBiDnREXBwa@1j h;&)&Ym~d47$MmBP#|tCl85kHCJYD@<);T3K0RW(W4MP9` diff --git a/data/playerDown1.png b/data/playerDown1.png new file mode 100644 index 0000000000000000000000000000000000000000..297bf6a3182382cadc87392e5529103f2b099326 GIT binary patch literal 906 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznV36QoV_;zTyr7ncfq}6#)7d$|)7e>}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCS`Ki;O^-g5Z=fq&cMK!=;`7ZVsU!u6vh0*1_G`7yHBa* zGBYP9KMbDqui;VCf=8Pg|IK?K%Ff!du0CPyF=bw!5G{=iZPEJ<&(HY1DY>M#sl@W< z-aVi9Mu>#|6I7ne@#yY?7o|+h^Yqg8@&=ty@JtbsjuBTavt4pdk>SSN?^j$qR|Scy z?*9Bw%QK~!@sW+AOULIUE2V{gGYS~9I(j^xyx_|5+3j&_^}MDZsQLQs-#PD3|9)Mw zPnmsSi-3}aY~Q)+;M}^}1sUF#?%rVCDWT_Vwpr}RYxc{<*M%=$nDJ^+iH#sv?`N0g z-828KxL9Hr=&-yyGTQ(7cO?9XXyp&@fsUN_t`uSHj_kIduWrC?pdGST+(!u!|Q%S0@W`g!|q<($;-wEY6RW(}kN zhdT>4c$7yGp44_H2<#q^Zi}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCS)!u`L#85uUgmKx8K#C z!+b`prs4C)CwHzt{dS(c%WT58L)%VVEy&&Ua;w7LI)m!GY9+3%D^GDB7v6Wl!n7jTb7vSY33PqdKQw{Z*0l zmv)U++t_>feMGlaY>p}A+xWP7+lf9qhm`LoUv7TuoXa&QCEL4n=hs8*`}SW@*Q{Z7 zmiYU;{Ze1x&PK&OZx>1HZSqO%|5&kRU-~zNFBcq~4Bl1lUi6E3(FL=wGeQI=GcYhP Nc)I$ztaD0e0szN|l9K=c literal 0 HcmV?d00001 diff --git a/data/playerUp1.png b/data/playerUp1.png new file mode 100644 index 0000000000000000000000000000000000000000..2bae6ed63a814803626e1f59356e5518d5fc6324 GIT binary patch literal 905 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznV36QoV_;zTyr7ncfq}6#)7d$|)7e>}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCSaL$Oq_ZO710hSKj&PGR@m9o@3j}-yPCB`TW71l($#s5uGNYAlLN8NR()^7HSps-0QJ24!*wRkDs=d$7ZPf#&OrH5`t+ zBrnLU;GVuGZe3OTjnj_PpM-fR6jfV&yV-VP9y9-&oRyld9Y1<<+=*cRW6@yhQ0Xqd z<=!b%gS|e>rvFUnniKHiM#SU0$J_4w(yqVx}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCSiT1P%$U|^6eag8W( z&d<$F%`0JWE=o--Nlj5G&n(GMaQE~L2yf&QXJBBA_jGX#u{gancw=6(fykcr8(Lds ztx8TGi<_yRkoMuonRDL_%#DSavp+MprntYlurR2N$8*V<_0APn%-XiRau)k`vV6{8 zz9fUk@}j3&9PaV*?9)|vvgL%D^ok{}6CKplc4}(R_%X-Yn}Olmbmm!`n2Z-|YQNEM zpRLsB$=2YZEg-10Rwu^g3_F9zE(e7pl}6cLf4<9XGEGh8J`w(2UVe|#`}O&kz0Fvk za1=8=e|$3Pd+GPd%xwKi@7$)R6c^-f`ZCMmp3RAwcYRpAbF)sJI&~zbaEa)0*JI7n zeVvxmvIu7Qf zITR`A`4sKG=c89RiFta;G=Bwy>Rn%M|2i>^nY*O#%JsWzDqb*ek7At9wm>xC|03=n z{Zj5VZAY^r&M!N`(Q3UdDl-562df(|D_(KbTQqr=9KG|4ZQhy(ay9!~WEdD27(8A5 KT-G@yGywqcMuKSo literal 0 HcmV?d00001 From d8b05d56781ce256a90e7ce59d9679f785149fc0 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Fri, 2 Apr 2021 22:21:36 +0300 Subject: [PATCH 07/35] Fixed isOnFloor player flag --- Drakora.pyw | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index b15aae7..6c8a901 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -218,11 +218,17 @@ class Drakora(): if pygame.sprite.spritecollideany(self.player, self.enemies): if not self.isGodmode: self.isGameOver = True - self.player.isOnFloor = False + if self.player.isOnFloor: + self.player.rect.y += 1 + if not pygame.sprite.spritecollideany(self.player, self.floors): + self.player.isOnFloor = False + else: + if pygame.sprite.spritecollideany(self.player, self.floors): + self.player.isOnFloor = True - while pygame.sprite.spritecollideany(self.player, self.floors): - self.player.isOnFloor = True - self.player.rect.y -= 1 + if self.player.isOnFloor: + while pygame.sprite.spritecollideany(self.player, self.floors): + self.player.rect.y -= 1 def doCheats(self): From 43a33e6dfcef6cd05e4a41841ca9471a04195e8e Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Fri, 2 Apr 2021 23:20:36 +0300 Subject: [PATCH 08/35] More character animation --- Player.py | 26 +++++++++++++++++++------- data/player.xcf | Bin 7110 -> 9062 bytes data/playerCrouch1.png | Bin 0 -> 439 bytes data/playerCrouch2.png | Bin 0 -> 451 bytes 4 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 data/playerCrouch1.png create mode 100644 data/playerCrouch2.png diff --git a/Player.py b/Player.py index 7488748..7d977be 100644 --- a/Player.py +++ b/Player.py @@ -32,7 +32,13 @@ class Player(pygame.sprite.Sprite): ) self.currentDownImage = 0 - for array in (self.walkImages, self.upImages, self.downImages): + self.crouchImages = ( + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'playerCrouch1.png')).convert(), (64, 64)), + pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'playerCrouch2.png')).convert(), (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)) @@ -58,14 +64,14 @@ class Player(pygame.sprite.Sprite): def crouch(self): if not self.isCrouching: self.isCrouching = True - self.rect = self.rect.inflate(0, -25) + self.rect = self.rect.inflate(0, -32) # self.image.set_clip((50, 50)) def standup(self): if self.isCrouching: self.isCrouching = False - self.rect = self.rect.inflate(0, 25) + self.rect = self.rect.inflate(0, 32) def updateSpeed(self, newGameSpeed): self.gameSpeed = newGameSpeed @@ -128,10 +134,16 @@ class Player(pygame.sprite.Sprite): self.updateCount += 1 if self.updateCount == 15: if self.isOnFloor: - self.currentWalkImage += 1 - if self.currentWalkImage >= len(self.walkImages): - self.currentWalkImage = 0 - self.image = self.walkImages[self.currentWalkImage] + if self.isCrouching: + self.currentCrouchImage += 1 + if self.currentCrouchImage >= len(self.crouchImages): + self.currentCrouchImage = 0 + self.image = self.crouchImages[self.currentCrouchImage] + else: + self.currentWalkImage += 1 + if self.currentWalkImage >= len(self.walkImages): + self.currentWalkImage = 0 + self.image = self.walkImages[self.currentWalkImage] elif self.isJumping: self.currentUpImage += 1 if self.currentUpImage >= len(self.upImages): diff --git a/data/player.xcf b/data/player.xcf index c028ccab74028747345186cc74206fcb8640eb53..3a2cebe29f4c8a63b289df89ec34dbcdcd64d11d 100644 GIT binary patch delta 1431 zcmX?R{>*KHlV~mj1A`a?0|N^K0|O%i1A{071Ec%Ia91WqhKci3>h%o3K*0cmVF(q` z)a24gN>9$u$uCmS08_d}=}CzSFnK%-kk*Rgg2d#^ymSRam=&5_8kI0XPPph~CPpPm zn3Y@_mHBCD#i=DQcTLu3RIg`ZV*mqIO)$m4;Rd0(UqWd9eh4k>0HMVmL1?M-5L&JT zLc>U<92kp%fk6O@L182ikds)MTBP7ylwX>hpBwHz%bcSM1_%YGPlHPSEwBz zDG+7`g)xW$!Z5QyVa~w7zzjA3BmuPpBo7kzn*3WL&5wbB#pfS`1oQu23_c8|rV>mh ze^AaHHzCcV%0Gr0b@D*%U0N5-R28a@nQ9KO)C0HhJLfPMC#k>Lv{ zJQz$Qz!ca^ps-g1dr^YjQD@BjD$EyX0ji%`DPWNKTJ&07r?U8Z@{uLEKpg_&5uPNF)_)Pf@S3= zf@S4bZvHKCn#moSgd`Xk82E!zb5fH_GV}8kd=rbaK`{9$u$uCmS08_d}=}CzSh7bsnt|%@@OwPMOMN$2V zcRmvn=UcD}E>5rtE=432UYn;0E@5Kgh1kdov5^;Uxa4Xi>m4y0mpgUo9tCW-T48Hv|m8A;~N3*}EU0RRz=Z>|6U diff --git a/data/playerCrouch1.png b/data/playerCrouch1.png new file mode 100644 index 0000000000000000000000000000000000000000..7f17dcfeee4bf86ca34f049dbdd86c96ad187877 GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^J-la77pIA_fKq z&H|6fVg?31We{epSZZI!z`(#>;_2(k{*;ADM98di>jE1F1_sFz*N775{M_8syb=cI zqSVBa)D(sC%#sWRcTeAd@J2py1_nlXPZ!4!i_=RdtaBf%NIGSaq6}tX?^~POmf*dTqK6_UtaLH!xw{{t3C+_5i`Rm^w z`Cs$%$8F}reiQPNwri|?SaFhZ!77n{{^q}Yy3-iU;`MLl-8=dD&yDQMD$IB7_CK7% zydXEatnT{FFoWlF7?-V5-yLyQ$bK8I@nM~A)s;_2(k{*;ADM3`ko<$=Ep3=EPbt`Q~9`MJ5Nc_j?a zMX8A;sVNHOnI#zt?w-B@;f;La3=E9go-U3d7N?g^()DL{6lj~DS)kJ3;3J%+z2WV@ zMlBcD(9+ua^I3mXRXT(vc)lG_+MxQfi%Vgp+>wpP-`$|erqntB_|mk zA7v3t+%qHP8;55+L#GzUp%PQ;h*k6A%5s+K7diZSee-Cg{*qm_Z}==(kBIRx?z6Mo z{QLIb)9>XZt~uOle7nS^J?e?bh3))H^#ek;CEku*^0TV5;-Dq_fzNk^!_BYzUif`D z`|;!pu{yz_#php9^^ZWK4a!G(Klx?teDMgX_u@&aVt)U|?YIboFyt=akR{0RDHh A;{X5v literal 0 HcmV?d00001 From bc46a91695aaaea280af913ecc481868472f7476 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Fri, 2 Apr 2021 23:34:43 +0300 Subject: [PATCH 09/35] Useless code removed --- Player.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Player.py b/Player.py index 7d977be..3770633 100644 --- a/Player.py +++ b/Player.py @@ -44,8 +44,7 @@ class Player(pygame.sprite.Sprite): pygame.sprite.Sprite.__init__(self) self.image = self.walkImages[self.currentWalkImage] - # self.image = pygame.Surface((50, 75)) - # self.image.fill((153, 151, 0)) + self.rect = self.image.get_rect() self.rect.center = (100, 400) self.speed = 0.0 @@ -65,7 +64,6 @@ class Player(pygame.sprite.Sprite): if not self.isCrouching: self.isCrouching = True self.rect = self.rect.inflate(0, -32) - # self.image.set_clip((50, 50)) def standup(self): From b966727303636e1580ee9f0582ed75a9008d194f Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Fri, 2 Apr 2021 23:55:34 +0300 Subject: [PATCH 10/35] Animation speed corrected --- Player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Player.py b/Player.py index 3770633..d42789d 100644 --- a/Player.py +++ b/Player.py @@ -130,7 +130,7 @@ class Player(pygame.sprite.Sprite): self.rect.y += self.speed self.updateCount += 1 - if self.updateCount == 15: + if self.updateCount == 22 - math.log2(self.gameSpeed) * 2: if self.isOnFloor: if self.isCrouching: self.currentCrouchImage += 1 From c49c2102b7cd72eaf310838b1e926e7dd55d5920 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 3 Apr 2021 17:33:02 +0300 Subject: [PATCH 11/35] Player sprites now load from one file, rather then nine --- Player.py | 24 ++++++++++++++---------- data/player.png | Bin 0 -> 1053 bytes data/player.xcf | Bin 9062 -> 7396 bytes data/player1.png | Bin 904 -> 0 bytes data/player2.png | Bin 879 -> 0 bytes data/player3.png | Bin 901 -> 0 bytes data/playerCrouch1.png | Bin 439 -> 0 bytes data/playerCrouch2.png | Bin 451 -> 0 bytes data/playerDown1.png | Bin 906 -> 0 bytes data/playerDown2.png | Bin 904 -> 0 bytes data/playerUp1.png | Bin 905 -> 0 bytes data/playerUp2.png | Bin 904 -> 0 bytes 12 files changed, 14 insertions(+), 10 deletions(-) create mode 100644 data/player.png delete mode 100644 data/player1.png delete mode 100644 data/player2.png delete mode 100644 data/player3.png delete mode 100644 data/playerCrouch1.png delete mode 100644 data/playerCrouch2.png delete mode 100644 data/playerDown1.png delete mode 100644 data/playerDown2.png delete mode 100644 data/playerUp1.png delete mode 100644 data/playerUp2.png diff --git a/Player.py b/Player.py index d42789d..add853f 100644 --- a/Player.py +++ b/Player.py @@ -12,29 +12,33 @@ class Player(pygame.sprite.Sprite): def __init__(self): self.imgDir = os.path.join(os.path.dirname(__file__), 'data') + playerImage = pygame.image.load(os.path.join(self.imgDir, 'player.png')).convert() + self.walkImages = ( - pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'player1.png')).convert(), (64, 98)), - pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(), (64, 98)), - pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'player3.png')).convert(), (64, 98)), - pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(), (64, 98)), + 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(pygame.image.load(os.path.join(self.imgDir, 'playerUp1.png')).convert(), (64, 98)), - pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'playerUp2.png')).convert(), (64, 98)), + 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(pygame.image.load(os.path.join(self.imgDir, 'playerDown1.png')).convert(), (64, 98)), - pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'playerDown2.png')).convert(), (64, 98)), + 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(pygame.image.load(os.path.join(self.imgDir, 'playerCrouch1.png')).convert(), (64, 64)), - pygame.transform.scale(pygame.image.load(os.path.join(self.imgDir, 'playerCrouch2.png')).convert(), (64, 64)), + 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 diff --git a/data/player.png b/data/player.png new file mode 100644 index 0000000000000000000000000000000000000000..48889f442d91c5172009a13d4d6b37a65bce7a31 GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0y~yU@%}{V2I#gVqjpfIsW)L0|NtRfk$L91B0G22s2hJ zwJ&2}U|=ut^mS!_%EHWRre!Yv$e)3ML9)a(qQp5rH#aq}gu%HeHL)Z$MWH;iBtya7 z(>EZzkx!g~fqA;8i(^Q}y|+=e`L_)OY`JbRZILy)kkQM>YEr_jvR2ln^n=2JhV=LU zY-df5bYS3@+hyV$Zhi9FL5FrH-9-nTg$``Cnp3>YbJnsH!x!wFO3PN1AGiMX?nL{H zs{x1SUvc`AaA1jen)BU<&QAR5i)BSEZ>v8Rk$=FxFul^zcvbY3I}e$qLSJ9i(SNmT z-c#4Dak4Ro1??0}7+fOHNOW(SkrvRlYsFo`y3ejg2`4KS>^kc2cl3B<+>T@UyiSMX z_f%<~Jac}(hvF-d{iYn-Lqsd~)Gzp0RP|O$J}A^d^5fQy$zAQ%Ho~fs1}mdF3Khge z%YQh`uG_q4LDNEAEx(TfsfLpCde~?1SvdEbUbzu!)3p0gyXlpjQwq%wQ?~s18oNp+ z>++-3U$Y7em-^;#?%%P)X^+{ACtkX&^;3>&>|g(>>p_Z*L4#|}l%xIM`A@&xdaW^F zcHI(L_FKUdK1|X~+p{9F`~FJjTR{tB56Ie0xl|Xw^1{8e5S!3L-zp4cuS9pZ1nyQz zby(FFw61f8Lv_25vDvAl!%LYGXXKe}Pqeuhuz#BfYm&m_sje|SUAuO!RG*T%`r7Ig z8v$9qBRU6ugv*-dPf9(^9M3aLDr;*{4sTc7{@}G6@2J!jW$n|ub^281`d;Rb4JMPj znkAfFZ$vz*ocTO;-t@}2XCTIZIsMnu(q&Jd=KG{}{l@~${G#4;iT@EQ8~kQePL2qP zdGM5bR@T;;>7{-ADzg$7-_@KaxvgCOb#d2p-d$&feti7$LG0Wz?$1oyBbgYa1-<_W zOE@(1FL}QCCDTH)TjeIV9-1$Ev(e4DE`QUEf49Di1^qsdAh02FK{5M*du5v!PYYs~ z{jlfEXQT6{ZS+4QGdAt-neM3Uwcu^$ta~YivzARu*j#7O5xMSSF8f+dzuh;Z4Z2G= z9SgL+a&8Kr`OEsJsb_hL&YqUqn*J!Ym$!;7?%ElJ>wDH5-2Z)k`}D1bCp7i5lP3hn zUE9I8^I0lynMX`R@w}Q}3apJwrdLecCUy2xQ*mARUD;5H_Q`?oH%bP0l+XkK Du;NKR8IGcYt{U|?V{U|?W~05KRC7^X2WFbFa*FfcMQFfa%)Ffd3mFfe$4 zI0hg>0z@bN7^L)q1s7?}V6XF#TZ{bv9f%Ifo5W(~x$_HsRF=0UGgG^KNQ8O`NFaarN{{Mpk#APsHU@`$Y=?jRV zk^RD;W&%>Irp92x0M=`wX2PI`&@L!F^jKLd-}e+G{K5E_(N{`;^pfD+GN9|i`_|11oQJ|Hs~ z85n(jg2Gfyje!FcPYhfjPk}^0N#r-kBMeMn36Qi21K0oW3~C^06OcRqFsLywF#rF< zpr*#a{{Jt72?HlsEi;(S^8YUb$dtbfAlW~lKm{412G-%@!@&HXiGl4uBLl~OCa}{$ zUNVNJb5ME*Id?RzgAx`s(>f>`u%vAqX&ogs`>5gM{s5(QP%?nz1pHi3T8E`*NMgs% z10@JnXj(_6LFpWn2f*pu1e(rG{xfibGtPeoE)1IG9M^vc=Kjxgj^{tqIqv_==eYm> zJ@@|{ADHC*4`MN%;{x*_V%-1#pX2@i=iLAQP^FfmsS{En)2t*OLaCGae-Z;rHWw6g zGB9QTXJE?az@UF*CoueHNXX7+XTZ*6O!yhV5Rj0Noz2F8oz2d`mcWwDj6yO7uqLql zXJSC5nHl~EuqH4Euwc;a0qhJA%)!8#%?ZV<4F9v47#On|85py1v%dypGcY71Fk~|% zB(N|*cnsN?JXVHp0oefw2@DAg2??wWKS3OZ1O}!Ahy(*eLI7CeTR;LxRX_j(SSBGL zfgu2P&=8v|1SV*(SD^*4cmfhmEL;eP-N8p#^K$-ol81;+og z1sFh>F`I*dF`JozF@THVe*h1|{{Uu&|Jm#ej0vm^|3P925HZFCHirKJYz&M6oDBaH zxIv)@whyHCe*h-~V>U=XD+6P8J;O9;l!Kyv1VlTwh(=8W7_pljfE3k8oSy-R*u}+W z3V_5gDAv(goD8f92+Wee#Q?$F3`_w$Pz;JYCPPr%G6pb$>E8i{h5-TG41WU*19-qB zHv==6&k(@J@Hc=VfS2Ka03SGwfOrrwkU6{ze*zd7ph~kwqkVv)odvTC6b5SLGBU8B z(Ek~j!XOyj?ZL|a#t`Pj@SnjcEDYQQ!p(7VGG;J#ataHBbb)YlLA@0=Czdcs7YLaF z?%x<2vpRvgK&Uh$!+&E|CuU=?5(ac8vgkL0X-hz+E6@KFBoVFk>et1}BhmP!|ZqWpH9(asoN& z3xjc(F$05>F+}zYgRv7xv9U3O6SxZm;xZT`^nwD}7^?R_1Cue66C=YvCrB5_n9+#| z!TIaN09FTT6#h46aRPN;m>AGmpr#?KF(`5TXJ9dgHVwgiMuz`k&@NCIvH?vpaafv%q;pVuA5H6|rgcy>U`gBPX&;)_ zQBpHn;zs8F0Ht*XV_0g&&jqD*Sc(RBfsC>9K&hP-n%0qNP&x8gqep5Harm|BZS7|1tjm zAF33i3pAQK5ra`wDT#+r>SX@U_@9XZxoZwiuO`s)7pZFwPN#Uf=se)A_FvO;rriJk znu5CGe@*|JYW@FjDi7kD^8NpB$_r*mgIWJg1;9LWXpdY1Z9G&QGz5TUJX8$lu%{^A zaZVxh;m!XHf}o);r14F$|5(N~|1*GeA`fB;{AXnN`=3FA#fK4`aQ^;hU|{k2#~>m6 z{}+RggsCY5lgS?jQ&R~h5FgAi`2!Lb`p?Ml#FRn8l)*#-O#T1QAYm%OV9H>^0H%cg ze}*vBz?1~2JOe3|P-6g548s2*<}!edWBLDA!qk+7fzkB8gy{c&5)3T=8NtJGEFg~X ze-u;NKR8IGcYt{U|?VnU|?X705KRC7^X2WFbFa*FfcMQFfa%+Ffed9Ph(&J zVFm^U5e5bZ76t}}Tm}XPF(@0PPLzRx(Vc;Tffr=7ZgPHZZfaf$$Uu;!kaJOLVo7R> zLV0FMhJw4NZvaR}0IW1KH!(d`H@zq`1tiAEz`)3$QCw1)ld4dhpOcxQ$)%B&o}8bP zU!i2E{uFgJMY_ASbahwMfCaD8Dp0L%|57 zgb742Fff4J0E+hi3=9m4plG*m0LyTI*r2q+z`(!>WrHM?kk~RvY%V0W0uq}WiOqw= z=0#%jgOVc1a42Sn%7M&Rg|b0XDj@d%|NlX5RYqdNk}foyKuSTF8I+7c3=jr|1qg%u z%D}+D3=Ra41T>F;HmKQHWL<~Ukv~MGpMPtny~$6WcaVfYQn7cA1ukP#>DXJ zKLf*m1_l&~FqoQ3Fq!<3Fg0ah`u~YR!c>C6l);1nOfmic%wP%VyNn3}RMFq;0CUDz`?+h{f|L{h2eKL*eMARE51M+k^puH z3&U5iGXlWQU}1nL0l9*Q;lBh6BDBJwp%wO@fhp`i11Pk@oEZKyIE96QL(9p@n8Db| zDJ%>cT23rs;LtKQW_1FGmNBanvoSQZj1i#~1`Vw+uoIooLdyy4NCtRl8H1gPE41nv zK@k8h8bQ&HC5wQI&f%0b>|x0oLbHKA2w}s+0h%?~e4*kX3KTvd3@Ry7K>{F5?Edr>KGBUV`~QL>&V-X|RIw1* zU?)0(oyY_aE+?=fAz1?yT*eS*;tVdN%mHdQfHDUkwEl3(FVBP29)z+6D3uJATEhYmNU5tUmu4nE!ua@L~AR;N!yp!p#3a zGpPA6FqnWiCMIBMH6Jww1`{;~F!u+88mNj=V_-4?Y5vc^r1sZ@0nB6l&&0rL0x7at zO#U-)f+{+-{|wy!na=V4|98%m=l_3G{{MeX|C@6C|8L4kX+^`D&C2jUn~8xjn~{Mr zo0Z{fKsEzI0z-B-LqY;8!?%F!00xGH05IogKtcdRKmY?%0xJVkz~2N02Bri~2G#^l z29^YF2BrWWhQ9%Z0lW1!E7{VC-GlYdP zfG{W$jKdfhoIo5WCvYSfhZ!?4I2kj5xjz_;K{cN-1CtX-^M3{=-OUoS>25 z1dRk^a3mP>{{Lr;5efB-4WK3vs9XjmPK+!HF5HJx7PUpnb_@&*JnxbCuuyKF1e@xGTvgRMt|Nl*8!1x)DJrj6CWmd zln8N&;LK?{{KHWn6fE1!~Xy#!~X%?&?@zB07C#51Bm2d_!Gdu z5HM_VE7yM(WA6V<#=QUk8vi%u0+T%d{}})OZ_M@|e})})l`3d71(x4H<9{wl99YE( z&9EW~SmZ!@Dq!NnEW>hxvnv08#&g{N|DWR+L{%zkUIpb?h5&vB#sH8w$8f1sVcC=$ zoI&~jGa7UM|8LBJEr)VKt5jo9N*qpYUXWiveu850$4~}{Ld%}wpxyvT9E4$VpmBe3 zkN^k|!R+~84b&k8jl8m`{b%6#&%(e69*OTzl{{Uu&|4^DSfgLm&%kUpcGiD17#f<#l zm<85}HHJnQcrf?}gE1(=!oU#*W;!{6Bg_~aVF>mgP~RC5VOXkTSY`(g-h(m-sD1(^ zerz)rpmaY}#-Kpmc#wOcSo#8#0is|T8st|71_tRjAVDaG$uTf6$Ux;85NQXTUm&v< zpxF!1SUlx37esb&e=w-|sF^UBfQOktBUWlAY9)I6Y3E81r0p8?qc2@DC~(Wh?#2>}TVATD?)iZOwS z;eP@s3qvwA55xa#K8F7Rd<_2+Aeb>*3=s+7JOG&tq27cDkz-Il7>vV=ofw?J!%Uz^ zFm^I_VgQMNMyNnzP>fDY4F5n`kcj~`|AHeS3=#>(;NW+Hli-XBi3B{Ebl5eRVN<5i zyeD4@Wq>GHMucWU`H3JwD2B-~Ffhokgo+{3#{gtf69ym1$nY0%CI#hE@Idhw&_J?ZDHVOGd2cCn-gd>`u|@B5bqCzF(lfIA$2rp>J}u!{2vx= zX!)K$I5j6Vxg;|`Pr)~_I2)A6p*aD*z@Q$!zyKu6z(DE(1LQ>oe4xpH=;8zc(5yYg zNHx&dFoX#wVQT|GgXC~Q1_ou&a1}@^sOE*rDMQy^fR(}I7#J9o;e3=E*Tv3iCE F1^^!YigW+~ diff --git a/data/player1.png b/data/player1.png deleted file mode 100644 index 6feac732cc7920dca473e7a28f2e0e4110a4aef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 904 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznV36QoV_;zTyr7ncfq}6#)7d$|)7e>}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCSF>z`!6`;u=xn zoS&PUnpeW$T$GwvlA5AWo>`Ki;O^-g5Z=fq&cMJJ@9E+gVsUzD$m+bq4gzzwp3&OM z$~u)x`!4^D_ym~(jT<)ii+3D!V_SBX-{dEwcjH7Jo=G0Zq9^24`R@+OjkKDdmj1o$ z*))kWKaNj6-Q*C+&^(<}rDAI&JA;vl_oS1D_}=+2SKEiqb!K2VY_iChcZTHLOaq_C zN}g%#%ng@VJ2q(h^^%m`Pw|^=64q}_26`={uQ9qu3a`;y~+Otk%Vow4}Lo^o!)h*Za4QV zi605)xDA``?EhZ>vB};bVxPSKhpf%}*8e?!%y>p~XUgmo>%6L5)|w~0d6ODj7#V&s zhauvn(v9;qCzrflX}GN9p~)S^fc*C-6WFZ9GsBMURMfIKSi?N$^yBBV0?q$2FfcH9 My85}Sb4q9e0ElCUxc~qF diff --git a/data/player2.png b/data/player2.png deleted file mode 100644 index 8f72db55d7004f29f83449afeb042e9342645075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznV36QoV_;zTyr7ncfq}6#)7d$|)7e>}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCSgovy3+GtZYN z?a$#POMw%T2Oi`yceB+N7j^NaYzz!B@6CBuF&ifb$gcZ-Tg_vM zIx_huYiFt6cL;K@IQhApOBlPAP^cfMYiUfQ=(cKh&muldBD_hz4-m*LwDxiO}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCS`Ki;O^-g5Z=fq&cMJJbiBedCJ#O3z~{L?vBs<^w#oT2?$V`)cWdqQZmR${hzCL|>RrAx&e~Idmq7#&V zu;fi&{mriIFh4s_oa>q1Ws~1ES5I7ejiu<5Lb}<^4yV*tv%``PnOkTE-Mg-8zv$tb zQ<4ntUl(mn58Zc5a*v&1v!g8IQQJu$U-w*oxWh=`RQqHXNzaLo%62BbX;Y9tk`N{- zz^B4>^=FAil;;);j*Sn5I?h(VPfmQp_I#__X62oyG-E0(4cebH%NrkY`f~f8xvudh zt?kMo3k6pAL_C?zz2t?yY{mAQQ8%(Zr||DnTV-`>UjFLpyRGLbP0 Hl+XkKEcAej diff --git a/data/playerCrouch1.png b/data/playerCrouch1.png deleted file mode 100644 index 7f17dcfeee4bf86ca34f049dbdd86c96ad187877..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^J-la77pIA_fKq z&H|6fVg?31We{epSZZI!z`(#>;_2(k{*;ADM98di>jE1F1_sFz*N775{M_8syb=cI zqSVBa)D(sC%#sWRcTeAd@J2py1_nlXPZ!4!i_=RdtaBf%NIGSaq6}tX?^~POmf*dTqK6_UtaLH!xw{{t3C+_5i`Rm^w z`Cs$%$8F}reiQPNwri|?SaFhZ!77n{{^q}Yy3-iU;`MLl-8=dD&yDQMD$IB7_CK7% zydXEatnT{FFoWlF7?-V5-yLyQ$bK8I@nM~A)s;_2(k{*;ADM3`ko<$=Ep3=EPbt`Q~9`MJ5Nc_j?a zMX8A;sVNHOnI#zt?w-B@;f;La3=E9go-U3d7N?g^()DL{6lj~DS)kJ3;3J%+z2WV@ zMlBcD(9+ua^I3mXRXT(vc)lG_+MxQfi%Vgp+>wpP-`$|erqntB_|mk zA7v3t+%qHP8;55+L#GzUp%PQ;h*k6A%5s+K7diZSee-Cg{*qm_Z}==(kBIRx?z6Mo z{QLIb)9>XZt~uOle7nS^J?e?bh3))H^#ek;CEku*^0TV5;-Dq_fzNk^!_BYzUif`D z`|;!pu{yz_#php9^^ZWK4a!G(Klx?teDMgX_u@&aVt)U|?YIboFyt=akR{0RDHh A;{X5v diff --git a/data/playerDown1.png b/data/playerDown1.png deleted file mode 100644 index 297bf6a3182382cadc87392e5529103f2b099326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznV36QoV_;zTyr7ncfq}6#)7d$|)7e>}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCS`Ki;O^-g5Z=fq&cMK!=;`7ZVsU!u6vh0*1_G`7yHBa* zGBYP9KMbDqui;VCf=8Pg|IK?K%Ff!du0CPyF=bw!5G{=iZPEJ<&(HY1DY>M#sl@W< z-aVi9Mu>#|6I7ne@#yY?7o|+h^Yqg8@&=ty@JtbsjuBTavt4pdk>SSN?^j$qR|Scy z?*9Bw%QK~!@sW+AOULIUE2V{gGYS~9I(j^xyx_|5+3j&_^}MDZsQLQs-#PD3|9)Mw zPnmsSi-3}aY~Q)+;M}^}1sUF#?%rVCDWT_Vwpr}RYxc{<*M%=$nDJ^+iH#sv?`N0g z-828KxL9Hr=&-yyGTQ(7cO?9XXyp&@fsUN_t`uSHj_kIduWrC?pdGST+(!u!|Q%S0@W`g!|q<($;-wEY6RW(}kN zhdT>4c$7yGp44_H2<#q^Zi}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCS)!u`L#85uUgmKx8K#C z!+b`prs4C)CwHzt{dS(c%WT58L)%VVEy&&Ua;w7LI)m!GY9+3%D^GDB7v6Wl!n7jTb7vSY33PqdKQw{Z*0l zmv)U++t_>feMGlaY>p}A+xWP7+lf9qhm`LoUv7TuoXa&QCEL4n=hs8*`}SW@*Q{Z7 zmiYU;{Ze1x&PK&OZx>1HZSqO%|5&kRU-~zNFBcq~4Bl1lUi6E3(FL=wGeQI=GcYhP Nc)I$ztaD0e0szN|l9K=c diff --git a/data/playerUp1.png b/data/playerUp1.png deleted file mode 100644 index 2bae6ed63a814803626e1f59356e5518d5fc6324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznV36QoV_;zTyr7ncfq}6#)7d$|)7e>}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCSaL$Oq_ZO710hSKj&PGR@m9o@3j}-yPCB`TW71l($#s5uGNYAlLN8NR()^7HSps-0QJ24!*wRkDs=d$7ZPf#&OrH5`t+ zBrnLU;GVuGZe3OTjnj_PpM-fR6jfV&yV-VP9y9-&oRyld9Y1<<+=*cRW6@yhQ0Xqd z<=!b%gS|e>rvFUnniKHiM#SU0$J_4w(yqVx}peR2r zGbfdSL1SX=L|c!;4iatmmrd;ok$I!=Xu?9PNC8nn^|eldS}jovL)j;L|6kzgJn7LR zjU8e#eVXzVlf6P-o?n+<(4%tCg|0p9<=;Qt`@Zi^Ejvdq*X1=ABo@5f zHq%e-NKRfT&weEqM!~4`lr+iWNmH8M|Jdc;@V>lo-qZN+&tHUo7Gq{o`lw^ zBI~l5#d~4*NYAj&^PTR#yA(buUl;AaZy_ElR*`n)%#!Dwi;pC2Y@W)OrW&j~Po;0= zEWe*l*OI4x7E50nl)Se3lepWbU#E<&XYwg_y6QMKaj=?B32f}Ocx$C8cBy3EhmZWb z>N;b%cAiRj65${!m2#c`AN&65Y*DpidzW}Hy{Iaj)1RoYhuh?J-{;yl7H5SOe(=P+ z%&p(b=u`T5s1 ztK%=3CoGIxn%B_moUp{>=4-q6@7}$+z29{0zrPG7Qbm2TkEfO}FfgzsdAqwXoMQ-J zFs|WRl+3`uz**oCSiT1P%$U|^6eag8W( z&d<$F%`0JWE=o--Nlj5G&n(GMaQE~L2yf&QXJBBA_jGX#u{gancw=6(fykcr8(Lds ztx8TGi<_yRkoMuonRDL_%#DSavp+MprntYlurR2N$8*V<_0APn%-XiRau)k`vV6{8 zz9fUk@}j3&9PaV*?9)|vvgL%D^ok{}6CKplc4}(R_%X-Yn}Olmbmm!`n2Z-|YQNEM zpRLsB$=2YZEg-10Rwu^g3_F9zE(e7pl}6cLf4<9XGEGh8J`w(2UVe|#`}O&kz0Fvk za1=8=e|$3Pd+GPd%xwKi@7$)R6c^-f`ZCMmp3RAwcYRpAbF)sJI&~zbaEa)0*JI7n zeVvxmvIu7Qf zITR`A`4sKG=c89RiFta;G=Bwy>Rn%M|2i>^nY*O#%JsWzDqb*ek7At9wm>xC|03=n z{Zj5VZAY^r&M!N`(Q3UdDl-562df(|D_(KbTQqr=9KG|4ZQhy(ay9!~WEdD27(8A5 KT-G@yGywqcMuKSo From 5a2dbcce613f232f109faf7715753e2556f77c4a Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 3 Apr 2021 19:28:44 +0300 Subject: [PATCH 12/35] 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 From feefe9f9c09ddde323e405bc74603dcf79777343 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 3 Apr 2021 21:24:55 +0300 Subject: [PATCH 13/35] Flying enemy sprites --- Drakora.pyw | 1 + FlyingEnemy.py | 34 +++++++++++++++++++++++++++++++--- Player.py | 5 ++--- data/fenemy.png | Bin 0 -> 282 bytes data/fenemy.xcf | Bin 0 -> 1328 bytes 5 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 data/fenemy.png create mode 100644 data/fenemy.xcf diff --git a/Drakora.pyw b/Drakora.pyw index 6c8a901..fd3da15 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -80,6 +80,7 @@ class Drakora(): self.speedUpLabelCD = 0 self.nextEnemyMustBeFlying = False + self.enemyCD = self.getNextEnemyCD() self.speedUpCheatLabelCD = 0 diff --git a/FlyingEnemy.py b/FlyingEnemy.py index d78ae23..990ff70 100644 --- a/FlyingEnemy.py +++ b/FlyingEnemy.py @@ -5,17 +5,33 @@ Flying enemy entity class import pygame import random +import math +import os + from Enemy import Enemy class FlyingEnemy(Enemy): + imgDir = os.path.join(os.path.dirname(__file__), 'data') + senemyImage = pygame.image.load(os.path.join(imgDir, 'fenemy.png'))#.convert() + images = ( + pygame.transform.scale(senemyImage.subsurface((0, 0, 16, 8)), (64, 32)), + pygame.transform.scale(senemyImage.subsurface((16, 0, 16, 8)), (64, 32)), + pygame.transform.scale(senemyImage.subsurface((32, 0, 16, 8)), (64, 32)), + ) + for image in images: + image.set_colorkey((255,0,255)) + def __init__(self, mainGameClass): Enemy.__init__(self, mainGameClass) - self.subtype = random.randint(1, 7) + self.updateCount = 0 + self.currentImage = 0 + + self.subtype = random.randint(1, 10) + + self.image = FlyingEnemy.images[self.currentImage] - self.image = pygame.Surface((50, 25)) - self.image.fill((51, 51, 0)) self.rect = self.image.get_rect() self.height -= self.rect.height/2 + 10 + 10*self.subtype @@ -23,3 +39,15 @@ class FlyingEnemy(Enemy): self.height) self.speed = self.thisGame.getGameSpeed()*2 + + + def update(self): + super().update() + + self.updateCount += 1 + if self.updateCount >= 22 - math.log2(self.thisGame.getGameSpeed()) * 2: + self.currentImage += 1 + if self.currentImage >= len(FlyingEnemy.images): + self.currentImage = 0 + self.image = FlyingEnemy.images[self.currentImage] + self.updateCount = 0 diff --git a/Player.py b/Player.py index b096305..ee06e49 100644 --- a/Player.py +++ b/Player.py @@ -94,7 +94,7 @@ class Player(pygame.sprite.Sprite): def update(self): - if not self.speed: self.rect.y += 1 + self.updateCount += 1 if not self.isDownJump: self.hoverCount = 0 @@ -134,8 +134,7 @@ class Player(pygame.sprite.Sprite): self.rect.y += self.speed - self.updateCount += 1 - if self.updateCount == 22 - math.log2(self.gameSpeed) * 2: + if self.updateCount >= 22 - math.log2(self.gameSpeed) * 2: if self.isOnFloor: if self.isCrouching: self.currentCrouchImage += 1 diff --git a/data/fenemy.png b/data/fenemy.png new file mode 100644 index 0000000000000000000000000000000000000000..74769f228e5febbf4b64c5dab80e72b0fe42dafe GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0y~yU@%}{VBp|j0H=O_NOe&LZVEo3vbS3U|^6eag8W(&d<$F%`0JWE=o--Nlj5G&n(GMaQE~L z2yf&QXJBBM;_2cTVsZNHt8`X6MR#&-z5D#;+NU34KZGp` inDIRDbk6;MObs6%zdmz~JfX=d#Wzp$PzRZ)zm~ literal 0 HcmV?d00001 diff --git a/data/fenemy.xcf b/data/fenemy.xcf new file mode 100644 index 0000000000000000000000000000000000000000..10fa16950ac474156c4de15cf6af5b7b4ce91478 GIT binary patch literal 1328 zcmYe#%q>u;NKR8IGcYt{U|?V{U|?Y205KRC7^X2WFbFa*FfcMQFfa%)FffRK6fl8Q zfJ78PECCQ93=(pl#=ro=P<1Q}3=FLd3=Con3=AMPNQWo`1EV_w0|PI}THWOQ+}zZ> z5|CveNg?N=)Wnk16ovB4k_-iRPu~ELi~v|^W^Q77s&0BwW(r7*k%57cL8G{&GAC7` zI6o&dMUzV-Ej>9uC%;HR15D`_r6(mS80Z;*0TzZKR7z8mOCt%3R+zj3ZU#teMR7r5 za%Nt-f+5TRfr05IlmVh(!NCmTFfcH)LTE4vlVf0DV3q}oFfcF}{%2=khhnz>e;G{w zGn@WqIQRemIc6yDAHzB3|G&=t{|}b?%W&=-%m4ojY^ER<)BnHcKx~K(Ca^eI{qJ)i zB*BFfg#0{$>CvXJ%kC z1*`oXzyNm6KL$f4m`0FG4Fi}N{se%f{xBFa1h6vvg*p_81J%R~l>=D^vOOM0up0mW zZ;S|5W9I+AjN!p*YzzxlV`HZOe~lr*3eo`!R%7P>zl~wRYRm-F405coG4uaF#!$x^ d|2IYoR%G5k24klG|BaD?6{PX6@qd(H1puxOShxTH literal 0 HcmV?d00001 From 7b1bfe8653435edb35e8e2c01d353d267224558e Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 3 Apr 2021 21:51:34 +0300 Subject: [PATCH 14/35] Drawboxes cheatcode --- Drakora.pyw | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Drakora.pyw b/Drakora.pyw index fd3da15..16e9a65 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -118,6 +118,7 @@ class Drakora(): self.godmodeCount = 0 self.isGodmode = False + self.drawBoxes = False font = pygame.font.match_font('liberation mono') @@ -158,6 +159,14 @@ class Drakora(): self.players.draw(self.screen) self.floors.draw(self.screen) + if self.drawBoxes: + for player in self.players: + pygame.draw.rect(self.screen, (255, 0, 0), player.rect, 1) + for enemy in self.enemies: + pygame.draw.rect(self.screen, (255, 0, 0), enemy.rect, 1) + for floor in self.floors: + pygame.draw.rect(self.screen, (255, 0, 0), floor.rect, 1) + self.renderText('%d'%(self.__score), self.fontScore, (255, 255, 255), (self.getScreenWidth()/2,20)) @@ -247,6 +256,8 @@ class Drakora(): elif pressedKeysStr.endswith('speedreset'): self.speedReset() self.speedResetCheatLabelCD = 60 + elif pressedKeysStr.endswith('drawboxes'): + self.drawBoxes = not self.drawBoxes self.isPressedKeysUpdated = False From 5fb2195861a0a040eb6ca14e6b4df73266e00db9 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 3 Apr 2021 22:30:54 +0300 Subject: [PATCH 15/35] Added BG image test file --- data/background.png | Bin 0 -> 2300 bytes data/background.xcf | Bin 0 -> 8164 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/background.png create mode 100644 data/background.xcf diff --git a/data/background.png b/data/background.png new file mode 100644 index 0000000000000000000000000000000000000000..695147c756608493d4df443a0d31f49ffc3720a0 GIT binary patch literal 2300 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV3@|i#=yX!#{Fh40|NtFlDE4H!+!<_hW~P^ zlj|557&r?&B8wRq^pruEv0|xx83O|Ydx@v7EBjLxW?>m~-9u-NFfcGkmbgZgIOpf) zrskC}I2WZRmZYXAlxLP?D7bt2281{Ai8C;8q zrcW1dW>Roy5S8APTdY1K?&HUQ-|yS+KU3S#_`7BK{qyVd+a^g){xXfb<_+)7uX7WQ zcfER8__p@l?C%Ws-wXGxnab4i@ZracuJ>5&&M#XN+)?pM+0JTB;QQo+KIZ;)^WCp| zF&?_|;l-|vYd2`Fmg`Nwdv&AXS$X;E#rtkWbmUk(|MRkpuXbyl+|D#Efo1LO0w?!t zt}a=#ujYVC@;d(NjkVRI)z@s+8;L3X{{1@qDT8?Qin3HIo8$J zFIFFSXm}H|#d`jl{(GJxN?#utKK^;(XEj50fBm=K?~&P|+kB7CJAeP_?%3+)Ckw{Cy*ba}i6d_9#m!+O&AgOU^6~`+Xz4|4h&4 z1;1CP8TZvL>)k0I6S4i^I*aLUwa35L@8Do8~;Kh$su`Tk)XIS#xHNU&syg%^x;@`m=GG@Pe^ZVG$$6rcz#@sW?U$WR| z+q?JQIt7oL9r}6U?Yj@Fd?Q;<#Mqus?>o5aytdin-gfELTff-|9xn522$@lF?``+~ zj@_p(Jic-6-h#7#{shkZw8rMyRAu8+5*4!~vtwVI$;H;SMYODmjJD^Qux9r5yz-+h z$M3KaGnk2|nyudtk@NxDngbl%J(@hWpnuWw$HzImPEK9jl0%CU+6cO;#8 z$2H-EqEP9gwg0AyJPfpV*`%{c`C6~v`xbZm`R?)JR<31j{||=z%=BNfH{giAZ~9Nk zPj9N{hx*@iV)s}g@G&m_?qvUtJLcba$8A_#%f8_Ev+5^R)1Q8}|8>*2_MGwg$2qTW z^t`TqQuy)nM$_X}S9i#AO_-`U>7!q#`*o)yg?8zCUwlga-E;iso7ax*TkSrdZCQNW zs=A`*&i|B(TQBENd^Rt6;<2|28D{QmJiYIuk)B`K@n1i7UU+&{q`dWWp4zuF&0MoT z?ESpYt71;=yL9R4E7m^>zsKHt&v_Z&go%?kU#frgu4K8&?~R)d+}g6{R!2!)z2$F- zn(sGP=N@`L^SkKb$7_o1U)S`1+dskTO|#ZJWq}-`(uwQu9XkwqCr? z+NzrV9_OpRl}~+tye)nEYjap{pZoKg=gV)d>n%K1^L3WBio-bzL+$&zf~ihNc7FJI zYr@as_qO}B=U=Wqwx}p2{C-FIuQmPeO1115KWES1m~5U^YSv~zLr|PMej-y}i z7cabB{ZaN_^uBZ*n~O_-&3XTY<;+&Yx(*k~!w^Q*7G>~?OXjTu2Sxd zOx%l(G-Vy;Rd70Te9d3?ErlWq3=A!u0v`kCGcYnFc(ml)zV@x2>EllMHU@@<&3oIA zeElwWl%0u%p<$_@lHIS5Tw)9ihikuhP5S|=kqm5{)^+yR)k!fiFr*1c=gfW&sb%7 literal 0 HcmV?d00001 diff --git a/data/background.xcf b/data/background.xcf new file mode 100644 index 0000000000000000000000000000000000000000..802794a14d682d94b19568b4e9edb97798423e37 GIT binary patch literal 8164 zcmYe#%q>u;NKR8IGcYt{U|?WYU|?XF#sC2zT9AQ(fsv7cfkBvofq}z$8Uq6eGcYiS zFfcH%FfcIGFfcHPLD?X6q6`d-?hFhJyda}>lk;wc z6x=<113)qYV5OP4iRr1j=|!0-ATdS;21W*r;*!doRE6UFoXiwWE{(MGaAgvX}1&PU-dFcv2&5Q_*`abE^Hrg2kdz9D{r~@ekXx0J*sugw1yY2-OlJ^mcql;K z#SHQv0|SG!CPa<2DU^1E(!LNHM8frgtOO@Z1_qV{kPHI@O97OIgc<|O1So$2l->ZP z4?yV)Q2GIs{s5s_Aru3v0EEE`3PVuzI6(O9cOW#U1cc_=0ik&+AT(bDgcb;a&_c2h zS~w9xi~NPq;-GM6U|^8A3*k#aQ;bw5lwS#@JE8PUD7_L&?}XAPq4Z5C{Sr$5gwWEU zGy@7>NeG{TpriKjsruqy5rg~s3XsQhkFELX! z1_@IY1{qTY26Nd8x5kom8`Apc*MLFvCV zgUWviaJ*>!7h=%;F944lv;XW2mj6L%?$-Z$wwnwr(0Jhn$B7Puu&D+-4irpfz~Qf9 zD$Jk=HRdgrCm_?Gcnki{%5FXIbb^Y&6~l%_TLPep7j|7|7$ad{8tBu zo$P;k2F3r<466Ud88rV3LBori!Sp{TgT;R~2Fw4f4A%dd8Eir6n$_WdJ^O!#|E6{f z|4pqKm`$x1SWGP$SWV3t*umJ0fy2~mGf!oxGfd`!C^`U7VQZ|U0sxwG})4C!! ztt*>K!PB|EDKEHesAp0%9e(!gXZZi$mVxoVH3Rd1D+ZSTmf$jm{l6Il$A41>&i^J1 zT>p*1=^a$&@cq|k;Qy}&PU~X-)fptU)11_)Cpk3H|6h(l@xKg%@_$JNwg2MaxYCA~NqpcqgVh?fZ ze};PI*#GtHtk8M`l(#^2hdBd>sVOub4H)>qaR@4}G#McEhAM-UsS;A%A;q9#DhbY0 z8qj(d6n_S$ybOk>JPgLBoD62B>Hit8ere1mN`yC~j35r2Z>2NdH%40M-4Vcm>t}pfXeAzbJ#|e_;k4a9zX4VECV# z!T3KHgXw<`2J`={43_^{z-G7lA%rhb1<0wXJfGX532N@ z{Ree~Kn)-kQ!{A63~JPaGA*P~mNZpnkcL;Pkj6Z$69j5df+|uIa3RdXP|v)|bkLi} z-oWtxza0bPe@g~7aAU=Yfe+jm*Jcp@ugL&uh%13J38;Vs6^@{WIH-Z5{a*lH*@42) z0vv{~|JSp(GW-WO9zhua6po+F~411sV^aN(+?6jTj*58xa?v#-h}JP<+TUKpG;jj*%ErLj;tz zdB7c4P`p4IA)wBy`u}?N1JFjk9Rs5&sG|?+$XYY7KpXsQ;0`UQVF@a+U}+yzVrejd z8u${XY7C$}AY-b;AdA+ig;Z7|4BFs^C8%Qyi#t#U3)CoKVW?-AYdY!%SUAA)9;owR z%fR&ChJpFNH3JKDkb?ccDY)YRYLtRH4WPja%nD42K?dA-L6mo@|3MuHLP$xoxK>=J#fd(;T z7?e$=8C0S9RozsaK@;2{1;st2W1(j%zyNBP8i6|&koboT46&Gw96Na#nEzWcaQru6 z-~kVG=)%iXP@_`@oR2{bPXz`AaHj$^&>_R1@?VNU6>DS3|yun3_PZS z4E&~i41%US48o>d3}U7n3=*cS43c2X!XRY|!pscPrXbA3AY;nNAPdL;8R{ATn+|>R z^%5)59y#dzjob^U_!kH*51|<3L33ja3=Hzn`5k%CTo;IM08t=s1EoEnG<2Rv9y$*t zp92-IfYL2c8k96a=FEZeS3qd+T#RkK0K>F;0fzha0t^Gs=3ua`=U|vt&oM~cgB&Kv jZewk*t!HhRR?pgSzkV>VnGV?2GaZ;#&vf8EsYMY0VDy4v literal 0 HcmV?d00001 From cc37b5689a505fa85e00e9712213094302a7079d Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sun, 4 Apr 2021 14:46:37 +0300 Subject: [PATCH 16/35] Broken background system --- Drakora.pyw | 26 +++++++++++++++++++++++--- data/background.png | Bin 2300 -> 3821 bytes data/background.xcf | Bin 8164 -> 13599 bytes 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 16e9a65..e119e60 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -5,6 +5,7 @@ Main game class import pygame import random +import os from collections import deque @@ -16,6 +17,13 @@ from Floor import Floor class Drakora(): + imgDir = os.path.join(os.path.dirname(__file__), 'data') + backgroundImage = pygame.image.load(os.path.join(imgDir, 'background.png'))#.convert() + backgroundImages = ( + pygame.transform.scale(backgroundImage.subsurface((0, 0, 800, 150)), (3200, 600)), + pygame.transform.scale(backgroundImage.subsurface((0, 150, 800, 150)), (3200, 600)), + ) + def getGameSpeed(self): return self.__gameSpeed @@ -86,12 +94,14 @@ class Drakora(): self.speedUpCheatLabelCD = 0 self.speedDownCheatLabelCD = 0 self.speedResetCheatLabelCD = 0 + self.backgroundgOffset = [0, int(self.fourScreenWidths)] def __init__(self): random.seed() pygame.init() self.screenSize = (800, 600) + self.fourScreenWidths = self.screenSize[0]*4 self.screen = pygame.display.set_mode(self.screenSize) pygame.display.set_caption('Drakora') self.clock = pygame.time.Clock() @@ -102,7 +112,7 @@ class Drakora(): self.targetFps = 120 - self.floorHeight = 50 + self.floorHeight = 64 self.players = pygame.sprite.Group() self.floors = pygame.sprite.Group() @@ -120,7 +130,6 @@ class Drakora(): self.isGodmode = False self.drawBoxes = False - font = pygame.font.match_font('liberation mono') self.fontScore = pygame.font.Font(font, 32) self.fontMessage = pygame.font.Font(font, 56) @@ -153,7 +162,10 @@ class Drakora(): def render(self): - self.screen.fill((102, 153, 255)) + # self.screen.fill((102, 153, 255)) + self.screen.blit(self.backgroundImages[0], (0-self.backgroundgOffset[0], 0, self.fourScreenWidths-self.backgroundgOffset[0], 600)) + self.screen.blit(self.backgroundImages[1], (0-self.backgroundgOffset[1], 0, self.fourScreenWidths-self.backgroundgOffset[1], 600)) + for cloudGroup in self.cloudGroups: cloudGroup.draw(self.screen) self.enemies.draw(self.screen) self.players.draw(self.screen) @@ -287,6 +299,14 @@ class Drakora(): self.doCheats() if not self.isGameOver and not self.isPaused: + self.backgroundgOffset[0] += self.__gameSpeed + self.backgroundgOffset[1] += self.__gameSpeed + + if self.backgroundgOffset[0] > self.fourScreenWidths*2: + self.backgroundgOffset[0] -= self.fourScreenWidths*2 + if self.backgroundgOffset[1] > self.fourScreenWidths*2: + self.backgroundgOffset[1] -= self.fourScreenWidths*2 + for cloudGroup in self.cloudGroups: cloudGroup.update() self.enemies.update() self.players.update() diff --git a/data/background.png b/data/background.png index 695147c756608493d4df443a0d31f49ffc3720a0..0b5fcd7cdde64edf72397e923c4779f87bd2c4fa 100644 GIT binary patch literal 3821 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 diff --git a/data/background.xcf b/data/background.xcf index 802794a14d682d94b19568b4e9edb97798423e37..aa18ecc24092b685ae412f0043d85fc5c1af36c3 100644 GIT binary patch literal 13599 zcmYe#%q>u;NKR8IGcYt{U|?WYU|?X>VSs>X3=9l{3=9m6j0_A6LJSNH{0t0?G9XSH zh?oW9={|pQaiXgUq16YOw#0JGW0|Nsmlns(l zLSoAxvAK}g3P@~jBsLEcn-_`A4@x~C!=acRDhD!O70L!lsesu3|NjTMRT+s5OKmVe zfz&cEFfcuUGLTa=GenFTWHti>gUNdc-{d!hHU-(uz`$S%O3@G@l-$5-0uf|&fYLrt zIs!_A1DAn;wE)VmfzlmNdJ2?Y0HxPJ=^aq|2$a46p*i#*G}j3T%{vc5^H)GA#SmHws$T{g7V;Soam8u~tqgUyGSt1wPr!+f|{d!1;W>bx>pYxe)>>-2KONHhItU$Xg!2B zJ`bT880rNWZ0iLWrqv5D+#eKd4hGwL4u)y<91QpC*_YcgGFaO(G5j-Su&`xfU^4yB zU}nq6z-IcN!N``0fz$LqgT5^z1Fz|S1|3@_27c533|hAT8H7y#GicZ{GKiS|XHd0e zVh}TBWKgnYWRNud&!Aw-$RK0-pF!4^i9ycvKZCUGe+DJf{|pkgObp7V{~5$=85vYf z|1${NGBIeFGBOC*GBRkJ{%7E`Wn|DZ{m;N{%fw({`k#TrmWjdG^gjceEhB@O>3;?m z+y4xfri=_swl=1J8EkEBP5&|2+L``msApm@t!H08jgi568pJ2lpgx%f^~p4-Po_bA zG7ajJX;7a`gZg9|)F;!RKA8sf$uy`>ra^r&4eFC=P@hbL`eYi^C)1!lnFjUAG^kIe zL47g}>XT_8pG=zu^2szLpWJ6;u)YuR$$h9#?n8ZYAL^6)P@mj~`s6;;C-XZ9WpWKJ~ITV@7JTP6lZQ)UJeTP6lJQzixjTSf+MQ$_||TP6lRaB^Z|5Hy7(CUx8Y3}U9L zwu}torpmTV3=*bFw*MKVO%-kbGsu`i5|*4TBZHi&tnGgW1ydQ@{|t(zkOU@W`=3GC zRMM7_LD^Ko_CJHFsW>>Hfs&h=sfaBjgNCWFEhB@bsgUh|25nP8+y4wYrl7>9W6E#K z$e?TbpMlqwkwM>-k%7~ek-^B6k%8Tok-@~2k%85gk-;3C^cWc|O<5S~8Md0%vztz1 zX0V(F_1!e6@1{Y0Hx25$X<*-h6PWrmu^1fqgd(?7L}T z-+>dI)HJZ~rh$Do4eUE`;uD+3$e?B_G7apzX<*+?1N&|o*mu(y8FWnfr$K!;4eGmT zP~T01`feK3chgXOcb}QT@;=me_o2SK5B1%BsPFEBeFsi->i5CEyASr=eX#HDgMD`& z>^pD*l)Df1-F>j{?t^^?PKZ+X!M?i>_T7E3@4yLC>^|6c_rboq5BA-Cu7le@1`=3G0 z_CJHTDItG^mfKL47<8>f>opA5Vk&cp4)E*vHeLK86;Un$w^@2B+x% z3~JM$KAr~kF*sfSXHb|1_3<>QkHIPWKZ7(lP5)<*oCfvrG^mfKL46EP$^RLIz-gJ0 zfqxp*$J3xbhNfVSX;2@7Q!o<)(=-$x-)Ca5z7O^BeW;J`Lw$T7>f`%RAK!=i_&(If z_n|(97Oa~0p*{wu^8XBK_n|(%5A`uPt^a3GxDWO5eW;JYsr)~KG&r6AXOO%P_3?eE zkMBc$3{Ktu8HB*;n~{P4KGetep+1JDYL5F*AA?gh69dzIBp-7y*fKKM+A^B{XRxsa zRpr*U%%+SCmbR?m)D240X11UdZ46G)j0^_0{~35q85wkJ85smj85tlcnUMif0)wh_ zP!0yASWv!YWRS9DWKc3?Vi2`uWKcI{WDvAvWY98YLMk_zz~v^S%4T9P&;$Y3xH>bhxA*MUbhxA*G+@E4qom-T?ej)nHU(Sp}6ioBZKXIuWKaU92u21-na9W=bsy@w`%u^2hq?}4Zb4lK zu3DKG81Eywj(wsn6N8m46S%xGw`F2r2A5Av;Bv~)mWhGO^gp;p1;wV8EhD&rrf$o~ zAPR1vF@hUtDz>2JnTjo_Oj5R$2A53Iri=^}7-bv?L- zWMmKmr-uIw0@I+bM@bd`8Q7;Wf=f^4X&A1*&%|JLAL{!1P}kpwy8b@Y_4lE!zYlf& zeW>g2LtTF#?E3p)*WU-b{yy0C;PT=>gY12%>!Ia@#C@pi!8ITwgAh2i{AUoj4|P3C zs`<~rejn=k`)ICbTVTt^U}nn%uGx%jL9PbXWK0a)rc4al;3hpIgSssfgRm(RgR(6n zgM=v)gFLti&%_{Y%gCT$%ESO_NvW7JF$jU1?9AZ&u4l>wZ6`4?u-X2Hw~wq$|JpJz z*nryQto5e#YzwBbF_=w*+7FI%CIr!QWhMr;`%wGAdG_ypB>Oq-ZU2MH zWCj~sMo=%y%Jx4}V}pso#FmkP-IR&J(3TP0$N)7i_)M7?v}~Ce1WcJ2K$%#?6jCIM znKD6pS;$eu#2|0V#2^7~_%bnw*fKGwnKD6(W@d0BLEn^>fyI`I!OWD6p`J<7w4T#` z+J8_{%wRJO;;3m*M}gY|ObjN|ppKdbb=0)~3}8o1gE|V_o`saeU`K&FOiT>&@OXnd z3fx|0Vi1`Ibrd)cGBfai^ByY$%QO^6-Tx0Nff;P>LmYJ<>L_rP&BS1GAL^+4P)FT| zI_f^uQQ&4MqyPpx3f%W$VvvVNCe%^jW+oGZ$bG1zz*&o#fd`zWSQ%LEBRPuA7urz# zZ_31AVav$CY|6x73hp5@G8o%3GH{wQ!W)LV(1sx-?*2oo)Bg;xhM@{Ld;Monwv__+ zmq7&pB&+>rfOKpA!yAR5j*OBiBZIi@e+D(v|Im1a6vCR|UNfi(%n0r^gSsxD#vr8Y z!o*-`3d)ku0>PFEoHhT0DiBj9hI(cZ(|R^vXk!rUt7%YQfqTo0493%-zJfOXbfJwu zEpX)jXFzZKsem)>e+K1gU|)d?Wk^E!53QR2Gsr+2ev;rSnvp?#8q`!M*}_ zTNoMmpj{S7LSba!oCft3ypV?a3RJNmdML;1nUTTxKGavx2A(dofu{vd zJ^vZd8+a<HisIpp838aMjMpAbua}D{#t!6xv{4fx9b= z41Cb83M8d5GH~99`U+lnLwyCRaNxc=15JUTt_mat{)cx}Af?BDXiEGK?_BFa$82Il-{`wy)E7{Luc zP-+Bqq#t^(eG~0cnQ*XAlQh zX^ae_;0DHj24Qd~n~_1_KGdV&w93f94eo&aXW+UI_2_-5N5Re1{|qePjtC4K+gAEs$gj>QTdzEu`Oq z+L8tJsJU(bGZ>lvhqh}#<3FI@)_(?8aOL@*0o1a!H2uwB3s1LEruFQgLJB_e2=(PO zs4u5MeK`%16u`cm2J+=Js4qbhrvJfdRt?_bh5B+D)R*8|6;zl)eF+{NVq^dnreI$p zrCG2qp=nkST-&0yc)`A$2K6Pl^~A`)4(>(&XJ7@_#{U^WEntu@r@<2~*q6wol2BjX zhx+n9)R*@m=>Y7@`ygN5hx!sE0rMriWeoM@eW)+N)ikJZh58aaO2o(jDqO+7L`tw= zUqTbCAh`NQZ5e}oc^~Raa2t)0fgRj){?EV)uHOGMFoVZ~ely&Mr`Radde+mRYSNaG z0hIDU<3gZ*7HB{m)C+_ZwxIDKP*sAhu>H><08Y|^;J!4ZC!l7_1nz}_Du2+Z5G?J2 zDt=k;FgeJ-kiNB|>3;^uC=hIzoRI-EatZP;sO_x@?tMXrW|4-=K@~q}xEz#r*=(7> z{TL=&CU7sTo_Q|FU!aN-n$|3#WvkgVMh39Iz^y$-1|x9AkF9Kl`fD24U(o)U+BB%Y zpuKTLXleyj{a}AhgZgV4BLmo9;IW?n44@H9RZ~U=(3mCIU(=Wv!2ZHAcnpqgd*pAsUg2r&b zW0e0)!9$dgqzLKAn1Y9KOl(2(Ge+Q^187*12|QS*Z3`NZ0JT0D8H7zi!;zpaC}VQI8oQQ-6>Op{pA0Y`2G%o|H378moY?;8rjhwci)(Rs7D1n)n{%2saWo9r3 z4Tdu>GOcGjHjR8?-OoKWY+-PKE0HqwTgQuZ5_&y_p4YVQ# zIT)UJpbiEP_L$rUI~d&KU}Vs{4|Onj$OqJBggO}9$^XxwbRX*A`%njihr1y|KVSz# zi!c#z5`opVObk5tp$-PO2N@aI?lUof9ef|j!OUww^J}&&piZQSEi*Xh3fMA(r|3W< z!l1bnK3mYZG_NhF6atZ;F=9~t$zuzeu;aD`B?m4j37Wd&v;}o7Ic!D2a~)!)pfMcK zR34ixsH9@G1=Y1Iwvwid49wsz3zIFV%fe_2Y9ju(1&?Ke`uU6wruEEgKz+bz5a&&U zI&T`(dEoBje+Is3VCPK(J8v3jz>#Mf*m={y&YK2y9+U(-ZyMNn)4^Ld_o2=McO?Ha@ZASH?>^Xh_rcD) z4|d*tu=DPNod+es&btqG-hHt1?t`6oAMCvQVCUTjJMTW&dEib26Sxz>cpvP%`zX$1 zZ7{9pYOt+`(9@vweJDLD&UC=Ep4Gv&9zsup(t~3@9eI8qd2XHA!B&t#*H%CeG|tAa z%%sP}plK@zrqykQm6`OI8RTtQ7(|ts^;j6hY*`tY^(2&8^duNq_2iX#^_V0%_4Jil z^;je=m06%9v!spE9#vJ&TiMJ+s3!K?dDvpys>wH2zIY_n8

$($WLQo5Z%OlpM^ne8Y=_yeThvh_azuu@5^uEz0cIcd0&4M>wT6U z%S|j$lDWrf6Z3th9&3>99>q@ava<&1wo?q`wBrk8POoQiva4rdur*=e0=3QcxEUDr43v5F>KSX4nI+AY znI)O^m?iZgv~oR*gJeAm!!#2HE>IiyJ~sp7eS=Lr_v;yJHZk{@Z({CYzR%pF51}{J zvpDqBvoPE@Vc-I_71OyH7}E^`dD80{YXX_=%mbP2nA4f<^dWR$J&S`~J(IC5D+6d& zn^lj6K@YTGLXQ;`BMhpx>ZCnOTxa&jKuB zrOc=osLUoQr(DnCCRxv9JdKqBG!M;sp9Nf>GTmnd#TkR@G0a2#{Ga-hI{W(KBo z^*}BLP?}{**9zoJXJKGYHw|P=XS8EVHxFd8V@$UU{BOq$Wt#;u+cBkEfJLkV8Pfv; z+3e&3>sj3F>X{mBnLs12dZ5{p|KPl5VaueZ5U4~}I}8=Fy&1FWCNRtRh!XzZIwk6W2hkBNcHRz#Ue zkDcMa9w@)FGcenVDYNP^O8(aqQfAj7eCeR=)sFgeIKR7pAOk>)_1nP88W7))bpP9jA8YsqD7!0Oy zY+||3%pf$4i-CU{&nD*kpmA2v7&Q|E?=*gJs^9>vR=Cdr*3UCd2y7l`?40R7_a;yW zo@<)OCZ_xB4FB(gN)UDi=4oP^Sno6T{J$@>iTyqcgVZL*9>)7pn^^BlZu;NDbl+;z z-=6#Tt-++qCYBziO{_iaU^S|c+{M&zp9wUcn+}>m`4281EbcP}GNm&znBQj!WK3sf zFu4y(AuJ3A_c;Pt(wP~A?sGBl-{%QrP6rLiGBI$bGcoYq=Le@E4$yjpbPlk7p8G;z z^FU+oOzGT#jOk1aT=zu+nbO%A{-=Y=Bz6Yo`(lBt>5O*&(}e=r(^(j#0vYWX)1?Ag z(DuFC^Oo6O+>|iyjko?ZFA2f$<%fi5J%gdl(3(BV)4BUE5 z3^Je@6+I?pPCZU#COugOW<42YCcXcXQhG|@d~5?sBa*hD6ecMPiA$FKpxNnZEDY?^ zco`I?f$|s!12<@R1~fZzpJ@~4ea=lx_hlKF@5^jry8pjN>b?><588m@tH%};+dZ<7 zaAnyKn)kiW!oYr?mq7uPU(-1lxYL;!WI!_==}du~>70Q~>9P#W=`w*#>HqDd(v`sZ z#|9L3cDA69x08kVk?E=}8-uAW69cOrXc~fvfl-e|nMsd@LCcnzfk}^DnMIEsJV3~- z$E(b)$I2jO%f!H>C$0=q4_Yz9V#~t7q$daRF$0S&2g83oRt6SuIIuDB>!~ZV>9I>P zD*x9rQDy_zUCes*j1G`6VY)hvjlmQ&SORMLf>S5UCZ_u=3|io_h`-5}Oq6dv0RyG2g^?pR>ng6X$(4Fq^fEkTLx~I1hrzzv*^hHl*dlXlDb>r=Z$S0UCzJw%iPQ zwyX@CdZ0BLEDWrA?8;1fYPQS_EPDLPT(;5-ETGV`CedA5cJuLV2H?j9H-`9kOt?_+s2EF^N44mnV44U^@ z7+BNU1DVp*?lUv6r1J-I-Ir!y0fpjyP6qLGPzf#(2&yMUz$Le2AgIjyZ^x8w3FcdY zOL_}%s{z!eV@fv(WU*sTHx6XBV@cN!WVd5Z*Mx?%gRMA&x~-TVJA;C)s4}}ACxf`H zj54R51cR!wq+UIffHJEjn=&)F_2mF=bBi;mPZPV(&Y&<&bQ3$sJ=0`1ao(3;P~9YX zzn)286KfCKCT4K!$N}7H7H3euFP6^Epm1L_kUbp~ZZd(K=@Ja8fs*O(FPC^Jd2 z>M1BQ>#<34C^Jej>uG??-+#)IOnQc(;#<-}nGIZwuz*Qu_ko20+R$KQP@E>h@P88< zr~sJ84qAB7!?sD}K05>3ecnwh(CVM5=l^|yO-wzk_Z2oV-)HOL*u>bwd|v}x-2U6t z!*t&eR9g2~Y+}0)Dq~o{B((3q!T@a(urVm!7h(7x$d(Q&x!4(m(i!d80!7l<8Q9W! z16iOoHIv={bb&x7JJxiCK<0EdJB~m`JLYr^aOwIl(2gnH5L7tZSp>3y3m_IS3GFyA zO|=zb(6nV{5YXdgkOWuRe9F9f%;2@hOyFPwEoNY5VAN9sH~84VRlJrmiykAxe_Iv? z7Cj?SF~h*3XQ9lb2P$&v8TTnON!ma%2-DPQLJXSIm>C4_^D;<+t8u+vzLf}1s< zf*910Wt4<8Ze*1~g|IBRScb4c;>?m#ps)jzY?9*ON}gG{o=HKno^j7KW^iW{RHgGw zV+B=Eo0#wOF|dN0I-tTA)X-$?fi!qzH-QRXS#VJdVS~h(d!#^N2PWBi#K9Fg^QL+x zg`RrGJ@=Wx-Ahol&2yg>RAmJ+r}Htef}1~}0vFT}WVC}cf@A|hg{>^O_=T`R;>>nZ zps)jzYoskLjYxiwgiCoJ23zN DV4I&| literal 8164 zcmYe#%q>u;NKR8IGcYt{U|?WYU|?XF#sC2zT9AQ(fsv7cfkBvofq}z$8Uq6eGcYiS zFfcH%FfcIGFfcHPLD?X6q6`d-?hFhJyda}>lk;wc z6x=<113)qYV5OP4iRr1j=|!0-ATdS;21W*r;*!doRE6UFoXiwWE{(MGaAgvX}1&PU-dFcv2&5Q_*`abE^Hrg2kdz9D{r~@ekXx0J*sugw1yY2-OlJ^mcql;K z#SHQv0|SG!CPa<2DU^1E(!LNHM8frgtOO@Z1_qV{kPHI@O97OIgc<|O1So$2l->ZP z4?yV)Q2GIs{s5s_Aru3v0EEE`3PVuzI6(O9cOW#U1cc_=0ik&+AT(bDgcb;a&_c2h zS~w9xi~NPq;-GM6U|^8A3*k#aQ;bw5lwS#@JE8PUD7_L&?}XAPq4Z5C{Sr$5gwWEU zGy@7>NeG{TpriKjsruqy5rg~s3XsQhkFELX! z1_@IY1{qTY26Nd8x5kom8`Apc*MLFvCV zgUWviaJ*>!7h=%;F944lv;XW2mj6L%?$-Z$wwnwr(0Jhn$B7Puu&D+-4irpfz~Qf9 zD$Jk=HRdgrCm_?Gcnki{%5FXIbb^Y&6~l%_TLPep7j|7|7$ad{8tBu zo$P;k2F3r<466Ud88rV3LBori!Sp{TgT;R~2Fw4f4A%dd8Eir6n$_WdJ^O!#|E6{f z|4pqKm`$x1SWGP$SWV3t*umJ0fy2~mGf!oxGfd`!C^`U7VQZ|U0sxwG})4C!! ztt*>K!PB|EDKEHesAp0%9e(!gXZZi$mVxoVH3Rd1D+ZSTmf$jm{l6Il$A41>&i^J1 zT>p*1=^a$&@cq|k;Qy}&PU~X-)fptU)11_)Cpk3H|6h(l@xKg%@_$JNwg2MaxYCA~NqpcqgVh?fZ ze};PI*#GtHtk8M`l(#^2hdBd>sVOub4H)>qaR@4}G#McEhAM-UsS;A%A;q9#DhbY0 z8qj(d6n_S$ybOk>JPgLBoD62B>Hit8ere1mN`yC~j35r2Z>2NdH%40M-4Vcm>t}pfXeAzbJ#|e_;k4a9zX4VECV# z!T3KHgXw<`2J`={43_^{z-G7lA%rhb1<0wXJfGX532N@ z{Ree~Kn)-kQ!{A63~JPaGA*P~mNZpnkcL;Pkj6Z$69j5df+|uIa3RdXP|v)|bkLi} z-oWtxza0bPe@g~7aAU=Yfe+jm*Jcp@ugL&uh%13J38;Vs6^@{WIH-Z5{a*lH*@42) z0vv{~|JSp(GW-WO9zhua6po+F~411sV^aN(+?6jTj*58xa?v#-h}JP<+TUKpG;jj*%ErLj;tz zdB7c4P`p4IA)wBy`u}?N1JFjk9Rs5&sG|?+$XYY7KpXsQ;0`UQVF@a+U}+yzVrejd z8u${XY7C$}AY-b;AdA+ig;Z7|4BFs^C8%Qyi#t#U3)CoKVW?-AYdY!%SUAA)9;owR z%fR&ChJpFNH3JKDkb?ccDY)YRYLtRH4WPja%nD42K?dA-L6mo@|3MuHLP$xoxK>=J#fd(;T z7?e$=8C0S9RozsaK@;2{1;st2W1(j%zyNBP8i6|&koboT46&Gw96Na#nEzWcaQru6 z-~kVG=)%iXP@_`@oR2{bPXz`AaHj$^&>_R1@?VNU6>DS3|yun3_PZS z4E&~i41%US48o>d3}U7n3=*cS43c2X!XRY|!pscPrXbA3AY;nNAPdL;8R{ATn+|>R z^%5)59y#dzjob^U_!kH*51|<3L33ja3=Hzn`5k%CTo;IM08t=s1EoEnG<2Rv9y$*t zp92-IfYL2c8k96a=FEZeS3qd+T#RkK0K>F;0fzha0t^Gs=3ua`=U|vt&oM~cgB&Kv jZewk*t!HhRR?pgSzkV>VnGV?2GaZ;#&vf8EsYMY0VDy4v From 0ba497db977c406818140c905bcc90989e95dab5 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sun, 4 Apr 2021 15:14:38 +0300 Subject: [PATCH 17/35] Minor fix --- Drakora.pyw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Drakora.pyw b/Drakora.pyw index e119e60..550ae6f 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -94,7 +94,7 @@ class Drakora(): self.speedUpCheatLabelCD = 0 self.speedDownCheatLabelCD = 0 self.speedResetCheatLabelCD = 0 - self.backgroundgOffset = [0, int(self.fourScreenWidths)] + self.backgroundgOffset = [0, self.fourScreenWidths] def __init__(self): From d986804c64ef57fea99d708683748f4cccffee92 Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Sun, 4 Apr 2021 10:20:21 -0700 Subject: [PATCH 18/35] Init leaderboard menu --- Drakora.pyw | 57 ++++++++++++------- EndSceen.py | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++ leaders.txt | 5 ++ 3 files changed, 199 insertions(+), 21 deletions(-) create mode 100644 EndSceen.py create mode 100644 leaders.txt diff --git a/Drakora.pyw b/Drakora.pyw index 16e9a65..8c44d97 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -13,6 +13,7 @@ from StandingEnemy import StandingEnemy from FlyingEnemy import FlyingEnemy from Cloud import Cloud from Floor import Floor +from EndSceen import EndSceen class Drakora(): @@ -55,6 +56,13 @@ class Drakora(): self.speedUp() self.speedUpLabelCD = self.targetFps + def getFont(self): + return self.font + + + def getTime(self): + return self.time + def newGame(self): for enemy in self.enemies: @@ -87,6 +95,9 @@ class Drakora(): self.speedDownCheatLabelCD = 0 self.speedResetCheatLabelCD = 0 + self.time = 0 + self.endSceen.newEndScreen() + def __init__(self): random.seed() @@ -121,10 +132,10 @@ class Drakora(): self.drawBoxes = False - font = pygame.font.match_font('liberation mono') - self.fontScore = pygame.font.Font(font, 32) - self.fontMessage = pygame.font.Font(font, 56) - self.fontGodmode = pygame.font.Font(font, 12) + self.font = pygame.font.match_font('liberation mono') + self.fontScore = pygame.font.Font(self.font, 32) + self.fontMessage = pygame.font.Font(self.font, 56) + self.fontGodmode = pygame.font.Font(self.font, 12) self.charKeys = { pygame.K_a:'a', pygame.K_b:'b', pygame.K_c:'c', pygame.K_d:'d', @@ -138,6 +149,8 @@ class Drakora(): self.pressedKeys = deque(maxlen=10) self.isPressedKeysUpdated = True + self.endSceen = EndSceen(self) + self.newGame() @@ -167,23 +180,22 @@ class Drakora(): for floor in self.floors: pygame.draw.rect(self.screen, (255, 0, 0), floor.rect, 1) - self.renderText('%d'%(self.__score), - self.fontScore, (255, 255, 255), - (self.getScreenWidth()/2,20)) - if self.isGameOver: - self.renderText('GAME OVER', - self.fontMessage, (255, 255, 255), - tuple(i/2 for i in self.screenSize)) - elif self.isPaused: - self.renderText('PAUSED', - self.fontMessage, (255, 255, 255), - tuple(i/2 for i in self.screenSize)) - elif self.speedUpLabelCD > 0: - self.speedUpLabelCD -= 1 - self.renderText('SPEED UP', - self.fontMessage, (255, 255, 255), - tuple(i/2 for i in self.screenSize)) + self.endSceen.render(); + else: + self.renderText('%d'%(self.__score), + self.fontScore, (255, 255, 255), + (self.getScreenWidth()/2,20)) + + if self.isPaused: + self.renderText('PAUSED', + self.fontMessage, (255, 255, 255), + tuple(i/2 for i in self.screenSize)) + elif self.speedUpLabelCD > 0: + self.speedUpLabelCD -= 1 + self.renderText('SPEED UP', + self.fontMessage, (255, 255, 255), + tuple(i/2 for i in self.screenSize)) if self.isGodmode: self.renderText('godmode', @@ -267,6 +279,7 @@ class Drakora(): for event in pygame.event.get(): self.player.control(event) + self.endSceen.control(event) if event.type == pygame.QUIT: return False @@ -275,7 +288,7 @@ class Drakora(): if event.key in self.buttonsQuit: return False elif event.key in self.buttonsNewGame: - if self.isGameOver or self.isGodmode: self.newGame() + if self.isGodmode: self.newGame() elif event.key in self.buttonsPause: self.isPaused = not self.isPaused @@ -287,6 +300,8 @@ class Drakora(): self.doCheats() if not self.isGameOver and not self.isPaused: + self.time += 1/self.targetFps + for cloudGroup in self.cloudGroups: cloudGroup.update() self.enemies.update() self.players.update() diff --git a/EndSceen.py b/EndSceen.py new file mode 100644 index 0000000..27d3e9b --- /dev/null +++ b/EndSceen.py @@ -0,0 +1,158 @@ +""" +Enemy entity class +""" + + +import pygame + + +class EndSceen(): + def __init__(self, mainGameClass): + self.fontGameOver = pygame.font.Font(mainGameClass.getFont(), 56) + self.fontLeaderBoard = pygame.font.Font(mainGameClass.getFont(), 30) + self.fontLeaderBoardActive = pygame.font.Font(mainGameClass.getFont(), 30) + self.fontLeaderBoardActive.underline = True + self.game = mainGameClass + + def newEndScreen(self): + self.playerName = 'Player' + + self.scoresFromFile = [] + self.data = [] + + self.isBackButton = True + + fileWithData = open('leaders.txt') + + for line in fileWithData: + oneStr = line.split() + + if (len(oneStr) == 3): + self.data.append([oneStr[0][:10], int(oneStr[1]), float(oneStr[2])]) + + fileWithData.close() + + self.sortedDataByScores = sorted(enumerate(self.data), key=lambda i: i[1][1], reverse=True) + + + def renderText(self, text, font, color, center): + render = font.render(text, True, color) + rect = render.get_rect() + rect.center = center + self.game.screen.blit(render, rect) + + def drawTableLB(self, number): + j = 1 + placeFlag = False + + for i in [i[0] for i in self.sortedDataByScores[:number]]: + # print(self.data[i]) + + if (self.game.getScore() > self.data[i][1] and not placeFlag): + self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + j*50)) + j += 1 + placeFlag = True + + if (j > number): + break + + formatDataForOnePlayer = ' {0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, *self.data[i]) + + self.renderText(formatDataForOnePlayer, + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + j*50)) + + j += 1 + + if (j > number): + break + + if not placeFlag and j <= number: + self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + j*50)) + + + self.renderText(' {0:^10} {1:>6} {2:>8}'.format('.....', '..', '.....'), + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + (number + 1)*50)) + + # for i in rows: + + def getScorePosition(self, score): + counter = 1 + for i in self.sortedDataByScores: + if i[1][1] < score: + return counter + else: + counter += 1 + return counter + + + def render(self): + self.renderText('GAME OVER', + self.fontGameOver, (255, 255, 255), + (self.game.getScreenWidth()/2,50)) + + self.renderText('Leaderboard', + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100)) + + self.drawTableLB(5) + + self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f}'.format(self.getScorePosition(self.game.getScore()), self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + 5*50 + 50 + 50)) + + self.renderText('Back', + self.fontLeaderBoard if not self.isBackButton else self.fontLeaderBoardActive, (255, 255, 255), + (self.game.getScreenWidth()/2 - 100, self.game.getScreenHeight() - 80)) + + self.renderText('Continue', + self.fontLeaderBoard if self.isBackButton else self.fontLeaderBoardActive, (255, 255, 255), + (self.game.getScreenWidth()/2 + 100, self.game.getScreenHeight() - 80)) + + def control(self, event): + if event.type == pygame.KEYDOWN and self.game.isGameOver: + if event.key == pygame.K_RIGHT: + self.isBackButton = False + + elif event.key == pygame.K_LEFT: + self.isBackButton = True + + elif event.key == pygame.K_RETURN: + self.saveResults() + + if self.isBackButton: + self.game.newGame() + else: + self.game.newGame() + + elif event.key == pygame.K_BACKSPACE: + self.playerName = self.playerName[:len(self.playerName) - 1] + + elif len(pygame.key.name(event.key)) == 1 and len(self.playerName) < 10: + if pygame.key.get_mods() & pygame.KMOD_LSHIFT: + self.playerName += pygame.key.name(event.key).upper() + else: + self.playerName += pygame.key.name(event.key).lower() + # self.playerName += self.game.charKeys[event.key] + + def saveResults(self): + with open ('leaders.txt', 'r') as fileWithData: + tmpData = fileWithData.readlines() + fileWithData.close() + + newData = [] + for line in tmpData: + if len(line.split()) == 3: + if not (line.split()[0].rstrip() == self.playerName.rstrip()): + newData.append(line) + + newData.append('{0} {1} {2:.2f}\n'.format(self.playerName, self.game.getScore(), self.game.getTime())) + + with open ('leaders.txt', 'w') as fileWithData: + fileWithData.writelines(newData) + fileWithData.close() diff --git a/leaders.txt b/leaders.txt new file mode 100644 index 0000000..9e0f24f --- /dev/null +++ b/leaders.txt @@ -0,0 +1,5 @@ +Kolya 1 11.37 +Coolguy 1 10.75 +Wow 74 185.72 +Player 0 7.16 +Cheater 1000 0.01 From 6cdb2c61dba0bfa8dbf34b0ddf6928ce2136592e Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Mon, 5 Apr 2021 21:19:19 +0300 Subject: [PATCH 19/35] Fixed BG sprite glitch. Minor fixes --- Background.py | 38 ++++++++++++++++++++++++++++++++++++++ BackgroundLayer.py | 27 +++++++++++++++++++++++++++ BackgroundLayerFrame.py | 25 +++++++++++++++++++++++++ Cloud.py | 2 -- Drakora.pyw | 25 +++++-------------------- FlyingEnemy.py | 1 + Player.py | 4 ++-- StandingEnemy.py | 1 + data/background.png | Bin 3821 -> 3813 bytes data/background.xcf | Bin 13599 -> 13357 bytes 10 files changed, 99 insertions(+), 24 deletions(-) create mode 100644 Background.py create mode 100644 BackgroundLayer.py create mode 100644 BackgroundLayerFrame.py diff --git a/Background.py b/Background.py new file mode 100644 index 0000000..92bda5e --- /dev/null +++ b/Background.py @@ -0,0 +1,38 @@ +""" +Background entity class +""" + + +import pygame +import os + +from BackgroundLayer import BackgroundLayer + + +class Background(): + imgDir = os.path.join(os.path.dirname(__file__), 'data') + backgroundImage = pygame.image.load(os.path.join(imgDir, 'background.png'))#.convert() + backgroundImages = ( + pygame.transform.scale(backgroundImage.subsurface((0, 0, 800, 150)), (3200, 600)), + pygame.transform.scale(backgroundImage.subsurface((0, 150, 800, 150)), (3200, 600)), + ) + for image in backgroundImages: + image.set_colorkey((255,0,255)) + + def __init__(self, mainGameClass): + pygame.sprite.Sprite.__init__(self) + + self.layers = ( + BackgroundLayer(Background.backgroundImages[0], mainGameClass, 0.5), + BackgroundLayer(Background.backgroundImages[1], mainGameClass, 1), + ) + + + def update(self): + for layer in self.layers: + layer.update() + + + def draw(self, surface): + for layer in self.layers: + layer.draw(surface) diff --git a/BackgroundLayer.py b/BackgroundLayer.py new file mode 100644 index 0000000..79a4fed --- /dev/null +++ b/BackgroundLayer.py @@ -0,0 +1,27 @@ +""" +Background layer entity class +""" + + +import pygame + +from BackgroundLayerFrame import BackgroundLayerFrame + + +class BackgroundLayer(): + def __init__(self, image, mainGameClass, speedMultiplier): + offset = image.get_width() + + self.frames = pygame.sprite.Group() + + self.frames.add(BackgroundLayerFrame(image, mainGameClass, (0, 0), speedMultiplier)) + self.frames.add(BackgroundLayerFrame(image, mainGameClass, (offset, 0), speedMultiplier)) + + + def update(self): + for frame in self.frames: + frame.update() + + + def draw(self, surface): + self.frames.draw(surface) diff --git a/BackgroundLayerFrame.py b/BackgroundLayerFrame.py new file mode 100644 index 0000000..e7fe2dd --- /dev/null +++ b/BackgroundLayerFrame.py @@ -0,0 +1,25 @@ +""" +Background layer frame entity class +""" + + +import pygame + + +class BackgroundLayerFrame(pygame.sprite.Sprite): + def __init__(self, image, mainGameClass, offset, speedMultiplier): + pygame.sprite.Sprite.__init__(self) + + self.image = image + self.mainGameClass = mainGameClass + self.speedMultiplier = speedMultiplier + + self.rect = self.image.get_rect() + self.rect.center = (mainGameClass.getScreenWidth()/2 + offset[0], + mainGameClass.getScreenHeight()/2 + offset[1]) + + + def update(self): + self.rect.x -= self.mainGameClass.getGameSpeed() * self.speedMultiplier + if self.rect.x < -self.rect.width: + self.rect.x += self.rect.width*2 diff --git a/Cloud.py b/Cloud.py index b327d3f..e25285d 100644 --- a/Cloud.py +++ b/Cloud.py @@ -23,8 +23,6 @@ class Cloud(pygame.sprite.Sprite): mainGameClass.getScreenHeight()/2-100)+50*(2-cloudType)) self.speed = cloudType*mainGameClass.getGameSpeed() / 6 - - self.__doubleX = float(self.rect.x) diff --git a/Drakora.pyw b/Drakora.pyw index 550ae6f..f478570 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -9,6 +9,7 @@ import os from collections import deque +from Background import Background from Player import Player from StandingEnemy import StandingEnemy from FlyingEnemy import FlyingEnemy @@ -17,13 +18,6 @@ from Floor import Floor class Drakora(): - imgDir = os.path.join(os.path.dirname(__file__), 'data') - backgroundImage = pygame.image.load(os.path.join(imgDir, 'background.png'))#.convert() - backgroundImages = ( - pygame.transform.scale(backgroundImage.subsurface((0, 0, 800, 150)), (3200, 600)), - pygame.transform.scale(backgroundImage.subsurface((0, 150, 800, 150)), (3200, 600)), - ) - def getGameSpeed(self): return self.__gameSpeed @@ -65,6 +59,8 @@ class Drakora(): def newGame(self): + self.background = Background(self) + for enemy in self.enemies: enemy.kill() @@ -94,14 +90,12 @@ class Drakora(): self.speedUpCheatLabelCD = 0 self.speedDownCheatLabelCD = 0 self.speedResetCheatLabelCD = 0 - self.backgroundgOffset = [0, self.fourScreenWidths] def __init__(self): random.seed() pygame.init() self.screenSize = (800, 600) - self.fourScreenWidths = self.screenSize[0]*4 self.screen = pygame.display.set_mode(self.screenSize) pygame.display.set_caption('Drakora') self.clock = pygame.time.Clock() @@ -163,9 +157,7 @@ class Drakora(): def render(self): # self.screen.fill((102, 153, 255)) - self.screen.blit(self.backgroundImages[0], (0-self.backgroundgOffset[0], 0, self.fourScreenWidths-self.backgroundgOffset[0], 600)) - self.screen.blit(self.backgroundImages[1], (0-self.backgroundgOffset[1], 0, self.fourScreenWidths-self.backgroundgOffset[1], 600)) - + self.background.draw(self.screen) for cloudGroup in self.cloudGroups: cloudGroup.draw(self.screen) self.enemies.draw(self.screen) self.players.draw(self.screen) @@ -299,14 +291,7 @@ class Drakora(): self.doCheats() if not self.isGameOver and not self.isPaused: - self.backgroundgOffset[0] += self.__gameSpeed - self.backgroundgOffset[1] += self.__gameSpeed - - if self.backgroundgOffset[0] > self.fourScreenWidths*2: - self.backgroundgOffset[0] -= self.fourScreenWidths*2 - if self.backgroundgOffset[1] > self.fourScreenWidths*2: - self.backgroundgOffset[1] -= self.fourScreenWidths*2 - + self.background.update() for cloudGroup in self.cloudGroups: cloudGroup.update() self.enemies.update() self.players.update() diff --git a/FlyingEnemy.py b/FlyingEnemy.py index 990ff70..ed16cce 100644 --- a/FlyingEnemy.py +++ b/FlyingEnemy.py @@ -22,6 +22,7 @@ class FlyingEnemy(Enemy): for image in images: image.set_colorkey((255,0,255)) + def __init__(self, mainGameClass): Enemy.__init__(self, mainGameClass) diff --git a/Player.py b/Player.py index ee06e49..52594db 100644 --- a/Player.py +++ b/Player.py @@ -34,12 +34,12 @@ class Player(pygame.sprite.Sprite): 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): pygame.sprite.Sprite.__init__(self) diff --git a/StandingEnemy.py b/StandingEnemy.py index 66fc0e9..d5f923d 100644 --- a/StandingEnemy.py +++ b/StandingEnemy.py @@ -64,6 +64,7 @@ class StandingEnemy(Enemy): ), ) + def __init__(self, mainGameClass): Enemy.__init__(self, mainGameClass) diff --git a/data/background.png b/data/background.png index 0b5fcd7cdde64edf72397e923c4779f87bd2c4fa..e2fe42d714f0c4e5f76ba0ad9afc0a216c2091a5 100644 GIT binary patch delta 2875 zcmaDW`&4#{ zwlkKeA51gc@SLlNDROGq^#evlEMm&>Z}mP2FS~j-CZFd`jQ-`+X}9z5zSg?9^m`pg zTi1cCT4sg2E9d!c-ho5tM%++tvhzDacX_4cj2?% z6Q_4sy**WBUd3+l=WOiM!t(;pZ*|sa?ycd`IBM*0`AqR6#>**(mx@1kaH|UXY_=+^ z_T+-t1lxVW%Bd(}M2T z#{Yhk@Lha<`IaTtSFgVBTw}F}nK}C*d<^AQc z3Gby>IrTG3kEpK=JIkhS?|quBQhZbWg2<0g)=ODVWzIfdKJgCQi)uNocZZe-)_u|b z&9LqhPxaa}QtP+y-AdhR6X^Lq;=TNh*tq(yjF%s1+;TtZ5gTp1;akra|z!ecjvC|96%|X7)~uJU;iKS?|{WU%zKfiJDw6&Dufsetm0K_aTPuJmxaqa}P)< z7u|jz*8C>v_>Jyz{b!7J<`W|w{XSisoOsFC^%8%Ibj{i&zXHF!o%EyJSxoNqy#rE3 zov)(9_qHXkdu^W+ysWOvFY~D7$>Y6Cd$z0gMe9p%d2?~`(qD=)yJS-IZ-pM;q`hI2 zd)}XDrn7Cy%^NLLe`+4(S;B1bqjz=5U)hH$@{{>lcovCX;*D>P5>J zt4liZ?){bx?p~{Z)X%(HZg!(`>5)n~)gL$3nJO>M{@7vYsO?UK)&&F`>$qufI8FDljF&UAfnPO8?MTr&S(dAw11+~(T&|F^{N|Gk{3id{4#~PhXShnYna3#alsm~^wC#KS8P`s=IRVz~ zPt|RrqV~!dFFnxp+4w?ly^Zoerm)nTebXk1ieJg_ew^TL@_|R-XN$hP$4mIvw@39tyRtU*{pWsGx&7$!Q)_-y z_kRkS^0aWH;kOFI^%r(upT8(DFa5-8?sHo;?D=N@=U(%m^|f{6)^~kNe(!yMrM&<6 z4YB!(n?Jpq>b&=p>SLRuAL=R3zcHdQRYClk|e__g-@1BXUUfuW0y7%ec#}eCLZ}KlFp8sjaCh7EPm+$HL ze){*`D0X?y?CE-y`Dt(doSoXZenR55esxXe-4A!E7uP>He`@kMrl zHtCmKgYD~8bN9Bh9opx6Z+i2luN$}5?7LjiCHK-Y{BT>S-pcmVZO5!`i>37NUs({A zzf-`4lVi=V-luH(3~VbkI|B>1yU&R}xo2~$MM2l999D6@i*tKEm=*hNPF+!$Df*3VdiG_r=^+|7@e(r7!PWhmJlXu(v-P8ID-ang{ z^lrD7?j3Wzn&|0wa%=7HU2PQA-E3CRyRcW;@ARtOf`;s0o?ZU*>8;sE(MzkYDXjdY z+s+&Q?v8LW``(wQ=f~^RKQ;SW_N9Y!TXjh8x^=4cZ$;CWzK{zwynko<n-u+qfRbTeei$N0VPun+5*Z-V;V&%Tcv5Mtf z+F#C1FF%r1e&J5gKgpfEbHmH`hyT+qo7W=0|9|4FWsI*@-Spa6eEWmN@3p^5suT6% z?_V~&ckTAES<7Ck@Bfq8s##T^aF%yUm-T58*U}5WZSPskyM4{xchTvy_1_Jq$^5=+ zWFMDS`m^iByrqw78SGaX)u+Y>yw00mKJA6$;b+I+*GuI8>e^#DKf1E~oaph z?p4wG#@YX6LX9_UyEi1t7?>j@7>$`W=81jqsIb8 zYjW1CS{MBEdMUf2l3WvlmbQNM)u;?AUl`M_1We+r4YJnBQ;f z_y1uRw$p4kYgpwu+w`2dPu7JVk9~iu`u$V!51+zr)-l_ZhJUw>+U+qXeSMBl^4rwV zA3x&i<->QHEoQlP=!R6${PMr)%vO&>_da~BzLo2|(#MjC9_HS6>~d$8Of&B1-8@gTe~DWM4ftd!I) delta 2919 zcmaDV`&M>>BL@qoxvENT+^>nA8u96#E{-7;x8B~}yH3Sjvf<&(t85(Y9NsPN9v&=e zw+nW%9}yK$e7jX3`jOZKj~%VN{%K4q>a&|=9?f{LAaTabbuZ_?TJ?T)-MkZr%&hMQ z$9@g-KmX&;$J_eq3=FR-pNmZVyLqx6C(q;$9IBH)a75HM#O^8QVo+Fcetz7&e~%t- zkDtTa$jT7nv6^4rZjRsb>(|58RTgj7JEq4K<9KAvYV-B$*R%B>NV?(uH&;CMfXrr| zb&|}{>lD-{xMr4e>L|M>7=F6?PRTwY>h77Z#||9(Y80Ec^Y692>x5#f^4k+uaICpz z&Twh&tM>5SU%zh1oLX-#$h2;HUHW3VT%LF4%Z)Be(IiY93sR!<6v03ZsR@m4afF%N5n1Nq~qPX%S!gQ z-L(n3x434es$7ZEKRoZioAUL-S066ADD>IkShdRkXE!fjy?VoH!=@a~zWP0al~LjC zv61<1?-|s*|6u9ww3%D8*Rn}^uasw=Rs3)9(v!Qm4GyjO{pIWP zs#68$rtVJqu!UpIr^)l!_p=KWh^)KaRL{S2&AG}u)jjX^POQ<}uJov9>6P;P)9tKp z{5|?yR`;b}>DOwd?!JuU2WC|=R9=79#T`1wGW+XP`zOu4#rN*JudNAp#}D5KMKIfJy`JO6TPkNJcZES-eBF+3LVqoMo3~g+ zrM>-F@3}g3^TCtnFKu$X*ZM|2Bh2P!x0~P71GhfKs%&TcHLtyE_lL_G_P?gqGK5#Q z?F~!o4Ue*ZyD4hkiY4W1w)4NyTfhHTLuP@<+r=qM)~%I{h<5YuI*_$Fru0tK(t91{ z`@e0f&%3l{%drz{{+=tCeeBl1U)82wYdtMa%P#19?{w6)KCvOXO}lTYUqY|o&bQ^O z9m_T*zd5>F{4>M+*(cU0s8_x}Y4CEH(o6PDy!*m}{%ZUx^Zc`0(YQY~JArqn%h$E5 z;|?2M|0=&tGuYmB`Ibj>p8P!)bnLd!@3qr;qsrc24Eifj7R$Fu{OzLTn<5c6mCgU@ zHl`ikcre07^{3|1CCnC_KYCY}{FQyE@_sT8t9-rYf%lJ>-VWfK8D_rt(UaLTtmE~q zd;i4hze?M#v`XITx7htUj>_}jR^At1dYXNc#fD>b7j}D>mCQf1tEPJY^~W2}*0E;I zuzqOtddeTOvI)-vA3e`GI*oV7jq>(73gvQ=k;l>Ljl-?I-~yta0(pT~OT zv!6=8%wVoqvZbqjeq?QWb8ooUoacc}{cod;gLa9%|Djx|nYT07a>CBWt54ZWkNr5< zbV7Z}?}^)fGJG+)rd-lFFXjBaNWnUfoYSe3-d+Cx&imQ1>}~H~$Nze?d;hJgi>(fY zT0Y-$o@-5CbQfbCw_eUfp8t{=6aJo+Fh9&cBXZ%nZ(Z3c*Oh-dp8HlmZKuY?7U8Vt z2LD^!y;mOV}JUQ_yenSZeI-A^r%THH&fC|&4I%kIY^Cuc@cyvZzw?0etBGa@-Cwr3fl=?sWE!BR1<+;s2E0Ouh!mP_)Z|_&n=HX{!Ze)*FM%Cw0XbnN5D+c z`uBlxU7Kw5%#O+FKNGF`{43bx)K{L$%7Z(_p8ih!T;C|Vr=V7S^|iYbOZI=C`|I6D ziQA8qQ^M};Em{$7mp*5?#65q071!?clT%9cE6#2GdH;Y{_>N0irD>{r!^JDF*PV%z zsn^*&iEl|y{}q+0D_aW`-sycVxiLq7dPdjAN7j*{V(+iaZa!_eY~Oo{|2L06P6@lT zXs=A&BKNFIyzkqmuhJDTKK{RQ$!tmQ^s9mO%Qx;Rmw8+k`;9a2Rj^!e+2b=sw`MQ( zy!St5+3P8#pD$UyKikv0f2Yw0QKK{8J}RUpn8$oisptC>S$Qc^Po zUGXLj#>UY78}B?|Wnj71RD0>b{dvp`MV00U4ELm7{+hpkl{SMz!rL1Wueca8-q=J` z+Wg5kSP2pf&EQ?bUCPS9p~KK{=bk0&WL-|>$@@9EC!29ffoP5o_V4RIwePps+|99q zv3_qkSH+9Z%csx&{}fbhh%pF6tm$8Mzvk!TxA$u+FGe#M9KUIFvNS4o*Q@*W|DT_= z|9sUvKK|dY-P7&w|A}ShY$%QX<+@47oayuoJ6qq?PMLSVOnYc@AmM`=Q|_|4zx%!B z?Ye)j{jEV`=@HSAEFXK{)kXOy*OV-NRHsrQ+_|Toe~Yk0{;kL@@9yNke_j%?eqmAE z_w|xDJD)9Ux7@mJ>9h1{f|HW^c1yB-U;CzNd3fN|_qk{G_a?e_Ukkk&KEJ5lRB!F; zi8c3%n$Iohv9!Ire>pGPm#-W8Hk3Yi`C*2XsCo5~l~d1HM|UtUUvVm|;F-YP6CC-* z&rPD+q^5@@<`>ledwRca`%|~pK#APq3)wREvKQLCjtLrVomBdBn)7${WAp6xM_9PB z{hxC;;rGt$e;nWQ@-(0ATYc$F?c+1sOV8cCw*7IeOvFW_?621aZrymiMQ4|^V6nq` zJ6-?#dBX9EYqNMKY27c1D17Q?Yq;(5Y`gzIkA4cz3(j}{J|khb`_=kauV!72D-7#; z7byDqY^_!2+S%Q5axYIEn00Cm8*}PQ_ph>{JNfjV8+(V_%AVDB^M1JSjp4M7d)0Tx z9{2qDarYsvyZYPm8#2z5Ltup2fUd z*X(`j7oDFUCw8}OXXLZvr`PDk3*OxnvWNFUb?CG8Z@9DWzWsDe=x*kXKR^ERKlY8E zX#PA{`~9(V;R(5t?Ckd++MuG`u^Jv8w_?Dvn1_m68`PuqS#>-^5+J!_lqY<;!kb!^r9y?>bI-P5|A*RcHE zt9|a?;+>D*O!ZCD*}I0TUjF{;$6D9ZrW}|h8SVV;vtE6!L;9Xo;WdAkgguN@k<$}; znb!Gwx$fk1Mb9=SmKia}1XQ1S`}&;Qkpr`&SXQbpSb6eA$%E<*!KG8bNAFX<+vTy# zL*;J&+mF0zpCzt-H(;N0XPI5v++wXo>|sZz@$5KkEZ-X#UU~gQvrlVe*%QrrqrC=G zXC80!U#EQhS{M7RD3)ty-O^8|gxej;c>n#1Pe`^@RYg*{E$7qipMLr8|F6D0?nXtt z>8_tg+;doOc1%C4eWF@q)y8G(zV9(#op#Rq`u`c-<>!7?uh<;2?|gZ!*17#ZF6Z}3 zGce}=HhDq&5(QaBhG P7#KWV{an^LB{Ts5yn*wB diff --git a/data/background.xcf b/data/background.xcf index aa18ecc24092b685ae412f0043d85fc5c1af36c3..877897831fe96a1c16c2ccf8ff49bb33f750b34e 100644 GIT binary patch delta 2324 zcmbQAwKikJFD5DDzYJht!U?7rOhloy;${)%{fv<*5U$z_2(3{Ap|z$!Xzerzt+N9{ z>&}4CdS@WCfeMsf1ECEcLTIDsn{`-?}vo@I4b2TtPX&4_y(^$NIpe%;kThG-1 z^C^r*_?YQ{X+5jM|9S|`0Hy!e3ow8%1C*wWT`#~uxj`HZ|LZvz80tYZv%`Nu2HpPx zdQ1%3|M``f^q3el{|ka?_5Z@kOnS@=^8Z;FM3tHKSQx|@|4)ulb&zdf5V)_$z`u#< zz7B)nCZ_vZ48oh3?rSiJZeqT#IQg`ygD%9-bg-d;OzB`l!L<5+;XtNzsG)((=`0Ll z|0i3hIkNsYVc_~dxlT=k(Q)!xH4P~LmYSyTe^v(5|I7@mdMpfj|Ctz=^jMXd^_Un` z|FbhN>2WDD>&gFTV_?@4P?rAB!oa2{t}G5#Evqc@pNWB4Pgz;uKQjZ9p1Lv@1JnP> z0qRc1#SE9y5c zGYI|XV&MPJqs*+w%)s-XiGfp(iGlY&KR84<{xdN!>T!Ve^ZXYAo5%M5KLe88ALWQ-DhX` ze;<@GxEUsY(sYD+Fdghca00OS&lJd%4)$OmV>;M_;ACL%pCgbZ9qz$E=5(kB)4?7D z2Q=7&=^SAFJpYBj=7Bw!&K<~@&cwj=UnGzzot@!-IzO0Z{y%w>mZRkV{|r|DSs2*= z^D-#>XJKI0<6z*{V`7l`Kbc3{kc-uZf%!fM1NVKU$&uPd7>d(57`W5HikD~``~GKR zF#XTOz^cc@UM@Hlu--RkV7$+=iRr#E1Jix>O)U3y7?|(#ZeqW$%)oSCd=u+^ z83v~Na+{d$^G{x=qX&0HI@A&AEP+hvP)DS*2ePC?9g)r($es>$M7nq&D>x*fj!2gS zha$`W$uhe7y#Lu4l>dt`u<9{_LM1}io{fc{f%U%X<^SvqrvDik z*z{N!4F5Cgu`09ZF)`@>=LQ!Sy#FN_SpQFs(DM*E#K3mnjDhh!>n4`_Mhx7WnC=@e zOg^IL2{#}eY(P3|AWJ&f0C3R&HNZgMQ~f_TgWi8u22MRj2F?F046J(W%1nA{|Ct$B z^!Syz{!25k=m{$`{-3-+KR~jCf%Cor1M7WuaDl{fpMR4Y1IvBkP27_u4FcdMr9(|h zXAfjb2b+}69|$%nT{w{O|Kte9I2?{1;Vb*W+Xm|1YD=sVBjpsw}Bj z&m^GCD#@nIEGeg4&*C6i&)mQu1}^*9?<+FMY~s8x!JxWH@_s#&z$VrnwoS}Ea+~T| z9D3@R9U$hWgUtD$ZE$H$ZRJk7g*2YU{}w=04*KZ7!?1D zF#K0$(-Q%OY@1;yw*xfKvfWpj{K+s>6rwU6sxpu*9jr3OD9rZ15QFA_W(EO0UIxkk zObje~e9F9f%nZWdl&JtNM|l4;Gcf9@f!S=}45FpXqQ}Va|NrFoMoOyJ7zFNXF|gd{ z+r)ccih=3A!Y1bXq701p)iyET=VxHPueFKgKKtYVVjp8*Ep)Rv=3{*sk@)${<;>|Evt4JjL^W@_pkV*1MoAFxkN*2rie-!oc%?@_ds9 E0R7-{rT_o{ delta 2413 zcmZ3RF+Xd=FD5CI_Y7cQ@*7Msn6g7@;msn<`xzt4AY63_#h|eP!qEBvp|!6-Xk8Bo zt!D(G^`ZIb&HR5W( z?PI0`ruD22w)GHt8kC-F&)PQGmzBqwgTc0*gJD`d2gCh(W(QkA23=bLJthWiTYhCG zJthWCTR||bZY!+Jq{qx4Z_C0Us?4m%!XRclIY!k%-(i{{gYGne`%Dbl)A%V!F@FAU}X{?iXsygW27i7@AFObf}pnab|kSU#sLG!*K zm{z|p9LSW;%piZCg+VlsIh}<;?EYjmHAhxk69z8Z$vJ8o>J}ZOieP#yMbQT7^`%DZ>>8ydw=}Zi&_t_bk(zybe)8+58 zF|el#1WMm$VPH!a4-^NhmJJlS&&0r-t{fe6Jmix>M zLesby_^0t~V!qGJz%z}Bf%85S1Mf6`aQJdeV`5;u&jHrYGffC=9^1743{3aAH-YTn znkKS|={`Hd|NEfS#?HXZIBoJYO~?BCObj;n8Pk~5y!QeheAWJ$kgV2302LAgzfz0X53_SOl7&z0J7Kq8LXzUFtAVKWl)&L!oYl=gMs@#6NAh&rpd3hj3n>> zXRx}@!oYr?mqFn^3j=dH2LpFH6NAkC$!6NdzP4-(rnXEBta?lghTw=|QD)L(VbB66 zTy|v^J$42~aAM|FX4hk7kg^43194@LdR|*b1{PZu1|~f@aOASsPTr=i8^CmR8XJS@ zG$sbt`%Dam;BaTz#B`s9K?|I6**CG=XJ=3Zr)J(w?Dtt2q`>(=d=p4L?=(gRmT4>u zO!wu$am6x?W3r%*p6`7&2GjdY46Nx)42IxPWC>(SXJOC+r(E_xmUMOoMR0274P;Me zWsm~r1MxtRdfxkt3@rCq7?{%Kz#-3ae{zqGKCdksgR-p%1FIe*C?rql*b6Y9pT@?Z zJWYgw^*$qm%rv&iyt)p&_t_Yf?~5?7rZa*!H##jh(@C8Y2VSeHI48X^i(-H?iDjV$h$)4KBWTr%5od zPMa*H=c#<3ox$`zBLiDH3xnZ(#&p&|mUJct{rlYDGK=@V1Ow~+$!&U`>bBerdbX?# zoO+B5nzk$qta|LqOnPdz%nU4g{K{Om(hMwm!pe-clfUT&Xc|xBX3(3)%D{P_kwJ4B z3j^zY_DxLp)uu5su-xb0#5GNtf#tsNCdO%;ljHRR)bDdM=-p>!;7n&^(7eyWz?#k; z$ds;jpP7Lroj;K4zBB_%x^N)l{mIw#1BGqH8PsjX^w=2`Y(vok2%7Y$@j=VTDSFB8a_F2SH0D4AZ*BoN4I#}>$JCl^@H;$TFl*ccRT zMHv1ov+0R2u-dXS2exX;TVIgN>dSSDu}DcRl^V$i(L%pj1?%OH85iGd}ZFOWB#nL!ww zk`=(^3CKvsbTu#=l&YB1wE|hv85#cHpM2a%8RSMWTUG{8_T{mi{M{&sf6p{#Q0>S7 d%6&Z3SSR}#2Z78GyU)r1$~`>yC$BYb002}EFM$96 From 843df27d16f29885a3f4a1bcd51b92a84fc47ae2 Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Mon, 5 Apr 2021 12:18:31 -0700 Subject: [PATCH 20/35] Modified leaderboard --- EndSceen.py | 52 +++++++++++++++++++++++++++++++++++++++------------- leaders.txt | 2 +- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/EndSceen.py b/EndSceen.py index 27d3e9b..a2aa7d2 100644 --- a/EndSceen.py +++ b/EndSceen.py @@ -12,9 +12,12 @@ class EndSceen(): self.fontLeaderBoard = pygame.font.Font(mainGameClass.getFont(), 30) self.fontLeaderBoardActive = pygame.font.Font(mainGameClass.getFont(), 30) self.fontLeaderBoardActive.underline = True + self.fontError = pygame.font.Font(mainGameClass.getFont(), 15) + self.game = mainGameClass def newEndScreen(self): + self.endScreenTimer = 0; self.playerName = 'Player' self.scoresFromFile = [] @@ -35,8 +38,8 @@ class EndSceen(): self.sortedDataByScores = sorted(enumerate(self.data), key=lambda i: i[1][1], reverse=True) - def renderText(self, text, font, color, center): - render = font.render(text, True, color) + def renderText(self, text, font, color, center, backColor=None): + render = font.render(text, True, color, backColor) rect = render.get_rect() rect.center = center self.game.screen.blit(render, rect) @@ -49,7 +52,7 @@ class EndSceen(): # print(self.data[i]) if (self.game.getScore() > self.data[i][1] and not placeFlag): - self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f} '.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), self.fontLeaderBoard, (255, 255, 255), (self.game.getScreenWidth()/2,100 + j*50)) j += 1 @@ -58,7 +61,7 @@ class EndSceen(): if (j > number): break - formatDataForOnePlayer = ' {0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, *self.data[i]) + formatDataForOnePlayer = ' {0:3} {1:^10} {2:6d} {3:8.2f} '.format(j, *self.data[i]) self.renderText(formatDataForOnePlayer, self.fontLeaderBoard, (255, 255, 255), @@ -70,12 +73,12 @@ class EndSceen(): break if not placeFlag and j <= number: - self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f} '.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), self.fontLeaderBoard, (255, 255, 255), (self.game.getScreenWidth()/2,100 + j*50)) - self.renderText(' {0:^10} {1:>6} {2:>8}'.format('.....', '..', '.....'), + self.renderText(' {0:>3} {1:^10} {2:>6} {3:>8} '.format('..','.....', '..', '.....'), self.fontLeaderBoard, (255, 255, 255), (self.game.getScreenWidth()/2,100 + (number + 1)*50)) @@ -92,6 +95,10 @@ class EndSceen(): def render(self): + backGround = pygame.Surface(self.game.screenSize, pygame.SRCALPHA) + backGround.fill((0,0,0,200)) + self.game.screen.blit(backGround, (0,0)) + self.renderText('GAME OVER', self.fontGameOver, (255, 255, 255), (self.game.getScreenWidth()/2,50)) @@ -102,9 +109,27 @@ class EndSceen(): self.drawTableLB(5) - self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f}'.format(self.getScorePosition(self.game.getScore()), self.playerName[:10], self.game.getScore(), self.game.getTime()), + cursorChar = ' ' + if self.endScreenTimer > self.game.targetFps / 3: + cursorChar = '_' + + if self.endScreenTimer > 2 * self.game.targetFps / 3: + self.endScreenTimer = 0 + + self.endScreenTimer += 1 + + if len(self.playerName) > 0: + self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f} '.format(self.getScorePosition(self.game.getScore()), self.playerName[:10] + (cursorChar if len(self.playerName) < 10 else ''), self.game.getScore(), self.game.getTime()), self.fontLeaderBoard, (255, 255, 255), - (self.game.getScreenWidth()/2,100 + 5*50 + 50 + 50)) + (self.game.getScreenWidth()/2,100 + (5 + 2)*50)) + else: + self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f} '.format(self.getScorePosition(self.game.getScore()), self.playerName[:10] + (cursorChar if len(self.playerName) < 10 else ''), self.game.getScore(), self.game.getTime()), + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + (5 + 2)*50), (200, 20, 20)) + + self.renderText(' {0:^30} '.format('Missing player name'), + self.fontError, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + (5 + 2)*50 + 25)) self.renderText('Back', self.fontLeaderBoard if not self.isBackButton else self.fontLeaderBoardActive, (255, 255, 255), @@ -123,12 +148,13 @@ class EndSceen(): self.isBackButton = True elif event.key == pygame.K_RETURN: - self.saveResults() + if len(self.playerName) > 0: + self.saveResults() - if self.isBackButton: - self.game.newGame() - else: - self.game.newGame() + if self.isBackButton: + self.game.newGame() + else: + self.game.newGame() elif event.key == pygame.K_BACKSPACE: self.playerName = self.playerName[:len(self.playerName) - 1] diff --git a/leaders.txt b/leaders.txt index 9e0f24f..3b5b210 100644 --- a/leaders.txt +++ b/leaders.txt @@ -1,5 +1,5 @@ Kolya 1 11.37 Coolguy 1 10.75 Wow 74 185.72 -Player 0 7.16 Cheater 1000 0.01 +New-Kolya 2 15.20 From 27249ba0528d9dddad709949b588f0297947003a Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Mon, 5 Apr 2021 23:48:46 +0300 Subject: [PATCH 21/35] Updated BG sprites --- Background.py | 6 ++++-- BackgroundLayerFrame.py | 10 +++++++--- Floor.py | 2 +- data/background.png | Bin 3813 -> 6639 bytes data/background.xcf | Bin 13357 -> 21917 bytes 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Background.py b/Background.py index 92bda5e..50dac2a 100644 --- a/Background.py +++ b/Background.py @@ -15,6 +15,7 @@ class Background(): backgroundImages = ( pygame.transform.scale(backgroundImage.subsurface((0, 0, 800, 150)), (3200, 600)), pygame.transform.scale(backgroundImage.subsurface((0, 150, 800, 150)), (3200, 600)), + pygame.transform.scale(backgroundImage.subsurface((0, 300, 800, 150)), (3200, 600)), ) for image in backgroundImages: image.set_colorkey((255,0,255)) @@ -23,8 +24,9 @@ class Background(): pygame.sprite.Sprite.__init__(self) self.layers = ( - BackgroundLayer(Background.backgroundImages[0], mainGameClass, 0.5), - BackgroundLayer(Background.backgroundImages[1], mainGameClass, 1), + BackgroundLayer(Background.backgroundImages[0], mainGameClass, 0.25), + BackgroundLayer(Background.backgroundImages[1], mainGameClass, 0.5), + BackgroundLayer(Background.backgroundImages[2], mainGameClass, 1), ) diff --git a/BackgroundLayerFrame.py b/BackgroundLayerFrame.py index e7fe2dd..3c8686e 100644 --- a/BackgroundLayerFrame.py +++ b/BackgroundLayerFrame.py @@ -18,8 +18,12 @@ class BackgroundLayerFrame(pygame.sprite.Sprite): self.rect.center = (mainGameClass.getScreenWidth()/2 + offset[0], mainGameClass.getScreenHeight()/2 + offset[1]) + self.__doubleX = float(self.rect.x) + def update(self): - self.rect.x -= self.mainGameClass.getGameSpeed() * self.speedMultiplier - if self.rect.x < -self.rect.width: - self.rect.x += self.rect.width*2 + self.__doubleX -= self.mainGameClass.getGameSpeed() * self.speedMultiplier + if self.__doubleX < -self.rect.width: + self.__doubleX += self.rect.width*2 + + self.rect.x = self.__doubleX diff --git a/Floor.py b/Floor.py index c06b552..4cfd86e 100644 --- a/Floor.py +++ b/Floor.py @@ -11,7 +11,7 @@ class Floor(pygame.sprite.Sprite): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((mainGameClass.getScreenWidth(), mainGameClass.getFloorHeight()*101)) - self.image.fill((255, 204, 102)) + self.image.fill((255, 229, 180)) self.rect = self.image.get_rect() self.rect.center = (mainGameClass.getScreenWidth()/2, mainGameClass.getScreenHeight() + diff --git a/data/background.png b/data/background.png index e2fe42d714f0c4e5f76ba0ad9afc0a216c2091a5..1c059ebd57868702d38cb73fcd303ae08f8cc4e8 100644 GIT binary patch literal 6639 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 literal 3813 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 diff --git a/data/background.xcf b/data/background.xcf index 877897831fe96a1c16c2ccf8ff49bb33f750b34e..71c3d71d63316a8f4a2427dad2eaf7c09cc2d984 100644 GIT binary patch literal 21917 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 literal 13357 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 TK#S->8!$jz&;|q0?jHsKiAA{a From bbf81505e2a8cb7963aae710040ab97c83ea17b5 Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Mon, 5 Apr 2021 14:01:42 -0700 Subject: [PATCH 22/35] Modified collision boxes --- CollisionBox.py | 21 +++++++++++++++++++++ Drakora.pyw | 7 +++++-- Player.py | 27 +++++++++++++++++++++++++++ leaders.txt | 1 + 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 CollisionBox.py diff --git a/CollisionBox.py b/CollisionBox.py new file mode 100644 index 0000000..77ce5fc --- /dev/null +++ b/CollisionBox.py @@ -0,0 +1,21 @@ +""" +CollisionBox entity class +""" + +import pygame + + +class CollisionBox(pygame.sprite.Sprite): + def __init__(self, offsetX, offsetY, width, height, center): + pygame.sprite.Sprite.__init__(self) + + self.offset = (offsetX, offsetY) + self.size = (width, height) + self.rect = pygame.Rect(0, 0, width, height) + self.rect.center = center + + self.rect.x += self.offset[0] + self.rect.y += self.offset[1] + + def setY(self, y): + self.rect.y = y + self.offset[1] diff --git a/Drakora.pyw b/Drakora.pyw index 8c44d97..ec31570 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -174,7 +174,9 @@ class Drakora(): if self.drawBoxes: for player in self.players: - pygame.draw.rect(self.screen, (255, 0, 0), player.rect, 1) + for collision in self.player.getCollisionBoxes(): + pygame.draw.rect(self.screen, (255, 0, 0), collision.rect, 1) + # pygame.draw.rect(self.screen, (255, 0, 0), player.rect, 1) for enemy in self.enemies: pygame.draw.rect(self.screen, (255, 0, 0), enemy.rect, 1) for floor in self.floors: @@ -237,7 +239,7 @@ class Drakora(): def collideCheck(self): - if pygame.sprite.spritecollideany(self.player, self.enemies): + if sum([1 if pygame.sprite.spritecollideany(i, self.enemies) else 0 for i in self.player.getCollisionBoxes()]): if not self.isGodmode: self.isGameOver = True if self.player.isOnFloor: @@ -254,6 +256,7 @@ class Drakora(): def doCheats(self): + # self.drawBoxes = True if self.isPressedKeysUpdated: pressedKeysStr = ''.join(self.pressedKeys) diff --git a/Player.py b/Player.py index ee06e49..33f7958 100644 --- a/Player.py +++ b/Player.py @@ -6,6 +6,7 @@ Player entity class import pygame import math import os +from CollisionBox import CollisionBox class Player(pygame.sprite.Sprite): @@ -40,6 +41,9 @@ class Player(pygame.sprite.Sprite): for image in array: image.set_colorkey((255,0,255)) + def getCollisionBoxes(self): + return self.collisionBoxes + def __init__(self): pygame.sprite.Sprite.__init__(self) @@ -64,18 +68,38 @@ class Player(pygame.sprite.Sprite): self.gameSpeed = 1 self.updateCount = 0 + self.collisionBoxes = [] + + collision = CollisionBox(0, 20, 60, 20, self.rect.center) + self.collisionBoxes.append(collision) + collision = CollisionBox(-10, 5, 30, 20, self.rect.center) + self.collisionBoxes.append(collision) + collision = CollisionBox(0, 35, 25, 40, self.rect.center) + self.collisionBoxes.append(collision) + # self.collisionBoxes.append(self) + # collision = pygame.sprite.Sprite() + # collision.rect = pygame.Rect(0, 0, 25, 80) + # collision.rect.center = self.rect.center + # self.collisionBoxes.append(collision) + def crouch(self): if not self.isCrouching: self.isCrouching = True self.rect = self.rect.inflate(0, -32) + for i in self.collisionBoxes: + i.rect = i.inflate(0, -32) + def standup(self): if self.isCrouching: self.isCrouching = False self.rect = self.rect.inflate(0, 32) + for i in self.collisionBoxes: + i.rect = i.inflate(0, 32) + def updateSpeed(self, newGameSpeed): self.gameSpeed = newGameSpeed @@ -134,6 +158,9 @@ class Player(pygame.sprite.Sprite): self.rect.y += self.speed + for i in self.collisionBoxes: + i.setY(self.rect.y) + if self.updateCount >= 22 - math.log2(self.gameSpeed) * 2: if self.isOnFloor: if self.isCrouching: diff --git a/leaders.txt b/leaders.txt index 3b5b210..d1a8b6c 100644 --- a/leaders.txt +++ b/leaders.txt @@ -3,3 +3,4 @@ Coolguy 1 10.75 Wow 74 185.72 Cheater 1000 0.01 New-Kolya 2 15.20 +1 1 10.02 From b5c3dc32c7a6de1bf7c82f8ed9e1bab657f556e3 Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Mon, 5 Apr 2021 14:06:34 -0700 Subject: [PATCH 23/35] Hotfix collision --- Drakora.pyw | 2 +- Player.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index ec31570..b72b900 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -256,7 +256,7 @@ class Drakora(): def doCheats(self): - # self.drawBoxes = True + self.drawBoxes = True if self.isPressedKeysUpdated: pressedKeysStr = ''.join(self.pressedKeys) diff --git a/Player.py b/Player.py index 33f7958..ad5bf2c 100644 --- a/Player.py +++ b/Player.py @@ -89,7 +89,7 @@ class Player(pygame.sprite.Sprite): self.rect = self.rect.inflate(0, -32) for i in self.collisionBoxes: - i.rect = i.inflate(0, -32) + i.rect.y -= 32 def standup(self): @@ -98,7 +98,7 @@ class Player(pygame.sprite.Sprite): self.rect = self.rect.inflate(0, 32) for i in self.collisionBoxes: - i.rect = i.inflate(0, 32) + i.rect.y += 32 def updateSpeed(self, newGameSpeed): self.gameSpeed = newGameSpeed From 5910f8d8f462f7e311328202d641f1a5a1892c1d Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 6 Apr 2021 00:13:17 +0300 Subject: [PATCH 24/35] Minor improves in player sprite --- Player.py | 8 ++++++-- data/player.png | Bin 1053 -> 1099 bytes data/player.xcf | Bin 7396 -> 10298 bytes 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Player.py b/Player.py index 7ebfdfa..6df48cc 100644 --- a/Player.py +++ b/Player.py @@ -16,26 +16,30 @@ class Player(pygame.sprite.Sprite): 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)), + pygame.transform.scale(playerImage.subsurface((48, 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)), + pygame.transform.scale(playerImage.subsurface((48, 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)), + pygame.transform.scale(playerImage.subsurface((48, 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)), + pygame.transform.scale(playerImage.subsurface((32, 72, 16, 16)), (64, 64)), + pygame.transform.scale(playerImage.subsurface((48, 72, 16, 16)), (64, 64)), ) - + for array in (walkImages, upImages, downImages, crouchImages): for image in array: image.set_colorkey((255,0,255)) diff --git a/data/player.png b/data/player.png index 48889f442d91c5172009a13d4d6b37a65bce7a31..1e22269abce4b9c11c2d0fd522c7ceb4511a37d5 100644 GIT binary patch delta 1047 zcmbQsahgN1Gr-TCmrII^fq{Y7)59f*fq}t+fq@}{gNcEG;Z$E*{X|6t4pvbf=@Pq% z5)(Z&>W_N5IEGZ*dOKrd-faVcw*IDV47u$*Cbt$jGxFYL^2}!Umo?(hm~gXNPW{52 zGi*#1A1*AFoVC$!Qz^%#g&Ex$A11JTSi?7cPUfUV8QQBNA8;@(Tlv1vz0+pm{uK+` z{_i~UL)jt2{0=jBdw=IWdz*;Dz%I4f3x06acg&lXoMl)q&pfr@M@QDxBs<;XrLq2} z3%AbL{!NfWUXYi;b0U}GB&DTdTNZkMmE-ttu#u%B$HYXw`OeMI|9+&xJw1|K|MGQYq`85B&ZM`bq_nh} zWclPHFJImw6U?+tt^VbL3XiTSY_odXcKq4c`tMr6zVmQFeR$UQZ}Ka- z#kW6LWmvoA?$J9NE2d=`o_BLT&YbmCe&uR8@!ggI-@QNR>^K;rUdX%E`tz?TPZ=gn z&p-RZHooc3%~JXGR=2DqY={t8h zR6Htt`%NqP((Ad~PIJe+pHX7?e%mWE$B(}nkI5{J21#Wawe){qQ1P&$)^}BKz#hAX z(@M?r`|Ix=xR>(m-Gfah7#sHT(jAD_4%pKEk8v>p5A|zCCd6U|LXqLSB*>fTYaiz3np`xym`#&eDe&;A)eFq z^2xCsrHa>DBgB&+j6)Y%SvWLPzkS?mc5+KU$4j$oIkvjTgHFwUb?nslhxTq61x6?0 zpL?uWe%|IhW5S2*1-IVF%XI`jSbOv2^>F!niND{UzrQgsL|cCDzQ4>24|p|I!!})< z@G4|svfMTg&65Jjm!z&HC)WQ{e&y^H8JZ}nE3zh7IckyQwvf=)-XO18E3ag{ORW0D ze?8s(hWotdCP!XxR<06yRgk@6VtBsbdaH{SXYF}c?ygrbE?HZpXq?OKXBcUHt)l4a ctd+GX{h+X*A^rV7+gXz% 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 QxFs1F7(k1B$lta+3>Kq$VeGs7{{3p*#5k2m53; zR`tnzoa~cbST!bBv+7RX&Z;)~3#-{=BQ^;I*8hwQj6OdZ{{LrCQ)A%x|Cd3Hf$RSd z1~rg~4+HDu3O0F0mdW$j;llO5-Ouok{G5H^-)MN!NE<5i3Oy_w1Go9o9 z&wP&i|KD@}&+&mt-v1yL<2f!c4|NlAO|9{T?{|{AaNv<=Png1tEt`bt6yj)0e z@_b&U$q51?lcj~lCR++iO^z1knw%-jGr3Y&ZE`uE#$*RUw#l3MlqNsqQ=2TpFEiPJ zUm^B?wg3YNGiGxzFlI9|Fa~fj{14z^_#eQ`@IRZKfiZ!V;Xg<$0V2kjz{c=DfQ^AM zfRo{W0yo3|09JXJd^(jN;q*d{0%S+-~p4|49o!_K0^Q>!`}dg0A7aw0eoOLgLn`zkehfJ z{sb^EK$T{Z;|yjN2E)nes;ZNxsH#jpqN+Lhm#XGu0ZFOJp=#2TE7asB*Go!Gz96bP z`I4mWWIieO$u45*ldHw_C+`%~o%~fyZL*QL+2jIo2}ah*6UF5iStoB32c^?H;*fM2 z22Q8O44`xx76wkI#tfiz8WzTYJ)IKo7QM+nQu>p-q;w}AlhT;{M@nMySrv)NZ&jow z$4PTd&XMLZ;{N~F_`fk9nB@HrVlf(Xfq4)y?*IRddH?@0{{PDOSU?=% z|16U)3W|eLb08?S@-qB24KU?q_-hJI!=?)@17)2&?sK_Xag1yAV0P-Fy zn1p(g;lG3^!+!~p$!k<3p=k>oxyGQ#GloPiD0Pt@xna=A4g1d^KDkf=6uAo}K#}`h z6&krtEMbtybz%vFM6R(hs}m@4K{PmWjai+TjUkZ>W Date: Tue, 6 Apr 2021 00:20:11 +0300 Subject: [PATCH 25/35] Minor fix --- Drakora.pyw | 2 -- 1 file changed, 2 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index a7938a1..25dd92b 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -180,7 +180,6 @@ class Drakora(): for player in self.players: for collision in self.player.getCollisionBoxes(): pygame.draw.rect(self.screen, (255, 0, 0), collision.rect, 1) - # pygame.draw.rect(self.screen, (255, 0, 0), player.rect, 1) for enemy in self.enemies: pygame.draw.rect(self.screen, (255, 0, 0), enemy.rect, 1) for floor in self.floors: @@ -260,7 +259,6 @@ class Drakora(): def doCheats(self): - self.drawBoxes = True if self.isPressedKeysUpdated: pressedKeysStr = ''.join(self.pressedKeys) From bf9208577b39111ea7125a7e0cb2987bf2372e3e Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 6 Apr 2021 00:24:16 +0300 Subject: [PATCH 26/35] Records --- leaders.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/leaders.txt b/leaders.txt index d1a8b6c..018afc3 100644 --- a/leaders.txt +++ b/leaders.txt @@ -4,3 +4,4 @@ Wow 74 185.72 Cheater 1000 0.01 New-Kolya 2 15.20 1 1 10.02 +RUSlan 29 82.42 From 29d5676947d0e4b1e1b4c0118ebdc7a5f4a0bcab Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 6 Apr 2021 10:15:10 +0300 Subject: [PATCH 27/35] Updated cheat system. Code rework --- Background.py | 18 +++-- BackgroundLayer.py | 8 ++- BackgroundLayerFrame.py | 2 +- Cloud.py | 9 +-- Drakora.pyw | 25 ++++--- EndSceen.py | 75 ++++++++++++++------ FlyingEnemy.py | 10 +-- Player.py | 73 +++++++++++++++----- StandingEnemy.py | 148 ++++++++++++++++++++++++++++++---------- 9 files changed, 265 insertions(+), 103 deletions(-) diff --git a/Background.py b/Background.py index 50dac2a..0fd94f3 100644 --- a/Background.py +++ b/Background.py @@ -11,11 +11,19 @@ from BackgroundLayer import BackgroundLayer class Background(): imgDir = os.path.join(os.path.dirname(__file__), 'data') - backgroundImage = pygame.image.load(os.path.join(imgDir, 'background.png'))#.convert() + backgroundImage = pygame.image.load( + os.path.join(imgDir, 'background.png') + )#.convert() backgroundImages = ( - pygame.transform.scale(backgroundImage.subsurface((0, 0, 800, 150)), (3200, 600)), - pygame.transform.scale(backgroundImage.subsurface((0, 150, 800, 150)), (3200, 600)), - pygame.transform.scale(backgroundImage.subsurface((0, 300, 800, 150)), (3200, 600)), + pygame.transform.scale( + backgroundImage.subsurface((0, 0, 800, 150)), (3200, 600) + ), + pygame.transform.scale( + backgroundImage.subsurface((0, 150, 800, 150)), (3200, 600) + ), + pygame.transform.scale( + backgroundImage.subsurface((0, 300, 800, 150)), (3200, 600) + ), ) for image in backgroundImages: image.set_colorkey((255,0,255)) @@ -24,7 +32,7 @@ class Background(): pygame.sprite.Sprite.__init__(self) self.layers = ( - BackgroundLayer(Background.backgroundImages[0], mainGameClass, 0.25), + BackgroundLayer(Background.backgroundImages[0], mainGameClass, 0.2), BackgroundLayer(Background.backgroundImages[1], mainGameClass, 0.5), BackgroundLayer(Background.backgroundImages[2], mainGameClass, 1), ) diff --git a/BackgroundLayer.py b/BackgroundLayer.py index 79a4fed..34f9db5 100644 --- a/BackgroundLayer.py +++ b/BackgroundLayer.py @@ -14,8 +14,12 @@ class BackgroundLayer(): self.frames = pygame.sprite.Group() - self.frames.add(BackgroundLayerFrame(image, mainGameClass, (0, 0), speedMultiplier)) - self.frames.add(BackgroundLayerFrame(image, mainGameClass, (offset, 0), speedMultiplier)) + self.frames.add(BackgroundLayerFrame( + image, mainGameClass, (0, 0), speedMultiplier) + ) + self.frames.add(BackgroundLayerFrame( + image, mainGameClass, (offset, 0), speedMultiplier) + ) def update(self): diff --git a/BackgroundLayerFrame.py b/BackgroundLayerFrame.py index 3c8686e..49d84cc 100644 --- a/BackgroundLayerFrame.py +++ b/BackgroundLayerFrame.py @@ -22,7 +22,7 @@ class BackgroundLayerFrame(pygame.sprite.Sprite): def update(self): - self.__doubleX -= self.mainGameClass.getGameSpeed() * self.speedMultiplier + self.__doubleX -= self.mainGameClass.getGameSpeed()*self.speedMultiplier if self.__doubleX < -self.rect.width: self.__doubleX += self.rect.width*2 diff --git a/Cloud.py b/Cloud.py index e25285d..2e7074b 100644 --- a/Cloud.py +++ b/Cloud.py @@ -17,10 +17,11 @@ class Cloud(pygame.sprite.Sprite): self.image.fill((color, color, color)) self.rect = self.image.get_rect() - self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, - mainGameClass.getScreenHeight()/2 - - random.randint(100, - mainGameClass.getScreenHeight()/2-100)+50*(2-cloudType)) + self.rect.center = ( + mainGameClass.getScreenWidth() + self.rect.width, + mainGameClass.getScreenHeight()/2 - random.randint(100, + mainGameClass.getScreenHeight()/2-100) + 50*(2-cloudType) + ) self.speed = cloudType*mainGameClass.getGameSpeed() / 6 self.__doubleX = float(self.rect.x) diff --git a/Drakora.pyw b/Drakora.pyw index 25dd92b..454074b 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -140,15 +140,10 @@ class Drakora(): self.fontMessage = pygame.font.Font(self.font, 56) self.fontGodmode = pygame.font.Font(self.font, 12) - self.charKeys = { - pygame.K_a:'a', pygame.K_b:'b', pygame.K_c:'c', pygame.K_d:'d', - pygame.K_e:'e', pygame.K_f:'f', pygame.K_g:'g', pygame.K_h:'h', - pygame.K_i:'i', pygame.K_j:'j', pygame.K_k:'k', pygame.K_l:'l', - pygame.K_m:'m', pygame.K_n:'n', pygame.K_o:'o', pygame.K_p:'p', - pygame.K_q:'q', pygame.K_r:'r', pygame.K_s:'s', pygame.K_t:'t', - pygame.K_u:'u', pygame.K_v:'v', pygame.K_w:'w', pygame.K_x:'x', - pygame.K_y:'y', pygame.K_z:'z', - } + self.charKeys = tuple( + pygame.key.key_code(chr(i)) for i in range(ord("a"), ord("z")) + ) + self.pressedKeys = deque(maxlen=10) self.isPressedKeysUpdated = True @@ -169,7 +164,6 @@ class Drakora(): def render(self): - # self.screen.fill((102, 153, 255)) self.background.draw(self.screen) for cloudGroup in self.cloudGroups: cloudGroup.draw(self.screen) self.enemies.draw(self.screen) @@ -179,7 +173,7 @@ class Drakora(): if self.drawBoxes: for player in self.players: for collision in self.player.getCollisionBoxes(): - pygame.draw.rect(self.screen, (255, 0, 0), collision.rect, 1) + pygame.draw.rect(self.screen, (255, 0, 0), collision.rect,1) for enemy in self.enemies: pygame.draw.rect(self.screen, (255, 0, 0), enemy.rect, 1) for floor in self.floors: @@ -225,6 +219,10 @@ class Drakora(): self.fontGodmode, (255, 255, 255), (self.getScreenWidth()/2,60)) + self.renderText(''.join(self.pressedKeys), + self.fontGodmode, (255, 255, 255), + (self.getScreenWidth()/2,80)) + pygame.display.flip() @@ -242,7 +240,8 @@ class Drakora(): def collideCheck(self): - if sum([1 if pygame.sprite.spritecollideany(i, self.enemies) else 0 for i in self.player.getCollisionBoxes()]): + if sum([1 if pygame.sprite.spritecollideany(i, self.enemies) else 0 + for i in self.player.getCollisionBoxes()]): if not self.isGodmode: self.isGameOver = True if self.player.isOnFloor: @@ -299,7 +298,7 @@ class Drakora(): elif event.type == pygame.KEYUP: if event.key in self.charKeys: - self.pressedKeys.append(self.charKeys[event.key]) + self.pressedKeys.append(pygame.key.name(event.key)) self.isPressedKeysUpdated = True self.doCheats() diff --git a/EndSceen.py b/EndSceen.py index a2aa7d2..534e151 100644 --- a/EndSceen.py +++ b/EndSceen.py @@ -8,11 +8,19 @@ import pygame class EndSceen(): def __init__(self, mainGameClass): - self.fontGameOver = pygame.font.Font(mainGameClass.getFont(), 56) - self.fontLeaderBoard = pygame.font.Font(mainGameClass.getFont(), 30) - self.fontLeaderBoardActive = pygame.font.Font(mainGameClass.getFont(), 30) + self.fontGameOver = pygame.font.Font( + mainGameClass.getFont(), 56 + ) + self.fontLeaderBoard = pygame.font.Font( + mainGameClass.getFont(), 30 + ) + self.fontLeaderBoardActive = pygame.font.Font( + mainGameClass.getFont(), 30 + ) self.fontLeaderBoardActive.underline = True - self.fontError = pygame.font.Font(mainGameClass.getFont(), 15) + self.fontError = pygame.font.Font( + mainGameClass.getFont(), 15 + ) self.game = mainGameClass @@ -31,11 +39,14 @@ class EndSceen(): oneStr = line.split() if (len(oneStr) == 3): - self.data.append([oneStr[0][:10], int(oneStr[1]), float(oneStr[2])]) + self.data.append( + [oneStr[0][:10], int(oneStr[1]), float(oneStr[2])] + ) fileWithData.close() - self.sortedDataByScores = sorted(enumerate(self.data), key=lambda i: i[1][1], reverse=True) + self.sortedDataByScores = sorted(enumerate(self.data), + key=lambda i: i[1][1], reverse=True) def renderText(self, text, font, color, center, backColor=None): @@ -52,7 +63,10 @@ class EndSceen(): # print(self.data[i]) if (self.game.getScore() > self.data[i][1] and not placeFlag): - self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f} '.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f} '.format(j, + self.playerName[:10], self.game.getScore(), + self.game.getTime() + ), self.fontLeaderBoard, (255, 255, 255), (self.game.getScreenWidth()/2,100 + j*50)) j += 1 @@ -61,7 +75,8 @@ class EndSceen(): if (j > number): break - formatDataForOnePlayer = ' {0:3} {1:^10} {2:6d} {3:8.2f} '.format(j, *self.data[i]) + formatDataForOnePlayer = ' {0:3} {1:^10} {2:6d} {3:8.2f} '.format( + j, *self.data[i]) self.renderText(formatDataForOnePlayer, self.fontLeaderBoard, (255, 255, 255), @@ -73,12 +88,17 @@ class EndSceen(): break if not placeFlag and j <= number: - self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f} '.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f} '.format( + j, self.playerName[:10], self.game.getScore(), + self.game.getTime() + ), self.fontLeaderBoard, (255, 255, 255), (self.game.getScreenWidth()/2,100 + j*50)) - self.renderText(' {0:>3} {1:^10} {2:>6} {3:>8} '.format('..','.....', '..', '.....'), + self.renderText(' {0:>3} {1:^10} {2:>6} {3:>8} '.format( + '..','.....', '..', '.....' + ), self.fontLeaderBoard, (255, 255, 255), (self.game.getScreenWidth()/2,100 + (number + 1)*50)) @@ -119,25 +139,40 @@ class EndSceen(): self.endScreenTimer += 1 if len(self.playerName) > 0: - self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f} '.format(self.getScorePosition(self.game.getScore()), self.playerName[:10] + (cursorChar if len(self.playerName) < 10 else ''), self.game.getScore(), self.game.getTime()), + self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f} '.format( + self.getScorePosition(self.game.getScore()), + self.playerName[:10] + (cursorChar + if len(self.playerName) < 10 else ''), + self.game.getScore(), self.game.getTime() + ), self.fontLeaderBoard, (255, 255, 255), (self.game.getScreenWidth()/2,100 + (5 + 2)*50)) else: - self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f} '.format(self.getScorePosition(self.game.getScore()), self.playerName[:10] + (cursorChar if len(self.playerName) < 10 else ''), self.game.getScore(), self.game.getTime()), + self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f} '.format( + self.getScorePosition(self.game.getScore()), + self.playerName[:10] + (cursorChar + if len(self.playerName) < 10 else ''), + self.game.getScore(), self.game.getTime() + ), self.fontLeaderBoard, (255, 255, 255), - (self.game.getScreenWidth()/2,100 + (5 + 2)*50), (200, 20, 20)) + (self.game.getScreenWidth()/2, 100 + + (5 + 2)*50), (200, 20, 20)) self.renderText(' {0:^30} '.format('Missing player name'), self.fontError, (255, 255, 255), (self.game.getScreenWidth()/2,100 + (5 + 2)*50 + 25)) self.renderText('Back', - self.fontLeaderBoard if not self.isBackButton else self.fontLeaderBoardActive, (255, 255, 255), - (self.game.getScreenWidth()/2 - 100, self.game.getScreenHeight() - 80)) + self.fontLeaderBoard if not self.isBackButton else + self.fontLeaderBoardActive, (255, 255, 255), + (self.game.getScreenWidth()/2 - 100, + self.game.getScreenHeight() - 80)) self.renderText('Continue', - self.fontLeaderBoard if self.isBackButton else self.fontLeaderBoardActive, (255, 255, 255), - (self.game.getScreenWidth()/2 + 100, self.game.getScreenHeight() - 80)) + self.fontLeaderBoard if self.isBackButton else + self.fontLeaderBoardActive, (255, 255, 255), + (self.game.getScreenWidth()/2 + 100, + self.game.getScreenHeight() - 80)) def control(self, event): if event.type == pygame.KEYDOWN and self.game.isGameOver: @@ -159,7 +194,8 @@ class EndSceen(): elif event.key == pygame.K_BACKSPACE: self.playerName = self.playerName[:len(self.playerName) - 1] - elif len(pygame.key.name(event.key)) == 1 and len(self.playerName) < 10: + elif len(pygame.key.name(event.key)) == 1 and + len(self.playerName) < 10: if pygame.key.get_mods() & pygame.KMOD_LSHIFT: self.playerName += pygame.key.name(event.key).upper() else: @@ -177,7 +213,8 @@ class EndSceen(): if not (line.split()[0].rstrip() == self.playerName.rstrip()): newData.append(line) - newData.append('{0} {1} {2:.2f}\n'.format(self.playerName, self.game.getScore(), self.game.getTime())) + newData.append('{0} {1} {2:.2f}\n'.format(self.playerName, + self.game.getScore(), self.game.getTime())) with open ('leaders.txt', 'w') as fileWithData: fileWithData.writelines(newData) diff --git a/FlyingEnemy.py b/FlyingEnemy.py index ed16cce..a7019be 100644 --- a/FlyingEnemy.py +++ b/FlyingEnemy.py @@ -13,11 +13,13 @@ from Enemy import Enemy class FlyingEnemy(Enemy): imgDir = os.path.join(os.path.dirname(__file__), 'data') - senemyImage = pygame.image.load(os.path.join(imgDir, 'fenemy.png'))#.convert() + senemyImage = pygame.image.load( + os.path.join(imgDir, 'fenemy.png') + )#.convert() images = ( - pygame.transform.scale(senemyImage.subsurface((0, 0, 16, 8)), (64, 32)), - pygame.transform.scale(senemyImage.subsurface((16, 0, 16, 8)), (64, 32)), - pygame.transform.scale(senemyImage.subsurface((32, 0, 16, 8)), (64, 32)), + pygame.transform.scale(senemyImage.subsurface((0, 0, 16, 8)),(64, 32)), + pygame.transform.scale(senemyImage.subsurface((16, 0, 16, 8)),(64, 32)), + pygame.transform.scale(senemyImage.subsurface((32, 0, 16, 8)),(64, 32)), ) for image in images: image.set_colorkey((255,0,255)) diff --git a/Player.py b/Player.py index 6df48cc..4ec493a 100644 --- a/Player.py +++ b/Player.py @@ -11,33 +11,67 @@ from CollisionBox import CollisionBox 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() + 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((48, 0, 16, 24)), (64, 98)), + 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((48, 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)), - pygame.transform.scale(playerImage.subsurface((48, 24, 16, 24)), (64, 98)), + 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) + ), + pygame.transform.scale( + playerImage.subsurface((48, 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)), - pygame.transform.scale(playerImage.subsurface((48, 48, 16, 24)), (64, 98)), + 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) + ), + pygame.transform.scale( + playerImage.subsurface((48, 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)), - pygame.transform.scale(playerImage.subsurface((32, 72, 16, 16)), (64, 64)), - pygame.transform.scale(playerImage.subsurface((48, 72, 16, 16)), (64, 64)), + pygame.transform.scale( + playerImage.subsurface((0, 72, 16, 16)), (64, 64) + ), + pygame.transform.scale( + playerImage.subsurface((16, 72, 16, 16)), (64, 64) + ), + pygame.transform.scale( + playerImage.subsurface((32, 72, 16, 16)), (64, 64) + ), + pygame.transform.scale( + playerImage.subsurface((48, 72, 16, 16)), (64, 64) + ), ) for array in (walkImages, upImages, downImages, crouchImages): @@ -147,7 +181,10 @@ class Player(pygame.sprite.Sprite): else: maxHoverCount = 1 if self.isDownJump and self.hoverCount < maxHoverCount: - self.speed -= self.gameSpeed/8 * ((math.cos(2*math.pi*self.hoverCount/(2*maxHoverCount))+1)/2.5+0.2) + self.speed -= self.gameSpeed/8 * ( + (math.cos(2*math.pi*self.hoverCount/ + (2*maxHoverCount))+1)/2.5 + 0.2 + ) self.hoverCount += 1 else: self.isJumping = False diff --git a/StandingEnemy.py b/StandingEnemy.py index d5f923d..fc2a057 100644 --- a/StandingEnemy.py +++ b/StandingEnemy.py @@ -12,55 +12,129 @@ 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() + 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, 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, 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, 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, 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, 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)), + 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) + ), ), ) From f7d2edaf86c6fc62de5a638965b1d5fe765a479d Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 6 Apr 2021 10:18:46 +0300 Subject: [PATCH 28/35] Minor fix. Code rework --- Drakora.pyw | 4 ---- EndSceen.py | 5 ----- StandingEnemy.py | 8 -------- 3 files changed, 17 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 454074b..cecf68c 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -219,10 +219,6 @@ class Drakora(): self.fontGodmode, (255, 255, 255), (self.getScreenWidth()/2,60)) - self.renderText(''.join(self.pressedKeys), - self.fontGodmode, (255, 255, 255), - (self.getScreenWidth()/2,80)) - pygame.display.flip() diff --git a/EndSceen.py b/EndSceen.py index 534e151..1cb0b39 100644 --- a/EndSceen.py +++ b/EndSceen.py @@ -60,8 +60,6 @@ class EndSceen(): placeFlag = False for i in [i[0] for i in self.sortedDataByScores[:number]]: - # print(self.data[i]) - if (self.game.getScore() > self.data[i][1] and not placeFlag): self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f} '.format(j, self.playerName[:10], self.game.getScore(), @@ -102,8 +100,6 @@ class EndSceen(): self.fontLeaderBoard, (255, 255, 255), (self.game.getScreenWidth()/2,100 + (number + 1)*50)) - # for i in rows: - def getScorePosition(self, score): counter = 1 for i in self.sortedDataByScores: @@ -200,7 +196,6 @@ class EndSceen(): self.playerName += pygame.key.name(event.key).upper() else: self.playerName += pygame.key.name(event.key).lower() - # self.playerName += self.game.charKeys[event.key] def saveResults(self): with open ('leaders.txt', 'r') as fileWithData: diff --git a/StandingEnemy.py b/StandingEnemy.py index fc2a057..b2ad329 100644 --- a/StandingEnemy.py +++ b/StandingEnemy.py @@ -151,14 +151,6 @@ class StandingEnemy(Enemy): 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 From 00f5a97da1e328a0343374bf4b491081fe4066ee Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 6 Apr 2021 10:28:04 +0300 Subject: [PATCH 29/35] Minor fixes --- Drakora.pyw | 1 - EndSceen.py | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index cecf68c..0f4823e 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -168,7 +168,6 @@ class Drakora(): for cloudGroup in self.cloudGroups: cloudGroup.draw(self.screen) self.enemies.draw(self.screen) self.players.draw(self.screen) - self.floors.draw(self.screen) if self.drawBoxes: for player in self.players: diff --git a/EndSceen.py b/EndSceen.py index 1cb0b39..360e43b 100644 --- a/EndSceen.py +++ b/EndSceen.py @@ -190,8 +190,9 @@ class EndSceen(): elif event.key == pygame.K_BACKSPACE: self.playerName = self.playerName[:len(self.playerName) - 1] - elif len(pygame.key.name(event.key)) == 1 and - len(self.playerName) < 10: + elif len( + pygame.key.name(event.key) + ) == 1 and len(self.playerName) < 10: if pygame.key.get_mods() & pygame.KMOD_LSHIFT: self.playerName += pygame.key.name(event.key).upper() else: From c1c439b7714759364ef68de006fd387ab749b26a Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Tue, 6 Apr 2021 00:28:17 -0700 Subject: [PATCH 30/35] More beautifull collision check --- Drakora.pyw | 3 +-- Player.py | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 25dd92b..03f43cd 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -240,9 +240,8 @@ class Drakora(): else: return 300 - def collideCheck(self): - if sum([1 if pygame.sprite.spritecollideany(i, self.enemies) else 0 for i in self.player.getCollisionBoxes()]): + if pygame.sprite.groupcollide(self.player.getCollisionBoxes(), self.enemies, None, None): if not self.isGodmode: self.isGameOver = True if self.player.isOnFloor: diff --git a/Player.py b/Player.py index 6df48cc..52edbc5 100644 --- a/Player.py +++ b/Player.py @@ -71,14 +71,14 @@ class Player(pygame.sprite.Sprite): self.gameSpeed = 1 self.updateCount = 0 - self.collisionBoxes = [] + self.collisionBoxes = pygame.sprite.Group() collision = CollisionBox(0, 20, 60, 20, self.rect.center) - self.collisionBoxes.append(collision) + self.collisionBoxes.add(collision) collision = CollisionBox(-10, 5, 30, 20, self.rect.center) - self.collisionBoxes.append(collision) + self.collisionBoxes.add(collision) collision = CollisionBox(0, 35, 25, 40, self.rect.center) - self.collisionBoxes.append(collision) + self.collisionBoxes.add(collision) def crouch(self): From c40653ed23198bc7af45f3413f55177f4fb39ebb Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Tue, 6 Apr 2021 01:25:25 -0700 Subject: [PATCH 31/35] Fix standing enemies collision --- CollisionBox.py | 3 +++ Drakora.pyw | 12 ++++++++---- Enemy.py | 9 +++++++++ StandingEnemy.py | 8 ++++++-- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/CollisionBox.py b/CollisionBox.py index 77ce5fc..33de459 100644 --- a/CollisionBox.py +++ b/CollisionBox.py @@ -19,3 +19,6 @@ class CollisionBox(pygame.sprite.Sprite): def setY(self, y): self.rect.y = y + self.offset[1] + + def setX(self, x): + self.rect.x = x + self.offset[0] diff --git a/Drakora.pyw b/Drakora.pyw index 03f43cd..b594119 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -178,10 +178,11 @@ class Drakora(): if self.drawBoxes: for player in self.players: - for collision in self.player.getCollisionBoxes(): + for collision in player.getCollisionBoxes(): pygame.draw.rect(self.screen, (255, 0, 0), collision.rect, 1) for enemy in self.enemies: - pygame.draw.rect(self.screen, (255, 0, 0), enemy.rect, 1) + for collision in enemy.getCollisionBoxes(): + pygame.draw.rect(self.screen, (255, 0, 0), collision.rect, 1) for floor in self.floors: pygame.draw.rect(self.screen, (255, 0, 0), floor.rect, 1) @@ -241,8 +242,11 @@ class Drakora(): return 300 def collideCheck(self): - if pygame.sprite.groupcollide(self.player.getCollisionBoxes(), self.enemies, None, None): - if not self.isGodmode: self.isGameOver = True + for enemy in self.enemies: + if pygame.sprite.groupcollide(self.player.getCollisionBoxes(), enemy.getCollisionBoxes(), None, None): + if not self.isGodmode: + self.isGameOver = True + break if self.player.isOnFloor: self.player.rect.y += 1 diff --git a/Enemy.py b/Enemy.py index 3322e44..88d27f8 100644 --- a/Enemy.py +++ b/Enemy.py @@ -16,6 +16,12 @@ class Enemy(pygame.sprite.Sprite): self.height = (mainGameClass.getScreenHeight() - mainGameClass.getFloorHeight()) + self.collisionBoxes = pygame.sprite.Group() + + + def getCollisionBoxes(self): + return self.collisionBoxes + def update(self): if (self.rect.x < -self.rect.width): @@ -23,3 +29,6 @@ class Enemy(pygame.sprite.Sprite): self.thisGame.addScore(1) self.rect.x -= self.speed + + for i in self.collisionBoxes: + i.setX(self.rect.x) diff --git a/StandingEnemy.py b/StandingEnemy.py index d5f923d..d15384b 100644 --- a/StandingEnemy.py +++ b/StandingEnemy.py @@ -8,6 +8,7 @@ import random import os from Enemy import Enemy +from CollisionBox import CollisionBox class StandingEnemy(Enemy): @@ -73,9 +74,9 @@ class StandingEnemy(Enemy): image.set_colorkey((255,0,255)) - self.subtype = random.randint(1, len(StandingEnemy.images)) + self.subtype = random.randint(0, len(StandingEnemy.images) - 1) - self.image = random.choice(StandingEnemy.images[self.subtype-1]) + self.image = random.choice(StandingEnemy.images[self.subtype]) # if self.subtype == 1: self.image = pygame.Surface((32, 96)) # elif self.subtype == 2: self.image = pygame.Surface((32, 64)) @@ -91,4 +92,7 @@ class StandingEnemy(Enemy): self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, self.height) + collision = CollisionBox(9, 3, self.rect.w - 18, self.rect.h - 6, self.rect.center) + self.collisionBoxes.add(collision) + self.speed = self.thisGame.getGameSpeed() From 145bda62db86b15ed764fd1ad5961f5e2bda1ac8 Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Tue, 6 Apr 2021 01:31:59 -0700 Subject: [PATCH 32/35] Fix flying enemies collision --- FlyingEnemy.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/FlyingEnemy.py b/FlyingEnemy.py index ed16cce..31b0857 100644 --- a/FlyingEnemy.py +++ b/FlyingEnemy.py @@ -9,6 +9,7 @@ import math import os from Enemy import Enemy +from CollisionBox import CollisionBox class FlyingEnemy(Enemy): @@ -39,6 +40,9 @@ class FlyingEnemy(Enemy): self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, self.height) + collision = CollisionBox(2, 0, self.rect.w - 28, self.rect.h - 8, self.rect.center) + self.collisionBoxes.add(collision) + self.speed = self.thisGame.getGameSpeed()*2 From 3ae1299459302e3c89c3c401d735753c6b9d9d5d Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 6 Apr 2021 11:52:57 +0300 Subject: [PATCH 33/35] Cloud layers --- Drakora.pyw | 4 +++- data/background.png | Bin 6639 -> 7072 bytes data/background.xcf | Bin 21917 -> 20611 bytes 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Drakora.pyw b/Drakora.pyw index 0f4823e..5a65c3c 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -164,8 +164,10 @@ class Drakora(): def render(self): + self.screen.fill((61, 150, 223)) + for cloudGroup in self.cloudGroups[:2]: cloudGroup.draw(self.screen) self.background.draw(self.screen) - for cloudGroup in self.cloudGroups: cloudGroup.draw(self.screen) + for cloudGroup in self.cloudGroups[2:]: cloudGroup.draw(self.screen) self.enemies.draw(self.screen) self.players.draw(self.screen) diff --git a/data/background.png b/data/background.png index 1c059ebd57868702d38cb73fcd303ae08f8cc4e8..9f9a772804317c698c4f5aa4698dd54de28497fd 100644 GIT binary patch delta 5889 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 F1OWcb1a1HT diff --git a/data/background.xcf b/data/background.xcf index 71c3d71d63316a8f4a2427dad2eaf7c09cc2d984..3486362ab0acbfa58dfc9ee590f6a2d7ff295dc0 100644 GIT binary patch delta 8445 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 From 3d94989c9b2392f16132028158be2817b1bc56e8 Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Tue, 6 Apr 2021 03:44:19 -0700 Subject: [PATCH 34/35] Crypted leaderboard added, first record added too --- EndSceen.py | 64 +++++++++++++++++++++++++++++++++------------------- leaders.lb | Bin 0 -> 138 bytes leaders.txt | 7 ------ 3 files changed, 41 insertions(+), 30 deletions(-) create mode 100644 leaders.lb delete mode 100644 leaders.txt diff --git a/EndSceen.py b/EndSceen.py index 360e43b..9bacafe 100644 --- a/EndSceen.py +++ b/EndSceen.py @@ -2,8 +2,10 @@ Enemy entity class """ - +import pickle import pygame +import hashlib +from cryptography.fernet import Fernet class EndSceen(): @@ -22,7 +24,11 @@ class EndSceen(): mainGameClass.getFont(), 15 ) + key = b'Lh2b2rragfwD8QR4VU-V2TmSuio4yp-WbFwo4tcoyzs=' + self.code = Fernet(key) + self.game = mainGameClass + self.saveFileName = 'leaders.lb' def newEndScreen(self): self.endScreenTimer = 0; @@ -30,23 +36,29 @@ class EndSceen(): self.scoresFromFile = [] self.data = [] + self.sortedDataByScores = [] self.isBackButton = True - fileWithData = open('leaders.txt') + try: + fileWithData = open(self.saveFileName, 'rb') + except IOError as e: + pass + else: + listPlayers = pickle.load(fileWithData) - for line in fileWithData: - oneStr = line.split() + for line in listPlayers: + oneStr = self.code.decrypt(line).decode().split() - if (len(oneStr) == 3): - self.data.append( - [oneStr[0][:10], int(oneStr[1]), float(oneStr[2])] - ) + if (len(oneStr) == 3): + self.data.append( + [oneStr[0][:10], int(oneStr[1]), float(oneStr[2])] + ) - fileWithData.close() + fileWithData.close() - self.sortedDataByScores = sorted(enumerate(self.data), - key=lambda i: i[1][1], reverse=True) + self.sortedDataByScores = sorted(enumerate(self.data), + key=lambda i: i[1][1], reverse=True) def renderText(self, text, font, color, center, backColor=None): @@ -199,19 +211,25 @@ class EndSceen(): self.playerName += pygame.key.name(event.key).lower() def saveResults(self): - with open ('leaders.txt', 'r') as fileWithData: - tmpData = fileWithData.readlines() - fileWithData.close() - newData = [] - for line in tmpData: - if len(line.split()) == 3: - if not (line.split()[0].rstrip() == self.playerName.rstrip()): - newData.append(line) - newData.append('{0} {1} {2:.2f}\n'.format(self.playerName, - self.game.getScore(), self.game.getTime())) + try: + fileWithData = open(self.saveFileName, 'rb') + except IOError as e: + pass + else: + tmpData = pickle.load(fileWithData) + fileWithData.close() - with open ('leaders.txt', 'w') as fileWithData: - fileWithData.writelines(newData) + for line in tmpData: + oneStr = self.code.decrypt(line).decode() + if len(oneStr.split()) == 3: + if not (oneStr.split()[0].rstrip() == self.playerName.rstrip()): + newData.append(line) + + newData.append(self.code.encrypt(('{0} {1} {2:.2f}\n'.format(self.playerName, + self.game.getScore(), self.game.getTime())).encode())) + + with open (self.saveFileName, 'wb') as fileWithData: + pickle.dump(newData, fileWithData) fileWithData.close() diff --git a/leaders.lb b/leaders.lb new file mode 100644 index 0000000000000000000000000000000000000000..1dd5a2ced796bbd4bb0a4c6f5569302775264925 GIT binary patch literal 138 zcmZo*nOe^P0kKn@E7Bc7z$rb+rPwPkBrvVetTfd-yf~o3*V8r4HQ&IwwAk6WTsJht zAUQSO*`O%U(=#$K-cL6vG|b;9J2EdP-Pg#~)FUO-!mTL1%+JTAGB?;g!ZRbsxx&)j iG{qx3%0JgAsx+{wDk;pnu%a+0(=*7(tJro*q8 Date: Tue, 6 Apr 2021 05:07:17 -0700 Subject: [PATCH 35/35] Fix collision boxes in Player --- Player.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Player.py b/Player.py index 566b206..b5953cc 100644 --- a/Player.py +++ b/Player.py @@ -120,17 +120,12 @@ class Player(pygame.sprite.Sprite): self.isCrouching = True self.rect = self.rect.inflate(0, -32) - for i in self.collisionBoxes: - i.rect.y -= 32 - def standup(self): if self.isCrouching: self.isCrouching = False self.rect = self.rect.inflate(0, 32) - - for i in self.collisionBoxes: - i.rect.y += 32 + def updateSpeed(self, newGameSpeed): self.gameSpeed = newGameSpeed