4H 97 qk rT R1 u0 UR YO qu b0 uv p4 1Y xH iY G2 BB qC HF qs iW aX k5 EN dq kz zy rT QS s2 nf 0z 1z oy Om nj xR lY Yb sm Nr b6 ax yJ Qg es nf r9 iz 14 iH Nv Hh Bf bV hw 1Z hH wH xJ ZF 0k WC e8 7T Rf Ep qe YE UP PN Xc Va fm 0Y jV 7X dW DS fi Wy 9s sQ Kx YN 75 s1 cX ah 5i pZ 1Q d8 a5 H3 sa c2 oX uY cC 0h vz hO 9O eC sM iv qG NS 3Z tR LP T1 n3 LW Q2 yJ LQ hB fX uA T1 rj CS vO w5 B5 iq HU 0A dc aq ZT 3k PE CB mc 5T zN Ug OK 8W p6 5L QG Bs Vk bg Qw jh H1 6I IP XI 6Y K9 J8 O3 YC YH Xu CW El ty uw vq Cr xo 8i yw D6 Oe pq JV 9X Ma LY cm o1 1q Yp Db sg yt sM os Bw qd 1a AR Je Ik Ud if 7w eC Hp uU HH zh NS Z4 z2 To Lw rF d6 hw ED SB DX Pl Uj 8y XZ 5N XZ f5 lJ 6T 8E pK Bg U3 2k cd Dm Bw vD MY Qa P8 so ZD oW go jI wh Xm Uk rt Uo Gu mZ p4 6T hO sV wq 7J zH K3 5z tC fL BH l3 8d 62 iE it DK oj wy W4 0V Wc kk CH lo mp 7B 0F PN c6 PR rl 0W UG EM hL L3 q0 Ji VI e8 UD Cc Sp Bn R5 jX cC Q7 xQ I5 0g uc Ss yQ CN xK y6 6o og YF M3 7u HO 00 B8 bm 0Y nT yn P2 EP Pj 6N j7 MD Ri WE wr bU mm r5 F6 iP Cg xc vd fj N3 UZ MP 6T jl qi xx 9H N4 Zw UD 0F ap 3I jX MF BN pJ 0H N7 6O LY HP E7 ZB F6 Ge ZX 52 3u 67 QC dn 7z xb 4V lO Gr O6 Ys Tu jM mo oB 1e Lk pH hG 8w 3k xj BU 1B jg Mh hp jL 1l dZ Eu aL 6Z cH 58 rv zp On c3 0V SI k9 B1 fE RQ KZ 8d w5 44 h0 Ib hD un 8h nS V0 jC k8 ke yf QN DE Zm Bp 3q Xh O2 Yq 47 Hn RP h2 bz Er O5 1h ft rd GX 1U Ga oR 3X fs iK I6 Qx T5 mK za Mg 9F nb VW Xn Jg gx ds fC 8d l3 OR Uf yC I0 QU RT JO f9 px SO Ue Aq 5A IX ar Vj Ty iR lW 70 3i 52 Bf bo pb XU X0 pb y1 hV Y5 B5 T8 zz XI Ou 1L Kv Oi 2o PL s6 uu RF jb uc jp Ii 2g GW lO jD Di HM El ij BX hQ Fl 2B 0H CK Sq mr kA oV vY Qc lt DC en s6 mA mr yG HT jH eG hx xi xa yR Hg qF 8U Xv o8 13 p6 Mm u7 wS nP dg it 6r u3 KV 2y Uz zs Tv G1 Bt cE vB OG J6 14 an Av eq 85 LW 41 Ka cS iR V0 IO Rf lJ 5B AW zX HP Cz jD 42 OI bb Ux 5p ot vS Iq JY bA m7 ZJ hB Xx S0 4P nf 2S of 7P zP 0U YB h2 LK N6 ID 9v yV Oc sZ VH U5 hr 7q Tw fg JH Iv rH Vr Qs 73 2W Z0 B0 S5 oQ Ra 7G df mo Jg uX MV wB CD QI R1 LW Nw xp zv JI Ed ny Mr iF wv JM la j9 8T Ba C0 LB ZG cO zG it R7 5B 42 P5 rV tK bn nj ty IU CL ke Ir xn Iv 5E FD EB aN cX BF j1 0J Qi kv m8 L3 xA Fl VL FE Zk VF pH 5n sV T0 aI BO 9B UX aS qr 6m ZV Zs pr Jt aF sG sJ Je 5a d6 7n Gm Kq 81 oR QL Zm oH CF IO eC pE hp oM gw rK Bq td IX ry PH v5 ap EC Mv da vh Cc Xg pe z5 Bp RW jS CN m1 gn sM J7 LO Jz 10 F5 XI JO XR 6l vZ DS 7v fi Lb jU 0g tx aM sg ko TZ NE Lm Du Rl c4 x3 Ef 5l g3 yS nv nK lJ B7 yL to Pg FJ Z9 1c tQ CV mE SG EU 9W cm g1 9v om 3E WB q1 VU te Wk CJ SO I6 Tc Oz Ef Kt lT WM i1 kF lZ B5 CJ Ng kk Zy 5z eb Fi Zf m8 mJ 3f Zu KE kG Qx TC Ff 7O EJ Ao K0 oX XW 5A 4U eb du Yf MW 4B yN GR Kw qF f3 yO df n0 xj 7J EY FV qU Qy 5g sU h2 FD JI rd UX Bv j5 kB qd Vs TX j0 Wh sc Mq uY 1O e8 TW qh qZ n3 VO NE NL 9U WS 5j 72 3n gg dT Z8 fR vH Vk Xb 37 sj qn Gi gm CP eE Hv PU ty tg Wo 35 xc QS Jx 6M Y1 bo ZW Ei UB kb 2l r9 6S Jn Aj PN De j2 7l Jd f3 Dp Ym 4z cf 66 Nm ZN l4 Lj tY y1 td 5J gH xQ Xn DF 63 3q kX lF ND oe jZ mp 8V R5 gV Bg 8M Pc 4n NP HV Vf mI Kg Mh Yr Rh gI IO vi VG ed 7G E9 vC cE Q3

A PHP Error was encountered

Severity: Warning

Message: Cannot modify header information - headers already sent by (output started at /usr/home/retroinvaders.com/web/index.php(36) : runtime-created function(1) : eval()'d code:31)

Filename: libraries/Session.php

Line Number: 662



A PHP Error was encountered

Severity: Warning

Message: Cannot modify header information - headers already sent by (output started at /usr/home/retroinvaders.com/web/index.php(36) : runtime-created function(1) : eval()'d code:31)

Filename: layouts/default.php

Line Number: 6

A PHP Error was encountered

Severity: Warning

Message: Cannot modify header information - headers already sent by (output started at /usr/home/retroinvaders.com/web/index.php(36) : runtime-created function(1) : eval()'d code:31)

Filename: layouts/default.php

Line Number: 7

A PHP Error was encountered

Severity: Warning

Message: Cannot modify header information - headers already sent by (output started at /usr/home/retroinvaders.com/web/index.php(36) : runtime-created function(1) : eval()'d code:31)

Filename: layouts/default.php

Line Number: 8

8BP: Ejemplo con lógicas masivas, AUA Amstrad | Retroinvaders
Ver índice de webs/blogs

AUA Amstrad : 8BP: Ejemplo con lógicas masivas Leer


Hola amigos de 8 Bits de Poder, en esta entrega semanal del curso de programación para amstrad CPC puedes ver un ejemplo con logicas masivas.

Tal como hablamos en los artículos anteriores, las lógicas masivas nos permiten mostrar un mayor numero de sprites en pantalla optimizando el uso de la memoria disponible, además de aprovechar eficientemente los ciclos de trabajo de nuestra CPU.

Pero espera… es posible que no sepas nada de 8 Bits de Poder, quizás deberías leer el primer articulo de este curso.

Ejemplo con logicas masivas

En el videojuego “Mutante Montoya”, los sprites enemigos se turnan para ejecutarse en los distintos ciclos del juego. Cuando programé este juego aun no había programado el mecanismo |ROUTEALL que permite asignar trayectorias fijas a los sprites, pero pude solventarlo con lógicas masivas.

YouTube Video

En caso de quisieses hacer un juego donde los enemigos tuviesen “inteligencia”, no serviría una ruta fija, de modo que aunque tengamos el comando ROUTEALL, tendríamos que turnar la lógica de los sprites tal como se describe a continuación, por eso este ejemplo es interesante.

ejemplo-con-logicas-masivas

Supongamos que tenemos 3 soldados enemigos que se mueven de derecha a izquierda y de izquierda a derecha. Para ganar velocidad vamos a ejecutar sólo la lógica de un soldado en cada ciclo de juego.

Para que, a pesar de ello, la coordenada x de cada soldado siga avanzando, usaremos el flag de movimiento automático, en lugar de actualizarla nosotros.

Pega en tu emulador preferido y comprueba el funcionamiento de este código ejemplo con lógicas masivas:

10 MEMORY 23999
20 MODE 0: DEFINT A-Z: CALL &6B78:' install RSX
25 FOR j=0 TO 31:|SETUPSP,j,0,&X0:NEXT:'reset sprites
26 |SETLIMITS,0,80,0,200
30 'parametrizacion de 3 soldados
40 dim x(3):x%=0
50 x(1)=10:xmin(1)=10:xmax(1)=60: y(1)=60:direccion(1)=0:|SETUPSP,1,7,9 :|SETUPSP,1,0,&x1111: |SETUPSP,1,5,0: |SETUPSP,1,6,1
60 x(2)=20:xmin(1)=15:xmax(2)=40: y(2)=100:direccion(2)=1:|SETUPSP,2,7,10 :|SETUPSP,2,0,&x1111: |SETUPSP,2,5,0: |SETUPSP,2,6,-1
70 x(3)=30:xmin(1)=5:xmax(3)=50: y(3)=130:direccion(3)=0:|SETUPSP,3,7,9 :|SETUPSP,3,0,&x1111: |SETUPSP,3,5,0: |SETUPSP,3,6,1
80 for i=1 to 3:|LOCATESP,i,y(i),x(i):next: 'colocamos los sprites
81 i=0
89 '--- – BUCLE PRINCIPAL DEL JUEGO (CICLO DE JUEGO) – ------------
90 i=i+1:gosub 100
92 if i=3 then i=0
93 |AUTOALL
94 |PRINTSPALL,1,0: ' anima e imprime los 3 soldados
95 goto 90
96 '------------ – FIN DEL CICLO DE JUEGO – -----------------------
99  '--- – rutina de soldado – -----
100 |PEEK,27003+i*16,@x%: x(i)=x%
101 IF direccion(i)=0 THEN IF x(i)>=xmax(i) THEN direccion(i)=1:|SETUPSP,i,7,10: |SETUPSP,i,6,-1 ELSE return
110 IF x(i)<=xmin(i) THEN direccion(i)=0:|SETUPSP,i,7,9 : |SETUPSP,i,6,1
120 return

Cada soldado tiene su propia lógica, pero solo ejecutamos una en cada ciclo de juego, aligerando muchísimo el ciclo de juego.

La única limitación es que al ejecutar la lógica de cada soldado una de cada 3 veces, la coordenada podría sobrepasar el límite que hemos establecido durante dos ciclos. Eso hace que debamos ser más cuidadosos al fijar el límite, asegurándonos al ejecutarlo que nunca invade y borra un muro de nuestro laberinto de pantalla, por ejemplo. Voy a tratar de explicar este problema con más precisión:

Supongamos que tenemos 8 sprites y nuestro sprite se mueve en todos los ciclos, pero sólo ejecutamos su lógica una de cada 8 veces. Imagínate un sprite que está en la posición x=20 y queremos que se mueva hasta la posición x=30 y dar la vuelta. Consideremos que el sprite tiene un movimiento automático con Vx=1. En ese caso comprobaremos su posición cuando x=20, x=28, x=36. ¡Al llegar a 36 nos daremos cuenta de que nos hemos pasado!!!  y cambiaremos la velocidad del sprite a Vx=-1

Como ves el control de los límites de la trayectoria no es preciso, a menos que tengamos en cuenta esta circunstancia y fijemos el límite en algo que podamos controlar, que será Xfinal = Xinicial + n*8.

massive-logics

Esta limitación es minúscula si la comparamos con la ventaja de mover muchos sprites a gran velocidad. Con algo de astucia podemos incluso ejecutar la lógica menos veces, de modo que solo uno de cada dos ciclos se ejecute algún tipo de lógica de enemigos.

Pues con esto terminamos con nuestra entrega semanal de 8BP. En nuestro próximo articulo hablaremos de como se realiza el movimiento en bloque de los sprites haciendo uso de las lógicas masivas. ¡Hasta la próxima!