From acbbf2ed948cb050daad1d043a33700df6addf34 Mon Sep 17 00:00:00 2001 From: MrZ_26 <1046101471@qq.com> Date: Thu, 16 May 2024 11:24:36 +0800 Subject: [PATCH] =?UTF-8?q?app=5Fpong=E4=B8=B4=E6=97=B6=E6=94=B9=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/scene/app_pong.lua | 175 +++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 86 deletions(-) diff --git a/assets/scene/app_pong.lua b/assets/scene/app_pong.lua index 2d3099be..86ee4179 100644 --- a/assets/scene/app_pong.lua +++ b/assets/scene/app_pong.lua @@ -1,5 +1,4 @@ local gc=love.graphics -local kb=love.keyboard local abs=math.abs local max,min=math.max,math.min @@ -9,38 +8,45 @@ local rnd=math.random local scene={} local state -local bx,by=640,360-- Ball posotion -local vx,vy=0,0-- Ball velocity -local ry=0-- Rotation Y -local p1,p2-- Player data +local player={} -- Player data +local ball={ -- Rotation Y + x=640,y=360, + vx=0,vy=0, + ry=0, +} + +local W,H=1400,900 +local autoMoveFactor=26 +local moveAcc,maxMoveSpeed=2600,2600 +local rollRate,ryTransSpeed=0.62,620 function scene.enter() BG.set('none') state=0 - bx,by=640,360 - vx,vy=0,0 - ry=0 + ball.x,ball.y=640,360 + ball.vx,ball.vy=0,0 + ball.ry=0 - p1={ + player[1]={ score=0, y=360, vy=0, - y0=false, + targetY=false, } - p2={ + player[2]={ score=0, y=360, vy=0, - y0=false, + targetY=false, } end local function start() state=1 - vx=MATH.coin(6,-6) - vy=rnd()*6-3 + ball.vx=MATH.coin(360,-360) + ball.vy=rnd()*6-3 end function scene.keyDown(key,isRep) if isRep then return true end @@ -50,15 +56,15 @@ function scene.keyDown(key,isRep) end elseif key=='r' then state=0 - bx,by=640,360 - vx,vy=0,0 - ry=0 - p1.score,p2.score=0,0 - FMOD.effect('hold') + ball.x,ball.y=640,360 + ball.vx,ball.vy=0,0 + ball.ry=0 + player[1].score,player[2].score=0,0 + FMOD.effect('rotate') elseif key=='w' or key=='s' then - p1.y0=false + player[1].targetY=false elseif key=='up' or key=='down' then - p2.y0=false + player[2].targetY=false elseif key=='escape' then if sureCheck('back') then SCN.back() end end @@ -68,94 +74,87 @@ function scene.touchDown(x,y) scene.touchMove(x,y) if state==0 then start() end end -function scene.touchMove(x,y)(x<640 and p1 or p2).y0=y end -function scene.mouseMove(x,y)(x<640 and p1 or p2).y0=y end +function scene.mouseDown(_,_,k) if state==0 and k==1 then start() end end +function scene.touchMove(x,y)(x<640 and player[1] or player[2]).targetY=y end +function scene.mouseMove(x,y)(x<640 and player[1] or player[2]).targetY=y end -- Rect Area X:150~1130 Y:20~700 -function scene.update() +function scene.update(dt) -- Update pads - local P=p1 - while P do - if P.y0 then - if P.y>P.y0 then - P.y=max(P.y-8,P.y0,70) - P.vy=-10 - elseif P.y650 then - P.vy=-P.vy/2 - P.y=650 - elseif P.y<70 then - P.vy=-P.vy/2 - P.y=70 + if isKeyDown(P==player[1] and 's' or 'down') then + P.vy=min(P.vy+moveAcc*dt,maxMoveSpeed) end end - P=P==p1 and p2 + P.vy=MATH.expApproach(P.vy,0,dt*6.26) + P.y=P.y+P.vy*dt + if P.y~=MATH.clamp(P.y,70,650) then + P.y=MATH.clamp(P.y,70,650) + P.vy=-P.vy*0.626 + end end -- Update ball - bx,by=bx+vx,by+vy - if ry~=0 then - if ry>0 then - ry=max(ry-.1,0) - vy=vy-.1 - else - ry=min(ry+.1,0) - vy=vy+.1 - end + ball.x,ball.y=ball.x+ball.vx*dt,ball.y+ball.vy*dt + if ball.ry~=0 then + local dry=ball.ry-MATH.linearApproach(ball.ry,0,ryTransSpeed*dt) + ball.vy=ball.vy+dry + ball.ry=ball.ry-dry + -- if ball.ry>0 then + -- ball.ry=max(ball.ry-ryTransSpeed,0) + -- ball.vy=ball.vy-ryTransSpeed*dt + -- else + -- ball.ry=min(ball.ry+ryTransSpeed,0) + -- ball.vy=ball.vy+ryTransSpeed*dt + -- end end if state==1 then -- Playing - if bx<160 or bx>1120 then - P=bx<160 and p1 or p2 - local d=by-P.y + -- Player Hit + if ball.x<160 or ball.x>1120 then + local P=ball.x<160 and player[1] or player[2] + local d=ball.y-P.y if abs(d)<60 then - vx=-vx-(vx>0 and .05 or -.5) - vy=vy+d*.08+P.vy*.5 - ry=P.vy - FMOD.effect('collect') + ball.vx=-(ball.vx+MATH.sign(ball.vx)*6) + ball.vy=ball.vy+d*.08+P.vy*.5 + ball.ry=P.vy*rollRate + FMOD.effect('touch') else state=2 end end - if by<30 or by>690 then - by=by<30 and 30 or 690 - vy,ry=-vy,-ry - FMOD.effect('collect') + -- Wall Hit + if ball.y<30 or ball.y>690 then + ball.y=ball.y<30 and 30 or 690 + ball.vy,ball.ry=-ball.vy,-ball.ry + FMOD.effect('move') end elseif state==2 then -- Game over - if bx<-120 or bx>1400 or by<-40 or by>760 then - P=bx>640 and p1 or p2 - P.score=P.score+1 - TEXT:add("+1",P==p1 and 470 or 810,226,50,'score') - FMOD.effect('beep_rise') - + if ball.x<-120 or ball.x>1400 or ball.y<-40 or ball.y>760 then state=0 - bx,by=640,360 - vx,vy=0,0 + ball.x,ball.y=640,360 + ball.vx,ball.vy=0,0 + + local winner=ball.x>640 and 1 or 2 + player[winner].score=player[winner].score+1 + TEXT:add({text="+1",x=winner==1 and 470 or 810,y=226,fontSize=50,style='score'}) + FMOD.effect('beep_rise') end end - bx,by,vx,vy,ry=bx,by,vx,vy,ry end function scene.draw() -- Draw score gc.setColor(.4,.4,.4) FONT.set(100) - GC.mStr(p1.score,470,20) - GC.mStr(p2.score,810,20) + GC.mStr(player[1].score,470,20) + GC.mStr(player[2].score,810,20) -- Draw boundary gc.setColor(COLOR.L) @@ -164,16 +163,20 @@ function scene.draw() gc.line(134,700,1146,700) -- Draw ball & speed line - gc.setColor(1,1,1-abs(ry)*.16) - gc.circle('fill',bx,by,10) + gc.setColor(1,1,1-abs(ball.ry)*.16) + gc.circle('fill',ball.x,ball.y,10) gc.setColor(1,1,1,.1) - gc.line(bx+vx*22,by+vy*22,bx+vx*30,by+vy*30) + gc.line(ball.x+ball.vx*22,ball.y+ball.vy*22,ball.x+ball.vx*30,ball.y+ball.vy*30) -- Draw pads gc.setColor(1,.8,.8) - gc.rectangle('fill',134,p1.y-50,16,100) + gc.rectangle('fill',134,player[1].y-50,16,100) gc.setColor(.8,.8,1) - gc.rectangle('fill',1130,p2.y-50,16,100) + gc.rectangle('fill',1130,player[2].y-50,16,100) + + FONT.set(30) + gc.print(ball.vx,100,100) + gc.print(ball.vy,100,120) end scene.widgetList={