Commodore 64 > Aiuto & Domande
collisioni sprite/sprite
input:
buonasera ragazzi, ho quasi finito di creare un gioco in basic stile pac man, ma mi sono arenato sulle collisioni: so che per abilitare sprite/sprite la lecazione e pokev+30 mentre sprite/sfondo è pokev+31 .
in poche parole, con pokev+30 abilito la collisione dello sprite 0 e con peekl(v+30) ne leggo il suo contenuto , e dopo le faccio fare le azione a mio piacimento tramite delle condizioni.
Il mio problema è , perche quando creo con lo sprite 0 (valore 1) una collissione con lo sprite 2 (valore 4) , totale valore 5 , lo sprite 0 continuare ad attraversarlo senza fermarsi. invece vorrei che quando si verifica la collisione, lo sprite rimanesse fermonella stessa posizione prima della collisione , come se avesse un muro davanti. ma questo non succede, non capisco dove sto sbagliando.
questo è un piccolo listato di esempio grazie
2 x=100 : Y=139 : XX=80: YY=100:t=0 :REM Coordinate posizione iniziale sprite 0 e 2
3 poke650,128 :REM ripetizione automatica dei tasti
5 print chr$(147) :REM cancella lo schescrmo
10 V=53248 :REM inizio registro video
11 POKEV+21,5 :REM abilita lo sprite 0 e 2
12 poke2040,192: poke2042,193: REM Variabile inizio puntatore forma dal 192 e 193 blocco
13 FOR N =12288 to 12350 :READQ: POKEN, Q: NEXT :REM legge dati sprite 0
15 FOR N =12416 to 12478 :READQ: POKEN, Q: NEXT :REM legge dati sprite 2
17 print chr$(147)
19 pokev+30,0 :REM abilita collisione sprite 0
40 POKEV+0,x :REM coordinate x sprite 0
42 POKEV+1,y :REM coordinate Y sprite 0
44 POKEV+4,xx :REM coordinate Y sprite 2
46 POKEV+5,yy :REM coordinate Y sprite 2
47 REM PUNTEGGIO
48 print "{home}",t
59 REM CONTROLLO MOVIMENTO
69 geta$: ifa$=" " then 69
70 if a$=chr$(157) then x=x-5 :REM SINISTRA(5 = velocita di spostamento)
80 if a$=CHR$(29 ) then x=x+5 :REM DESTA IDEM
86 if a$=chr$(17) then y=y+5 :REM GIU IDEM
95 if a$=CHR$(145) then y=Y-5 :REM SU IDEM
150 REM conserva il valore letto in B
155 B=peek(v+30)
158 REM B assume il valore di 5 se collidono gli sprite 0 e 2
159 REM (sprite 0=1, sprite 2=4)tot=5
160 if peek (v+30) = 5 then gosub 200
165 goto 40
200 print "collisione{home}"
250 REM POSIZIONI DEI DUE SPRITE PRIMA DELLA COLLISIONE
270 x=x-5
280 x=x-5
286 y=y-5
295 y=Y-5
296 REM PUNTEGGIO
297 t=t+1
310 return
0scur0:
Un paio di osservazioni che spero possano servire
1) Non serve "abilitare le collisioni", queste vengono già rilevate a livello hardware dal registro 53278.
2) Leggere da quel registro ne azzera il contenuto, quindi la seconda PEEK non ha senso.
input:
si hai ragione non si finisce mai di imparare , infatti gia la variabile B mi rileva il valore dello scontro tra lo sprite 0 e 2 .
ho eliminato la linea ( 160 if peek (v+30) = 5 then gosub 200,) come mi hai consigliato , il programma gira lo stesso , pertanto dovro utilizzare come condizione la variabile B , sostituindo la linea 160 con questo nuovo codice
160 if B=5 then gosub 200
comunque mi rimane il problema per quello che riguardo lo scontro tra sprite/sprite , non riesco a collocare le coordinate , per fare in modo che quando si verifica una collissione con un altro o con lo sfondo , questo si fermi dinanzi all ostacolo.
puo darmi qualche altro consiglio per favore grazie
0scur0:
--- Citazione da: input - 08 Maggio 2021, 16:05:43 ---mane il problema per quello che riguardo lo scontro tra sprite/sprite , non riesco a collocare le coordinate , per fare in modo che quando si verifica una collissione con un altro o con lo sfondo , questo si fermi dinanzi all ostacolo.
puo darmi qualche altro consiglio per favore grazie
--- Termina citazione ---
Non so come tu abbia definito gli sprites ma secondo me c'è qualcosa che non va nella subroutine alla riga 200. Se vuoi simulare uno scontro come minimo ti serve conoscere la direzione dell'ultimo spostamento, in modo da ripristinare le coordinate dello sprite prima dell'impatto.
input:
ho modificato la la ruotina 200, che avrebbe il compito di ristituire alle coordinate x e y lo stesso valore che aveva prima della collisione , come giustamente mi hai fatto osservare, pero lo sprite 0 ( che è quello che muovo con i tasti) attraversa l altro sprite (sprite 2) anche dopo la collisione e non si ferma
162 if B=5 then gosub 200
165 goto 40
200 print "collisione{home}"
250 REM POSIZIONI DELLO SPRITE 0 PRIMA DELLA COLLISIONE
280 x=x
281 y=y
297 t=t+1 :rem mi rileva se ce una collisione o meno, è un test
300 return
Navigazione
[0] Indice dei post
Vai alla versione completa