Autore Topic: Effetto "3d"  (Letto 1646 volte)

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Effetto "3d"
« il: 05 Ottobre 2004, 23:26:36 »
 Ciao!

Ecco un'altra routine in puro BASIC. Stavolta, ho realizzato uno "scrolling prospettico" (una sorta di effetto 3D). Ecco il codice (usare il programma per MSDOS bastext - lo trovate anche nel sito di iAN CooG, versione ottimizzata - per convertire da txt a prg):

Codice: [Seleziona]

start tok64 land3d.prg
0 POKE 53265,PEEK(53265)AND239
1 POKE 53280,0:POKE 53281,0
5 d1=1:l1=8:d2=2:l2=16:d3=3:l3=24:s2=8:s3=24
6 f=30:g=28:p=255
7 GOSUB 1200
10 PRINT"{cyan}{@*40}";
12 PRINT"{a*40}";
14 PRINT"{b*40}";:GOSUB1000
15 FORt=12288TO12288+(32*8):POKEt,255:NEXT:FORt=14336TO14336+(32*8)
16 POKEt,255:NEXT:FORt=12288+(32*8)TO12288+(32*8)+7:POKEt,0:NEXT
17 FORt=14336+(32*8)TO14336+(32*8)+7:POKEt,0:NEXT:POKE 53265,PEEK(53265)OR16
20 i=12288:j=14337
22 q=53272
24 z=j+s3:w=j+s2
26 y=i+s3:h=i+s2:c=l1:l=l2:n=l3
30 POKEi,0:POKEq,28:POKEj,0
31 POKEq,f:POKEi+e,p:e=e+1
32 POKEi+e,0:POKEq,f:POKEh+u,p:u=u+2
33 POKEh+u,0:POKEy+a,p:a=a+3:IFe=8THENe=0:a=0:u=0
35 POKEy+a,0:POKEq,g:POKEj+v,p:v=v+1
36 POKEj+v,0:POKEw+b,p:b=b+2
37 POKEw+b,0:POKEz+d,p:d=d+3:IFv=8THENv=0:d=0:b=0
38 POKEz+d,0:GOTO31
999 END
1000 PRINT"{c*40}";
1002 PRINT"{d*40}";
1004 PRINT"{e*40}";
1006 RETURN
1200 REM * stars *
1202 PRINT"{clear}"
1204 PRINT"{white}.{space*7}.{space*13}.{space*8}.{space*5}.{down}"
1206 PRINT"{space*3}.{space*11}.{space*10}.{space*7}. . {down}"
1208 PRINT" .{space*6}.{space*9}.{space*4}.{space*8}.{space*2}.{down}"
1210 PRINT"{space*3}.{space*8}.{space*7}.{space*6}.{space*5}.{space*2}{down}"
1212 PRINT" .{space*6}.{space*6}.{space*8}.{space*3}. .{space*4}.{down}"
1214 PRINT"{space*2}.{space*5}.{space*3}.{space*7}.{space*6}.{space*5}.{space*2}{down}"
1220 FORt=12288+(46*8)TO12288+(46*8)+6:POKEt,0:NEXT:POKE12663,96
1230 FORt=14336+(46*8)TO14336+(46*8)+6:POKEt,0:NEXT:POKE14711,64
1250 RETURN
stop tok64
(bastext 1.03)

L'idea base sta nel traslare delle linee orizzontali dal basso verso l'alto. La distanza fra ciascuna linea è differente. Ad esempio, la distanza fra la linea 1 e la linea 2 è di 8 punti. La distanza fra la linea 2 e la linea 3 è di 16 punti. La distanza fra la linea 3 e l'estremità inferiore del paesaggio (riferendomi alla posizione iniziale) è di 24 punti. Non a caso vengono stampate in tutto sei file di caratteri programmabili.

Abbiamo quindi tre zone: una che si estende per 8 punti = 1 carattere, una per 16 punti = 2 caratteri e una per 24 punti = 3 caratteri (così si deduce che 1+2+3=6... non sono da prendere alla NASA?).

Ciascuna linea viene traslata nella propria zona dall'alto verso il basso, per poi riposizionarsi in alto e ripetere il movimento. Tutte e tre le linee percorrono le rispettive zone nello stesso tempo, quindi la velocità di traslazione della seconda linea è doppia della prima e la velocità della terza linea è tripla della prima. Infatti, la linea 1 viene spostata di 1 punto alla volta, la linea 2 di 2 punti alla volta e la linea 3 di 3.

L'idea di fondo è ridefinire al volo i caratteri, in modo da poter modificare molti punti nello schermo in una velocità apparente quasi da linguaggio macchina (basta far faticare il VIC-II!). Come noterete il movimento è pressoché perfettamente stabile (niente sfarfallii): ciò è stato ottenuto con un double-buffering (ho usato due set di caratteri programmabili che vengono alternati in continuazione). In questo modo non si ha il lampeggio nell'aggiornamento dell'immagine. Grazie a questo double-buffering, ho anche potuto far brillare le stelle, alternando rapidamente due definizioni del carattere "stella".

Questa routine dimostra la potenza del circuito VIC-II: lavorare in BASIC significa avere una potenza computazionale centinaia e centinaia di volte inferiore a quella di cui si dispone in linguaggio macchina e se non si è in presenza di un buon coprocessore grafico... o linguaggio macchina o niente, per routine del genere.

Il codice costituisce la versione "unrolled" di una mia routine di prototipo comprendente delle subroutine (uso di GOSUB); inoltre alcune variabili sono state rinominate in modo da avere nel ciclo principale i nomi più corti possibili, con un teorico aumento della velocità di esecuzione (di qui il perché di assegnazioni tipo L = L2).
-=MarC=ellO=-

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Effetto "3d"
« Risposta #1 il: 07 Ottobre 2004, 14:57:16 »
 Versione ottimizzata (riduce drasticamente l'attesa per il set-up). Ho incluso anche dei grattacieli che compaiono all'orizzonte dopo qualche secondo di "viaggio" ;) .

Codice: [Seleziona]

start tok64 land3dg.prg
0 POKE 53265,PEEK(53265)AND239
1 POKE 53280,0:POKE 53281,0:GOSUB1400:i=12288:j=14337
5 d1=1:l1=8:d2=2:l2=16:d3=3:l3=24:s2=8:s3=24
6 f=30:g=28:p=255
7 GOSUB 1200:GOSUB1300
8 b1=12343:b2=12351:b3=12359
9 h1=14391:h2=14399:h3=14407
10 PRINT"{156}{@*40}";
12 PRINT"{a*40}";
14 PRINT"{b*40}";:GOSUB1000
16 FORt=i+256TOi+263:POKEt,0:NEXT
17 FORt=j+255TOj+262:POKEt,0:NEXT:POKE 53265,PEEK(53265)OR16
22 q=53272
24 z=j+s3:w=j+s2
26 y=i+s3:h=i+s2:c=l1:l=l2:n=l3
30 POKEi,0:POKEq,28:POKEj,0
31 POKEq,f:POKEi+e,p:e=e+1
32 POKEi+e,0:POKEq,f:POKEh+u,p:u=u+2
33 POKEh+u,0:POKEy+a,p:a=a+3:IFe=8THENe=0:a=0:u=0
35 POKEy+a,0:POKEq,g:POKEj+v,p:v=v+1
36 POKEj+v,0:POKEw+b,p:b=b+2
37 POKEw+b,0:POKEz+d,p:d=d+3:IFv=8THENv=0:d=0:b=0
38 POKEz+d,0:cg=cg+1:IFcg=120THENfl=1
40 IFfl=1THENGOSUB100:IFfr=1THEN50
45 GOTO 31
50 FORk1=1TO2000:NEXT
55 POKE 53272,20
60 PRINT"{clear}{white}spero che il mio piccolo demo in basic"
70 PRINT"vi sia piaciuto{.*3} ciao!"
72 PRINT"{down}marc=ello 2004{down*2}"
99 END
100 REM *** appaiono i grattacieli ***
102 IFg1<8THENr=INT(g1):POKEb1-r,255:POKEh1-r,255:g1=g1+0.5:RETURN
104 IFg2<8THENr=INT(g2):POKEb2-r,255:POKEh2-r,255:g2=g2+0.5:RETURN
106 IFg3<8THENr=INT(g3):POKEb3-r,255:POKEh3-r,255:g3=g3+0.5:RETURN
108 fr=1:RETURN
1000 PRINT"{c*40}";
1002 PRINT"{d*40}";
1004 PRINT"{e*40}";
1006 RETURN
1200 REM * stars *
1202 PRINT"{clear}"
1204 PRINT"{white}.{space*7}.{space*13}.{space*8}.{space*5}.{down}"
1206 PRINT"{space*3}.{space*11}.{space*10}.{space*7}. . {down}"
1208 PRINT" .{space*6}.{space*9}.{space*4}.{space*8}.{space*2}.{down}"
1210 PRINT"{space*3}.{space*8}.{space*7}.{space*6}.{space*5}.{space*2}{down}"
1212 PRINT" .{space*6}.{space*6}.{space*8}.{space*3}. .{space*4}.{down}"
1214 PRINT"{space*2}.{space*5}.{space*3}.{space*7}.{space*6}.{space*5}.{space*2}{down}"
1220 FORt=i+368TOi+374:POKEt,0:NEXT:POKE12663,96
1230 FORt=j+367TOj+373:POKEt,0:NEXT:POKE14711,64
1250 RETURN
1300 REM *** grattacieli ***
1305 PRINT "{gray}h {white}.{gray}{space*3}h{space*2}{white}.{gray}{space*5}h{space*2}{white}.{gray}{space*4}h {white}.{gray}h{space*4}{white}.{gray}{space*4}h h ";
1310 PRINT "gh{space*3}hgh h{space*4}hghh{space*4}hg{space*2}gh{space*4}h{space*2}hg g ";
1315 PRINT "fg{h*3}gfghg{h*4}gfgg{h*4}gfhhfg{h*4}ghhgfhfh";
1330 RETURN
1400 REM turbo char filling
1402 FORt=48TO56STEP8
1404 POKE 648,t
1406 PRINT"{home}{reverse on}{cm b*40}";
1408 PRINT"{reverse on}{cm b*8}{reverse off}{@*24}";
1420 NEXT
1430 POKE 648,4:RETURN
stop tok64
(bastext 1.03)

Ciao!
-=MarC=ellO=-

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Effetto "3d"
« Risposta #2 il: 09 Ottobre 2004, 17:00:41 »
 Ottimo lavoro. Come ti dissi in chat i cicli FOR e' meglio che abbiano dei valori fissi e non delle espressioni.
10 for I = 1 to 1000:next
piuttsoto che
10 for I = 1 to 1+999:next
altrimenti costringi il gia' lento basic a fare dei calcoli relativamente inutili ad ogni ciclo. Meglio ancora usando delle variabili, se non si vogliono fare i cacoli manualmente ;)
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

med

  • Utente
  • **
  • Post: 103
    • med64.tk
  • Gioco Preferito: Turrican 2
Effetto "3d"
« Risposta #3 il: 10 Ottobre 2004, 00:23:25 »
 a me il nuovo sorgente non funziona. tok64 mi da errore alla linea 10 colonna 15, ed anche se la elimino mi da successivo errore alla linea 12 colonna 10 e così via.

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Effetto "3d"
« Risposta #4 il: 10 Ottobre 2004, 01:02:24 »
Citazione da: "med"
a me il nuovo sorgente non funziona. tok64 mi da errore
Se posso usare un francesismo, tok64 fa cagare. :P
Usa bastext, trovi la mia fix sul mio sito.
bastext -o nome.txt per ottenere il prg (il nome in output e' quello nella riga "start tok64 land3dg.prg")
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Effetto "3d"
« Risposta #5 il: 17 Ottobre 2004, 16:14:06 »
 Ciao

Per chi ha problemi con i sorgenti ma vuole vedere questa routine, posso spedire su richiesta il .prg. ;)

 
-=MarC=ellO=-

ice00

  • Utente
  • **
  • Post: 469
    • http://digilander.iol.it/ice00
Effetto "3d"
« Risposta #6 il: 17 Ottobre 2004, 18:21:30 »
 Spedisci pure a me, grazie.
Non ho neppure provato la conversione in Linux, perchè il programma di conversione basic/token mi ricordo che lo avevo taroccato quando feci i rip dei programmi basic,  e non sono sicuro che funzioni ancora.

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Effetto "3d"
« Risposta #7 il: 17 Ottobre 2004, 19:28:32 »
 
Citazione
Spedisci pure a me, grazie.

Fatto ;)  
-=MarC=ellO=-