From 16b45ecf45e88d84b3bfa153ce49ac30a2ad9de8 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Mon, 10 Nov 2025 12:19:17 +0100 Subject: [PATCH] - [NEW] Passat a delta time - [NEW] Nous tiles - [NEW] Batman ja puja i baixa per cordes/cadenes - [NEW] El batarang es mes visible - [NEW] el ganxo es mes visible --- data/batarang.lua | 22 ++++-- data/batman.lua | 177 ++++++++++++++++++++++++++++++++++------------ data/game.lua | 4 +- data/level1.lev | 4 +- data/level1_1.gif | Bin 2017 -> 2102 bytes data/level1_2.gif | Bin 637 -> 629 bytes data/mapa.lua | 12 +++- data/tiles01.gif | Bin 1427 -> 1713 bytes 8 files changed, 163 insertions(+), 56 deletions(-) diff --git a/data/batarang.lua b/data/batarang.lua index 91c0e64..055b393 100644 --- a/data/batarang.lua +++ b/data/batarang.lua @@ -3,36 +3,46 @@ require "mapa" batarang = { items = {}, cooldown = 0, - dx = 8, + frame_time = 0.0, + dx = 160, draw = function() surf.source(batman.surface) for i, k in pairs(batarang.items) do + k.blink = not k.blink local flip_h, flip_v = false, false if k.s==1 or k.s==2 then flip_v = true end if k.s==2 or k.s==3 then flip_h = true end + if k.blink then pal.subpal(65,22) end draw.surf(123,27,5,5,k.x,k.y,5,5, flip_h, flip_v) + if k.blink then pal.subpal(65) end end end, update = function() + local d = sys.delta() + if batarang.cooldown > 0 then batarang.cooldown = batarang.cooldown - 1 end for i, k in pairs(batarang.items) do local tx, ty = ((k.x+2)//8), ((k.y+2)//8) if (mapa.isSolid(tx,ty)) then batarang.items[i] = nil else - k.x = k.x + k.dx - k.s = k.s + 1 - if (k.s==4) then k.s = 0 end + k.x = k.x + k.dx*d + batarang.frame_time = batarang.frame_time + d + if batarang.frame_time >= 0.06 then + batarang.frame_time = 0.0 + k.s = k.s + 1 + if (k.s==4) then k.s = 0 end + end end end end, new = function(x,y,flip) --if batarang.cooldown == 0 then - table.insert(batarang.items, {x=x, y=y, s=0, dx=flip and -8 or 8}) - -- batarang.cooldown = 5 + table.insert(batarang.items, {x=x, y=y, s=0, dx=flip and -160 or 160, blink=false}) + batarang.cooldown = 10 --end end, diff --git a/data/batman.lua b/data/batman.lua index 8f0a360..a136b94 100644 --- a/data/batman.lua +++ b/data/batman.lua @@ -2,16 +2,19 @@ require "batarang" batman = { - states = {IDLE=1, WALK=2, JUMP=3, FALL=4, STAIRS=5, GRAPPLING=6, PROPELLED=7, SHOOT=8}, - x = 7*8, - y = 14*8, + states = {IDLE=1, WALK=2, JUMP=3, FALL=4, STAIRS=5, GRAPPLING=6, PROPELLED=7, SHOOT=8, ROPE=9}, + x = 104*8, + y = 6*8, surface = nil, flip = false, frames = {0}, frame = 1, + frame_time = 0.0, state = 1, + dy = 0.0, jump_counter = 0, ignore_first_tile = 0, + ignore_rope = 0, layer = 1, grappling_length = 0, @@ -25,8 +28,8 @@ batman = { local f = batman.frames[batman.frame] draw.surf((f%8)*16,(f//8)*16,16,16,batman.x,batman.y,16,16,batman.flip) if batman.grappling_length>0 then - draw.rect(batman.x+3, batman.y+7-batman.grappling_length*4, 1, batman.grappling_length*4, 64) - draw.rect(batman.x+2, batman.y+7-batman.grappling_length*4, 3, batman.grappling_length*4, 66) + draw.rect(batman.x+3, batman.y+7-batman.grappling_length*4, 1, batman.grappling_length*4, 8) + --draw.rect(batman.x+2, batman.y+7-batman.grappling_length*4, 3, batman.grappling_length*4, 66) end --local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8) --draw.rect((tx1)*8,ty*8,8,8, 4) @@ -34,18 +37,30 @@ batman = { end, update = function() - batman.frame = batman.frame + 1 - if batman.frame > #batman.frames then batman.frame = 1 end + local d = sys.delta() + + batman.frame_time = batman.frame_time + d + if batman.frame_time >= 0.06 then + batman.frame_time = 0.0 + batman.frame = batman.frame + 1 + if batman.frame > #batman.frames then batman.frame = 1 end + end + + if (batman.ignore_rope>0) then + batman.ignore_rope = batman.ignore_rope - 40*d + if batman.ignore_rope<0 then batman.ignore_rope=0 end + end if batman.state == batman.states.SHOOT then if batman.frame == 3 then - batarang.new(batman.x+8, batman.y+8, batman.flip) + if batarang.cooldown == 0 then batarang.new(batman.x+8, batman.y+8, batman.flip) end elseif batman.frame == 5 then batman.state = batman.states.IDLE batman.frames = {0} batman.frame = 1 end end + -- Si està IDLE if batman.state == batman.states.IDLE then -- Mirem si comença a caminar @@ -71,7 +86,7 @@ batman = { local tx, ty = ((batman.x+4)//8), ((batman.y+24)//8) if (not mapa.isSolid(tx,ty)) then batman.state = batman.states.FALL - batman.ignore_first_tile = 4 + batman.ignore_first_tile = 32 batman.layer = 2 end end @@ -91,11 +106,11 @@ batman = { batman.frame = 1 end elseif key.down(key.Z) then - --if batarang.cooldown==0 then + if batarang.cooldown==0 then batman.state = batman.states.SHOOT batman.frames = {5,6,7,7,7} batman.frame = 1 - --end + end end -- Mirem si ha de caure local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8) @@ -105,7 +120,8 @@ batman = { -- Mirem si comença a botar if (batman.state ~= batman.states.FALL) and (key.down(key.X)) then batman.state = batman.states.JUMP - batman.jump_counter = 0 + batman.dy = -90 + --batman.jump_counter = 0 end end @@ -115,12 +131,12 @@ batman = { batman.state = batman.states.WALK batman.flip=false local tx, ty = ((batman.x+12)//8), ((batman.y+8)//8) - if not mapa.isSolid(tx,ty) then batman.x = batman.x + 2 end + if not mapa.isSolid(tx,ty) then batman.x = batman.x + 40*d end elseif key.down(key.LEFT) then batman.state = batman.states.WALK batman.flip=true local tx, ty = ((batman.x+3)//8), ((batman.y+8)//8) - if not mapa.isSolid(tx,ty) then batman.x = batman.x - 2 end + if not mapa.isSolid(tx,ty) then batman.x = batman.x - 40*d end else -- Ha parat de caminar batman.state = batman.states.IDLE @@ -135,21 +151,26 @@ batman = { -- Mirem si comença a botar if key.down(key.X) then batman.state = batman.states.JUMP - batman.jump_counter = 0 + batman.dy = -90 + --batman.jump_counter = 0 elseif key.down(key.Z) then - --if batarang.cooldown==0 then + if batarang.cooldown==0 then batman.state = batman.states.SHOOT batman.frames = {5,6,7,7,7} batman.frame = 1 - -- end + end end end if batman.state == batman.states.JUMP then - batman.y = batman.y - 4 - batman.jump_counter = batman.jump_counter + 1 - if batman.jump_counter == 5 then - batman.jump_counter = 0 + batman.y = batman.y + batman.dy*d + batman.dy = batman.dy + 4 + batman.frames = {4} + batman.frame = 1 + --batman.jump_counter = batman.jump_counter + 1 + --if batman.jump_counter == 5 then + if batman.dy >= 0 then + --batman.jump_counter = 0 batman.state = batman.states.FALL batman.frames = {4} batman.frame = 1 @@ -157,11 +178,19 @@ batman = { if key.down(key.RIGHT) then batman.flip=false local tx, ty = ((batman.x+12)//8), ((batman.y+8)//8) - if not mapa.isBlock(tx,ty) then batman.x = batman.x + 2 end + if not mapa.isBlock(tx,ty) then batman.x = batman.x + 40*d end elseif key.down(key.LEFT) then batman.flip=true local tx, ty = ((batman.x+3)//8), ((batman.y+8)//8) - if not mapa.isBlock(tx,ty) then batman.x = batman.x - 2 end + if not mapa.isBlock(tx,ty) then batman.x = batman.x - 40*d end + end + local tx, ty = ((batman.x+4)//8), ((batman.y+8)//8) + if mapa.isRope(tx,ty) and batman.ignore_rope==0 then + batman.state = batman.states.ROPE + batman.ignore_rope=10 + batman.frames = {10} + batman.frame = 1 + batman.x = (((batman.x+4)//8)*8)-4 end end @@ -169,15 +198,15 @@ batman = { if key.down(key.RIGHT) then batman.flip=false local tx, ty = ((batman.x+12)//8), ((batman.y+8)//8) - if not mapa.isSolid(tx,ty) then batman.x = batman.x + 2 end + if not mapa.isSolid(tx,ty) then batman.x = batman.x + 40*d end elseif key.down(key.LEFT) then batman.flip=true local tx, ty = ((batman.x+3)//8), ((batman.y+8)//8) - if not mapa.isSolid(tx,ty) then batman.x = batman.x - 2 end + if not mapa.isSolid(tx,ty) then batman.x = batman.x - 40*d end end - local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8) - if (batman.ignore_first_tile>0) or ((not mapa.isSolid(tx1,ty)) and (not mapa.isSolid(tx2,ty))) then + + if (batman.ignore_first_tile>0) or ((not mapa.isPlatform(tx1,ty)) and (not mapa.isPlatform(tx2,ty))) then if batman.ignore_first_tile>0 then batman.ignore_first_tile = batman.ignore_first_tile - 1 else @@ -186,13 +215,27 @@ batman = { batman.state = batman.states.FALL batman.frames = {4} batman.frame = 1 - batman.y = batman.y + 4 + + batman.dy = batman.dy + 4 + if batman.dy > 80 then batman.dy=80 end + batman.y = batman.y + batman.dy*d + --batman.y = batman.y + 80*d else batman.y = (batman.y//8)*8 + batman.dy = 0 batman.state = batman.states.IDLE batman.frames = {0} batman.frame = 1 end + + local ty2 = ((batman.y+8)//8) + if mapa.isRope(tx1,ty2) and batman.ignore_rope==0 then + batman.state = batman.states.ROPE + batman.ignore_rope=10 + batman.frames = {10} + batman.frame = 1 + batman.x = (((batman.x+4)//8)*8)-4 + end end if batman.state == batman.states.STAIRS then @@ -205,7 +248,7 @@ batman = { batman.frames = {8,10,9,10} batman.frame = 1 end - batman.y = batman.y + 2; + batman.y = batman.y + 40*d; else batman.state = batman.states.IDLE batman.frames = {0} @@ -219,7 +262,7 @@ batman = { batman.frames = {8,10,9,10} batman.frame = 1 end - batman.y = batman.y - 2; + batman.y = batman.y - 40*d; else batman.state = batman.states.IDLE batman.frames = {0} @@ -236,28 +279,72 @@ batman = { end end + if batman.state == batman.states.ROPE then + local moving = false + if key.down(key.DOWN) then + moving = true + local tx, ty = ((batman.x+4)//8), ((batman.y+8)//8) + if (mapa.isRope(tx,ty)) then + if #batman.frames==1 then + batman.frames = {8,10,9,10} + batman.frame = 1 + end + batman.y = batman.y + 40*d; + end + elseif key.down(key.UP) then + moving = true + local tx, ty = ((batman.x+4)//8), ((batman.y-1)//8) + if (mapa.isRope(tx,ty)) then + if #batman.frames==1 then + batman.frames = {8,10,9,10} + batman.frame = 1 + end + batman.y = batman.y - 40*d; + end + elseif key.down(key.X) and batman.ignore_rope==0 then + if key.down(key.LEFT) then batman.flip = true end + if key.down(key.RIGHT) then batman.flip = false end + batman.state = batman.states.JUMP + batman.ignore_rope=10 + batman.dy = -100 + end + if not moving then + batman.frames = {10} + batman.frame = 1 + end + end + if batman.state == batman.states.GRAPPLING then - batman.grappling_length = batman.grappling_length + 1 - local tx, ty = ((batman.x+2)//8), ((batman.y+7-batman.grappling_length*4)//8) - if mapa.isSolid(tx, ty) then - if mapa.isBlock(tx,ty) then - batman.grappling_length = 0 - batman.state = batman.states.IDLE - batman.frames = {0} - batman.frame = 1 - else - batman.layer = 2 - batman.state = batman.states.PROPELLED + batman.grappling_length = batman.grappling_length + 40*d + if batman.grappling_length >= 12 then + batman.grappling_length = 0 + batman.state = batman.states.IDLE + batman.frames = {0} + batman.frame = 1 + else + local tx, ty = ((batman.x+2)//8), ((batman.y+7-batman.grappling_length*4)//8) + if mapa.isSolid(tx, ty) then + if mapa.isBlock(tx,ty) then + batman.grappling_length = 0 + batman.state = batman.states.IDLE + batman.frames = {0} + batman.frame = 1 + else + batman.layer = 2 + batman.state = batman.states.PROPELLED + end end end end if batman.state == batman.states.PROPELLED then - batman.grappling_length = batman.grappling_length - 1 - batman.y = batman.y - 4 - if batman.grappling_length == 0 then + batman.grappling_length = batman.grappling_length - 40*d + batman.y = batman.y - 160*d + if batman.grappling_length <= 0 then + batman.grappling_length = 0 batman.state = batman.states.JUMP - batman.jump_counter = 0 + --batman.jump_counter = 0 + batman.dy = -100 end end diff --git a/data/game.lua b/data/game.lua index 6d2b7b2..7ba0948 100644 --- a/data/game.lua +++ b/data/game.lua @@ -26,10 +26,10 @@ game = { mapa.draw(2) if batman.layer==2 then batman.draw() end - if sys.beat() then + --if sys.beat() then batman.update() batarang.update() - end + --end --view.origin(0,0) --draw.text(tostring(mx//8)..","..tostring(my//8),50,0,22) diff --git a/data/level1.lev b/data/level1.lev index 72dfba0..e64310a 100644 --- a/data/level1.lev +++ b/data/level1.lev @@ -1,2 +1,2 @@ -start-x=-984 -start-y=8 +start-x=-808 +start-y=-32 diff --git a/data/level1_1.gif b/data/level1_1.gif index b6d496fc32306b858e685a3a45a847433eeb352a..cb62c58610cdc2a09cd58bc2ebfd40f63ec5e8d9 100644 GIT binary patch delta 1789 zcmV)w44M2O$Og99f~LU{0j#zP29P8_-M=F5o#7ahPj z+vLNG3ma(~_h2Of5<*%$(GRr-dVbXo>! z=WjITDOi|l4o zygArFQn&dC7iTYm|F{&SCr&ErjH78*r)MtSYLE%NDitc3ch%V8pr|HG*rB7(z>cS2&885_&X$vJ~cS&Wjtg(s&R{%F7^?$0bDu$J0wIPozv_>W46%mQjDybFF zE?)+7VltCBH9`%Lg|mx~AZEuq5-N{4BqP2+S3|D3FOOFeo!Sn$07c40LXGU8=RT(t z;?0DT@3SPTs3)fiW$}KUwAU8nB!8W{9Vbq{jGIyPsK_=c3YH*{<+%!U5=X5Bm-X8i zL9A5}{w+>_fy?G9xg&gw}JwXzfzuxeGLOnb&W zL&jBs!Q$hw5@c5}k+he4(oWtuc}p8Upo_r-DM|OmPkOEEt%!shW)YdekXE)lNo^S9 zunC{p|IWs#_nBD#VoMXhgghkh%Az(&qJ^EObD&yVh1~OTK!pW7-~nI2+~zV!B+tsLi>4c0 z7hTk|kFlE7))hp+E;In6EaZ3t8x_fLm7z2wpnMZJq9GEo14XQ_eXHurnUZ$2!K7)3 zgXv)s3&g@GY?FnFm=IygZn&yPi?NJnOye3q5RbUTCrw0|Ed$H1k7! delta 1704 zcmV;Z23PsE5aADyNq=0KQXor}EJwmbIWy+UnkI456bQ1X&!0eph8zGRMu4M8krFtn zpnw6TM^!R4px|i$0!tk{NUCxv)Bq~AYQ5?;s!OC|w@OVq7D9xiM;kOXur{sRun(}7 zC7@NJ(7%8K3kDz(ND#P535Xc6bgx;FNA-He8enXI#a$C)c7K^x!2$+PH$y&}7VKHJ zTO~|5x)>^fx(~Ff#;aFpU!H?=>)w44M2O$Og99f~LU{0j#*+^(f!sLp=E|R+HojK* zZ{pOa3x^IIDR95M!;Am_D^e!H0VYnobZN6>`phcdvtOCMB+{Ix1DG#AvOfON`jxa6 zVg`+8;DI2Cw0~4W11#29WqCa|Kx7Ooz*k;nu{HvHE{QgPWpK5ISY#5yHK2%G>WGuh{|PDxnASR2o@hP5plY8Y6{M)6;#g`yr{ka37{$(%stMmz1hKJhm|Qw7`x5qc+N z1}2jGeYjP>k*0MlqKXbG;CYhDCohuV!Rs(b01~jNy$?0GBbNJ)Xs^GKN#&Kmsk$hV zTLF-al&6joRP0qA2Fv2ZFmDtwX}U&avA%*Lwtul@ubuUAY&DD9rc0^?P&87!ie{>$ zEeG3h%ur9{<#rK~dnR1;)*E!SJwrx7c4me!>z2zg2$$8#4NYs*Y!h~BdpFIe)5-+U zyK$sT;mu&AbngG%pL+k%4e&~jwaxa-NX;d&sDk2!SCL9BzVTFbJJm75Q!X^XroDpP z;(wx2l_s*`Q6o;`kCZjeSdUovKW(?uB}XC5$c-9Xr{o(Fc4@DqF)5xH9=yn$b#(pjhn>AFo&Q^fH9^-bq1Qlu}ucXS*=!E^%ix;{wzerM)T-0*H%du^)BK9Pc!?=I{*sHsq?5lIQ=9H7Qy|Rj9iKKD@r4|IAt;wjAvvT;K8w^#d92!9P5148j`i;EyyDw z>m*gpTm|)oxtdiSSBfWXk@H4-#1K^RGCiOL^`867OKXZY7Ow8Je>f$o8;$x^r7$z8 z(8DKF542BpVGENDUEL(*8h=nug3DfW{am+DbJTHR=dS(hn_Aa89*aV%CWl?!No_Kg zz%g-^G2tC5$%+@n!OwM6A}oSN7J;W8X=8fnX#{9<6_S}OsaS2@1Lm?RGM=$WW62s_ zPGii<|5>G~$aA1NIcD0?zDTp19RRP$(i+fWWvde)Edh#lG}L+#gMT3mK-SC%+pX*+ zb~KetOs)D=&r+4S$^9*G@svr1GSsedZ7X^as$Nc-H=z<;>UeV#k^0*AzWB{=e&@^I z{`&X701mK#2Tb4s8~DHoPOyR(%-{w)_`wj4u!JW};R;*$!Who5hBwUN4tw~+AP%vJ yM@-@poA|^iPO*wt%n;%hyZFU0jymqHxcm8{pZXw#})>-8nuls@0eed>0u z!@73!CNvunZ$!Qa0q+%C(XZaah!ZPbY}YX3$B->Lj!YQ<*o&7%W)_Ta@>)u_mbf*&>L;Di)bXyJtzW|LY0z5!a383I-Yud4w806R3> BgLVJ_ delta 259 zcmV+e0sQ{;1pNe%cz;pG460bOYTfEk$Plhz!-^d%v}oC+5r>jp%eJlCw{XY4j2m$- z-MdWf;$^6Juivv3`$ANkknlpo69ohQ%eb-Q$B?xuj!e07N}rZ97exBg>`2Z65ht8H z5vgd+s8g$6&APSg*RaQ`J>3wrMcT1*>)y?~x9{J;gO^?kz+*N~;u1|GKdfB1^XJf` zOP@}iu5z>laWgkf^1Aln*sF{GA5Xr#`Sa)tH?M3w^!nn33) and (tile<40) end, + isRope = function(x, y) + local tile = map.tile(x, y) + return (tile==40) or (tile==41) + end, + } \ No newline at end of file diff --git a/data/tiles01.gif b/data/tiles01.gif index 2493eb500e15703066e770aff5aedd2a09cb0c06..2353d427866eb5ca65decdb76c2ec82025f3f948 100644 GIT binary patch delta 1021 zcmVXu!EM=f!}9A;xrg^yAa0Nr#T68M6?} zo;@?pIrL^Z(;022-o5+510lYHO9m4B_XA9qF=yT!`?Eo9K_BTpc-u7Z>(5skyW9xD z>*mg%PbY0#v3Tp)(;s5MzC8p6nt(HS-=2Z*Lio?R|OQeS4Gx#pz=wE1S40tmoB0}o)TS(|RwX(yfoG$~S&hAdOk zt16^2WtDusDvFg{)(Y#NdwOt*5WQwnX_}%Isc9p_+E;(9Wyg9ICZm5k^5wJAYDrPF zemV;5p}q9#$gs>yJRCvTHEmdqWWs^E2w^2Z=sFM?xgK879J*QzXn7cg1>(KP^SdrkIZV#jTvK{C{Bcip=&ay9@} z?ed2qYX1$y+TgtHnA~D77Q^C_uY0Izx(kKL^ApAr4Qcw^9DsPz5nL6M<9d+@ma7v_t|^DHTbHCKX&WoH-i58 zr~iK~_$GlD0zW45lMVeKCxjmC;D9|)Uh@JMxFE3Ze}@QQXMU#@xJ+(;m>?VkBPhYS zk*^WS3&Mkf01LmduXn!NUTi zOrsjt$i_Ch@r`hdqa5c*$2!{aj(E(Y9{0${KKk*GfDEJ{2T9068uE~cOr#%H*~ delta 733 zcmV<30wVpf4U-G7!vcTDkRw9|EDSNG!Hmdl(`wCB^PQ!~~U^pWX< zqcf|XO@71>-WumA%@vGm+lV8r=cetkF%VjH{o?08dOPHIK z`Bmr$f;9F;p?wtDcwloeRu|roC9-FtiS0piqW?^y6uI7fKNLr>!p2;1cn|$t{8xFpvH*DFC8Uis7cHrn;C6thUOk zW{i9aKvlc^VTh=<0x>E$r>5#Fri;ZO?6AVZ3e0tm)M|f71k5sf>mZf>DlKC%98ztg zvo70g1d%AaZL_*U+pDy`I(97(=R$Vux6R5bh^_2$J8HD#s%j9i#2TAOyb-udDiHDN zIw`&NZn~ zx7&s*E`LIk{M)QTFud?8{{HJMxIkl_^~_ttBE-{BOC9#R+>UKEuV$Y;bji;F+;z8) zlKL_sO3TdX;Di@$_~D2ruK41NH}3f3kVh{0^?ythes^>#)Zz`|PyWZu{-H=dSziy!Y<=@4yEy{P4sVZ~XDdC$IeS%s21+ P^Uy~x{q)pN9tZ$CzR!P2