From f3bd05e9125164977cb6b65b01c7d020b573d5df Mon Sep 17 00:00:00 2001 From: ouyu <1986834078@qq.com> Date: Thu, 16 Apr 2026 19:25:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=BF=80=E5=85=89=E5=92=8C=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6):=20=E5=A2=9E=E5=8A=A0=E6=BF=80=E5=85=89=E6=A8=AA?= =?UTF-8?q?=E5=90=91=E7=A7=BB=E5=8A=A8=E5=92=8C=E6=95=A3=E5=BC=B9=E6=9E=AA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为激光类添加横向移动能力,支持斜向发射 为玩家类添加散弹枪功能,可同时发射三发不同方向的激光 调整激光销毁逻辑,增加横向边界检测 --- code/__pycache__/alien.cpython-312.pyc | Bin 0 -> 2342 bytes code/__pycache__/laser.cpython-312.pyc | Bin 0 -> 2002 bytes code/__pycache__/obstacle.cpython-312.pyc | Bin 0 -> 1030 bytes code/__pycache__/player.cpython-312.pyc | Bin 0 -> 5360 bytes code/laser.py | 10 +++++++--- code/player.py | 21 +++++++++++++++++++++ 6 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 code/__pycache__/alien.cpython-312.pyc create mode 100644 code/__pycache__/laser.cpython-312.pyc create mode 100644 code/__pycache__/obstacle.cpython-312.pyc create mode 100644 code/__pycache__/player.cpython-312.pyc diff --git a/code/__pycache__/alien.cpython-312.pyc b/code/__pycache__/alien.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd0c0ffe74287ef9db018060efcff7d3df5e366d GIT binary patch literal 2342 zcmbVN-D@0G6u);q_9NZhY14$}i@L#}j4bzIE-^|HnUE5w|6En z8@I46sogx3#)p!=2zgA1e}zv%LAplBGWH?h)4mCbr3g~bnc3NF(hAo5aPGP1+R$38C;@;e@)rM8*fIxwq*5k?)7BNCY+Oj;sL=A4{ zCfLT6lY`d^yjK6mYo$Wl+mR`PR59HN}Vjw zoO*@mvaf#N*t}?U2a7xgx_goma*wVOFLFSZ)hf9I3E6B*C?umw7vaPtq}LU%W2q49 zJnJxpWQXlARb>gZIu|GHnBk_$`yh6UCadi zG7$xg)poxD@}x!{N%0%6Hl*HPrM_lne)Eg9msdW$ zmutpTEAe0AC)TX{ecul?`v>aEot|BAPpqi<@qnEYbnu73tYW{Q^w3(M&x0*=Gkm8d z8SS1Vq(V06WnB`-;k`Hk1o(c~{3Nq6|8}Y9qVsH445K(US7xTi7gJ%T!czt`ZXb{u zX-cu%`VIZ|_|5T^!G<*S?YI~L#YPOHs~>+AZ!jwXZR_@xHe}xp(ZGT$ijU; z-L9v_9mg;>s2BpNi($VX1R}6D0l`$bSiL7pWKT*+gOB^DG#q#h^cJW(E6U>w4Ur2A zo-i%+6D@Qelt6-r4h<3I@DO?Np}}Yb>Hj=5D3bzEr>hc^gJC5zh{WiOsbZ3;*JT## zmi^19(W1}X->WiCC_aXmXI`nv}O$Bf~u@Ks^wXT8=LFxC3|>C>n7&p=w3yVl1* z1jeT)MGAQ=qQG7f7=bv7K`lD~M~iL=$U%S~K=i}Wceb>%+uBq^o7&PoLP+nZ$@=Fvjb{A#%9oA! zK<&-u(c`trTjzG-J;)!cO)j0=IRtyLeldXkTeY!UdeEI#2ZRs+W+dpS&wzPBP?P8V zjh_X&I0>e8c^~THGzw^t%K%y-#sdH@rov2x0DlQCx&uHC0=#c^=)0kYG~5Qc7=;_+ z6};O8RQL%Ifdosr57Z;lM6I1P!w?qZ+5+QscZ#C@|*YGd~fE> zzHgp?jzrEO7~lW+!2F6J^iUYVP}<7zN1*H@0~t7nQiz~MWRN;CB!;pO^YqBdPkRtL zkbGZCaJ31dlr64qWv$J5|#z-bJnuz^y72AsK#P9e7#J6}K*)aQKN2#E%0ejH4F|s?6Sv5d)X9FK#->M+mxmpEf z2fCO*%bpLk?re}C9-}@{kuEyWD)>7oh=X%O9X|o9b8f#sD`cpRk3OBy*6 zDIbl3aFs9COq*%gRdtrP8Q0Fcid8By?ha6D=1rSYS1mfL=?&(FmPVpRXu-hXRFoVroSGiPPF2syoK=08sxj9V*u z!C)&8!}v_m;o{?$qaGP%f(wb;Tc3hBsiONNRJ+t9!}rMO{hw=qj^ET!ez;B5< z#QAdq5;7Q&u;7#0A^!N!%^mB!WD)xG!bD9>Jh*QOaEm&`YfHJ`Y)oNNJ`DJo%bbtJt@g|wrO7{0o*QU2-yzi}HF8-vn zkmz!G=xxyD&Qa(mMky!sFr}ZB(m8*{>mh!IFF}wSY4;?Z<#Lq5Ru@G|;_JTa5sZtM z=LzwBEOEb+I(ke(B>Bg%OosjnOC;u{;ej-nhXLZMR*^$1cGYEX_SSAAALsFQ;B7y@ pcX$%;;ymjG5RW8`@$V?|r#ymV+aK&+-no1jjyJ>c#|Ru={6Ay~aF+l8 literal 0 HcmV?d00001 diff --git a/code/__pycache__/obstacle.cpython-312.pyc b/code/__pycache__/obstacle.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ac781997522000fa6f4aa5d1b7426e8f73f6f2e GIT binary patch literal 1030 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 literal 0 HcmV?d00001 diff --git a/code/laser.py b/code/laser.py index 0f50dcc..1a1e7b9 100644 --- a/code/laser.py +++ b/code/laser.py @@ -1,18 +1,22 @@ import pygame class Laser(pygame.sprite.Sprite): - def __init__(self,pos,speed,screen_height): + def __init__(self,pos,speed_y,screen_height,speed_x=0): super().__init__() self.image = pygame.Surface((4,20)) self.image.fill('white') self.rect = self.image.get_rect(center = pos) - self.speed = speed + self.speed_y = speed_y + self.speed_x = speed_x self.height_y_constraint = screen_height def destroy(self): if self.rect.y <= -50 or self.rect.y >= self.height_y_constraint + 50: self.kill() + if self.rect.x <= -50 or self.rect.x >= self.height_y_constraint + 50: + self.kill() def update(self): - self.rect.y += self.speed + self.rect.x += self.speed_x + self.rect.y += self.speed_y self.destroy() diff --git a/code/player.py b/code/player.py index 495ca29..72bad4a 100644 --- a/code/player.py +++ b/code/player.py @@ -8,10 +8,15 @@ def __init__(self,pos,constraint,speed): self.rect = self.image.get_rect(midbottom = pos) self.speed = speed self.max_x_constraint = constraint + self.ready = True self.laser_time = 0 self.laser_cooldown = 600 + self.shotgun_ready = True + self.shotgun_time = 0 + self.shotgun_cooldown = 1500 + self.lasers = pygame.sprite.Group() self.laser_sound = pygame.mixer.Sound('../audio/laser.wav') @@ -31,12 +36,23 @@ def get_input(self): self.laser_time = pygame.time.get_ticks() self.laser_sound.play() + if keys[pygame.K_x] and self.shotgun_ready: + self.shoot_shotgun() + self.shotgun_ready = False + self.shotgun_time = pygame.time.get_ticks() + self.laser_sound.play() + def recharge(self): if not self.ready: current_time = pygame.time.get_ticks() if current_time - self.laser_time >= self.laser_cooldown: self.ready = True + if not self.shotgun_ready: + current_time = pygame.time.get_ticks() + if current_time - self.shotgun_time >= self.shotgun_cooldown: + self.shotgun_ready = True + def constraint(self): if self.rect.left <= 0: self.rect.left = 0 @@ -46,6 +62,11 @@ def constraint(self): def shoot_laser(self): self.lasers.add(Laser(self.rect.center,-8,self.rect.bottom)) + def shoot_shotgun(self): + self.lasers.add(Laser(self.rect.center,-8,self.rect.bottom)) + self.lasers.add(Laser(self.rect.center,-8,self.rect.bottom,speed_x=-4)) + self.lasers.add(Laser(self.rect.center,-8,self.rect.bottom,speed_x=4)) + def update(self): self.get_input() self.constraint()