From 4f98e3147b0c38c88e6eb6e94989ae483ad6b0cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E9=93=AD?= <2436077353@qq.com> Date: Mon, 3 Jun 2024 01:47:25 +0800 Subject: [PATCH] first commit --- .../__pycache__/constants.cpython-312.pyc | Bin 426 -> 488 bytes .../__pycache__/box.cpython-312.pyc | Bin 0 -> 1747 bytes .../__pycache__/brick.cpython-312.pyc | Bin 1869 -> 1868 bytes .../__pycache__/enemy.cpython-312.pyc | Bin 0 -> 4328 bytes pythonProject1/source/components/box.py | 26 +++++++ pythonProject1/source/components/brick.py | 12 +-- pythonProject1/source/components/enemy.py | 73 ++++++++++++++++++ pythonProject1/source/constants.py | 2 + pythonProject1/source/data/maps/level_1.json | 2 +- .../states/__pycache__/level.cpython-312.pyc | Bin 12387 -> 14509 bytes pythonProject1/source/states/level.py | 52 +++++++++---- 11 files changed, 147 insertions(+), 20 deletions(-) create mode 100644 pythonProject1/source/components/__pycache__/box.cpython-312.pyc create mode 100644 pythonProject1/source/components/__pycache__/enemy.cpython-312.pyc diff --git a/pythonProject1/source/__pycache__/constants.cpython-312.pyc b/pythonProject1/source/__pycache__/constants.cpython-312.pyc index 7428127d52f9af828c838b6113d87180bc664877..f8b736d8f7c36bb0283ca9887db10243e290c559 100644 GIT binary patch delta 136 zcmZ3*{DPVHG%qg~0}xm&i%EMmkynz@W}><&PYQb!X9`CYS0$$=*Te)Bf!5c7JLFnf z9nwKc85me5HYqc5Ph93H%Fgcv8|o9{d5hcC&($|_;)_x)L7*Z=ATD;DoX)5( icY{x;f%^uZU<3C9F5U+A8~j2IJP+7K8(E6@frrIKBfV`7HN#CeL0oD&atPF7~j&dej^+g_V@iwsE;1_D(dB85($Wp`$lmY-zg%h&? diff --git a/pythonProject1/source/components/__pycache__/box.cpython-312.pyc b/pythonProject1/source/components/__pycache__/box.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df30de2c40b8bfc9049ae8c4f4bf9986d167624d GIT binary patch literal 1747 zcmZ`)&2Jk;6o0cH?%J_KTbzmv?Rsl_&FosT zk!gF#A(0BfCkqKg)LRu09Qg;3khs(kWNQF%Ktjqbs^QWTZ`K~K6~ZWa@AuxD_pxu@ zjDL*9B7p1rFS3Od8Q@PYh^3Cepn#wQCYYoQ889VNE|ZFskt%XVCR|ofRx&C939f*t zZh#rGz>bPQ0k@|EEYL3IjueQe9%I=Qw4TsjlVKYdT@!yi;|(T-9^) ze4kik1O_J&bijfPF(D(FWCJpCQ_^K7Uv?UKMeIj@4F7rJK?YNGz#E%vp8C+TCp||t zn@2dbTCh7Rg+Pn6z!>|rB$Px$p(Udf63#_z>|?%r9I*%}X~N!uquTa1+_?epk%HFa zVrRhZ7XvJiHzSaJN}zyyvjW=*fdXzyb0`!^OLHjo6GI6tuc ziy|yT{y$#hb8dpJUey&{DLurwpnS6Sc?&3yh1ySr)>jDa&XL-0|Ep!1S1MZuUJhOM zgC8P#oP}!5VyW*9@anEqR8)NQ03k)82O)hS#iFY^p%f!Jt;&b6Ln2 zkmqVOt7=j{&n#TDJfl>}6)noYlxbJ4y|wnva{4+WX*PBF+H!i;c<<)BHYnzyofr&4pO7CsqS{KgBlCVc_JeHg_D;eu!azl!c(NFKs( z+Vpm8E7sGJT`k$u7Q5Qwj=873+COn}Q+X5;Y<2;q*fU8@MmCi_ZT4UqUYbMIR6mjG zCC+sd=bixxSIOo|KYDz7b!)X3O?9KG&+A`4`0T+~^>6M!x&NKreQo*a>GBVkkUYJ0 z2kG9r(ObXQUBCC!>GChp%7M&79E2b_?Gzv z59+z{(BgON3D7g>LKisUx5p>^SX};QZNNZ^tMkJ>+^mNwfBYHv1LIE#sct0o J51_)2@-O~POMw6Y literal 0 HcmV?d00001 diff --git a/pythonProject1/source/components/__pycache__/brick.cpython-312.pyc b/pythonProject1/source/components/__pycache__/brick.cpython-312.pyc index 4304f25f85eda089bf1049902424b0b1fcf05ee5..cb96e728a6350bcb60e15527597500f04cf72d02 100644 GIT binary patch delta 150 zcmX@hcZQGmG%qg~0}xm&i%B~%k@t!qQww7hb0woD%Pm%?qRixMzl|U3nc29Vf;^qQ zCl|9s$fOk|=BCCMr6!jY-x5ekEXs~Yh)jOY@|rPk@?}h&*74DH{J_J=sN)buK9%Ic`-h9xx@7(Nwo*Bz z%YOa(^?R>-y1(~c>yM3%9s*7O-R#^a!2KNuRujt1{u(f=L?$wqATvaE$j$_pbj&!C z&KW0%V;;u*i~ziFo6NWzWSq#Z+eB_qNW95%SLx#|72e_=IZbZH&8$VRb}MdM>S0n3 zNWE23Za6;tY2*ol><(N>ihpxdNjNKyk(WUjkVr zIrugoaCr_m2XfFm%ROK21?=beSswHpd1s!_3pq}9Eqt30+N#;!bB>%d$IA^l;ZgYn z^RArh5&>P2={9TSZ-rG%U3azaXP_JMOc}hE%_s(U%iywxTaHmBs>RYNLx`pmX-e^P z4cB}+oxC2|!?g`zA)U@d;0RpfOlk;|OweF>l$4UphUJJBv3T@N-DoCe!`IWAmQGSH z45`FiF#{D3DQLE@M~A;Rds$VeI(sWQdm$UW5uwQoG#!Ussk51^b|alC4+m$}^dgNa zv(a=ilTImc^s~(0u}s#GqEv}!N|*`g0ayUfNc|MZGAXrot&QoehnFWx2M0EWf8D#~ z-yZ&b?_>X0llsudJ6EGS@`8Rfv2!q?^F7N$%Qp(ywe}Yctt%h>?6c=B9V<82I@d!R zXSOasZTWsdcqtO8b@|-O2I6U3x%uw9})~<6c0D*vaF%U>t*2j8@O5}nmrZA zTdQetfKzRYoqS*Gf-uCv>wh&vd<3NGG=f2|xqprgy z3(LP~?N|wrpH1O#mr>55vL5Y6c5f2$1e_D zICFORlEDod-qESi^H;;?FQ1z}O9M<@qmh(4m!?UBpG(9t^bks2kxWKO$@DM`LINFt zj=qBv9y5|y9C#{$WO%FN2=~FzZG!s<43}C>a90Hw`c{{LKsoaFy&}B(WMSgDujgU! zgWlh?f7!Fyv+dSHr+0kH;|U;NeF|jv%E!ekvVKK=;!{A`A1wO&b$@@+e_Zz;-|}pq zdMrHkj}<0MQcF<^=u)649oD78>l3@uaVG25rS771M3;`NUwbAE{?iSsnn*3DV%QHM zh+2l!7KYUSQdaDOz-$?*N{Hx(H9$-q{DRa*tfdLZ1=xk;KLW=-4jOfkEIXD!U3M;k zPe{A=9zfg1cEw+PALWE^7cJ1LyTeKW%pwl?sl7b7rkKbneqKm4vBYB*Gy$l^q6?5+ zql=Wnvn0&YV?XL2MAC=kC|Yt1TPhxYkfFtJEoR{Pq%27$V9XJkswp6l3j>E9PCl3{ z1_t%O;M2gnEX9?)%|&lO_XgIqhf5EZbZ=;5_=)#;DR`t9JfR0qYz^wcQ`?;0`+i|$ zR|=GT-4DASbgfSp``**x&-b0e$lVE$7JdD?ufH(z`2;*>q!SDoQ;^o7s$d}rhYe3S zoJ`A$3FM`4_~v3HVa~7|P7&+$10b7(8JiJ+WsoAl#G)d(OC8qyP$^@nTN-+>dd+FV#<+g z$ct6bwt)&}<(7k|wE1w(iI2+A;1B}NsgN_ov-Gov8=#{W0jbSbxDdY=v^1)uwvQ8U zOjyGp+cdg>sMWny$++!6go*M%Li^RLZqCI35jCSUmb3zPp48}BvUXk}U^hdbe50MNZ!M6ZCjRY&GximXtBq!lt#T&j&_8o3vm@}1d z>VL!yqVWHOo4udH+I#Gl5G#9F5&z zZA(ob^wNJyDKk9_6W@5%P3%{lebXPJ?wdCa_x;T`eQU$FHL^YMOdK}WS~_#?^;2809iTC?2O;t$N^^#R4? zfXPM0n0o2tIPOoR@h`;xXVU$OcXO?;JA1f+!q~m@cg`23pe_Yp6A-*U&3U+Cu5kG^ T!Tz=1!;N!=(SO0HyyJfZ!wgMq literal 0 HcmV?d00001 diff --git a/pythonProject1/source/components/box.py b/pythonProject1/source/components/box.py index e69de29..177bc7d 100644 --- a/pythonProject1/source/components/box.py +++ b/pythonProject1/source/components/box.py @@ -0,0 +1,26 @@ +import pygame +from .. import tools,setup +from .. import constants as C + +class Box(pygame.sprite.Sprite): + def __init__(self, x, y,box_type): + pygame.sprite.Sprite.__init__(self) + self.x = x + self.y = y + self.box_type = box_type + self.frame_rects = [ + (384,0,16,16), + (400,0,16,16), + (416,0,16,16), + (432,0,16,16), + ] + + self.frames = [] + for frame_rect in self.frame_rects: + self.frames.append(tools.get_image(setup.GRAPHICS['tile_set'],*frame_rect,(0,0,0),C.BRICK_MULTI)) # 遍历加载图片 + + self.frame_index = 0 + self.image = self.frames[self.frame_index] + self.rect = self.image.get_rect() + self.rect.x = self.x + self.rect.y = self.y # 设置坐标与图片 diff --git a/pythonProject1/source/components/brick.py b/pythonProject1/source/components/brick.py index 24dc415..50463ce 100644 --- a/pythonProject1/source/components/brick.py +++ b/pythonProject1/source/components/brick.py @@ -3,22 +3,22 @@ from .. import tools,setup from .. import constants as C class Brick(pygame.sprite.Sprite): - def __init__(self, x, y,brick_type,color=1): + def __init__(self, x, y,brick_type,color=None): pygame.sprite.Sprite.__init__(self) self.x = x self.y = y self.type = brick_type - bright_rect_frames = [(16,0,16,16),(48,0,16,16)] - dark_rect_frames = [(16,32,16,16),(48,32,16,16)] # 抠图 + bright_frame_rects = [(16,0,16,16),(48,0,16,16)] + dark_frame_rects = [(16,32,16,16),(48,32,16,16)] # 抠图 if not color: - self.frame_rects = bright_rect_frames + self.frame_rects = bright_frame_rects else: - self.frame_rects = dark_rect_frames + self.frame_rects = dark_frame_rects self.frames = [] for frame_rect in self.frame_rects: - self.frames.append(tools.get_image(setup.GRAPHICS['tile_set'],*frame_rect,(0,0,0),C.BG_MULTI)) # 遍历加载图片 + self.frames.append(tools.get_image(setup.GRAPHICS['tile_set'],*frame_rect,(0,0,0),C.BRICK_MULTI)) # 遍历加载图片 self.frame_index = 0 self.image = self.frames[self.frame_index] diff --git a/pythonProject1/source/components/enemy.py b/pythonProject1/source/components/enemy.py index e69de29..70f9efe 100644 --- a/pythonProject1/source/components/enemy.py +++ b/pythonProject1/source/components/enemy.py @@ -0,0 +1,73 @@ +import pygame +from .. import setup,tools +from .. import constants as C + +def create_enemy(enemy_data): + enemy_type = enemy_data['type'] + x,y_bottom,direction,color = enemy_data['x'],enemy_data['y'],enemy_data['direction'],enemy_data['color'] + + if enemy_type == 0: # 蘑菇类 + enemy = Goomba(x,y_bottom,direction,'goomba',color) + elif enemy_type == 1: + enemy = Koopa(x,y_bottom,direction,'koopa',color) + + return enemy + + +class Enemy(pygame.sprite.Sprite): + def __init__(self,x,y_bottom,direction,name,frame_rects): + pygame.sprite.Sprite.__init__(self) + self.direction = direction + self.name = name + self.frame_index = 0 + self.left_frames = [] + self.right_frames = [] + + self.load_frames(frame_rects) + self.frames = self.left_frames if self.direction == 0 else self.right_frames + self.image = self.frames[self.frame_index] + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.bottom = y_bottom + + self.timer = 0 + + def load_frames(self,frame_rects): + for frame_rect in frame_rects: + left_frame = tools.get_image(setup.GRAPHICS['enemies'],*frame_rect,(0,0,0),C.ENEMY_MULTI) + right_frame = pygame.transform.flip(left_frame,True,False) + self.left_frames.append(left_frame) + self.right_frames.append(right_frame) + + def update(self): + self.current_time = pygame.time.get_ticks() + if self.current_time - self.timer > 125: + self.frame_index = (self.frame_index + 1) % 2 + self.image = self.frames[self.frame_index] + self.timer = self.current_time + + +class Goomba(Enemy): + def __init__(self, x, y_bottom, direction, name, color): + bright_frame_rects = [(0, 16, 16, 16), (16, 16, 16, 16), (32, 16, 16, 16)] + dark_frame_rects = [(0, 48, 16, 16), (16, 48, 16, 16), (32, 48, 16, 16)] # 抠图 + + if not color: + frame_rects = bright_frame_rects + else: + frame_rects = dark_frame_rects + + Enemy.__init__(self,x,y_bottom,direction,name,frame_rects) + + +class Koopa(Enemy): + def __init__(self, x, y_bottom, direction, name, color): + bright_frame_rects = [(96, 9, 16, 22), (112, 9, 16, 22), (160, 9, 16, 22)] + dark_frame_rects = [(96, 72, 16, 2), (112, 72, 16, 22), (160, 72, 16, 22)] # 抠图 + + if not color: + frame_rects = bright_frame_rects + else: + frame_rects = dark_frame_rects + + Enemy.__init__(self,x, y_bottom, direction, name, frame_rects) diff --git a/pythonProject1/source/constants.py b/pythonProject1/source/constants.py index a2600fa..1cdfe7c 100644 --- a/pythonProject1/source/constants.py +++ b/pythonProject1/source/constants.py @@ -4,6 +4,8 @@ GROUND_HEIGHT = SCREEN_H - 62 BG_MULTI = 2.68 PLAYER_MULTI = 2.9 +BRICK_MULTI = 2.69 +ENEMY_MULTI = 2.5 GRAVITY = 1.0 ANTI_GRAVITY = 0.3 diff --git a/pythonProject1/source/data/maps/level_1.json b/pythonProject1/source/data/maps/level_1.json index 9162148..1ca9b2c 100644 --- a/pythonProject1/source/data/maps/level_1.json +++ b/pythonProject1/source/data/maps/level_1.json @@ -154,7 +154,7 @@ {"x":4330, "y":538, "direction":0, "type":0, "color":0} ]}, {"5":[ - {"x":4700, "y":538, "direction":0, "type":1, "color":1} + {"x":4700, "y":538, "direction":0, "type":1, "color":0} ]}, {"6":[ {"x":4900, "y":538, "direction":0, "type":0, "color":0}, diff --git a/pythonProject1/source/states/__pycache__/level.cpython-312.pyc b/pythonProject1/source/states/__pycache__/level.cpython-312.pyc index 049ef8e6bf43b22b75b233b0dd9887f239b49852..43d1d7d5ccd99bf7c37e0df740fdc21cceee9020 100644 GIT binary patch delta 4147 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