Autore Topic: collisioni sprite/sprite  (Letto 8798 volte)

input

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: arkanoid
collisioni sprite/sprite
« il: 06 Maggio 2021, 21:52:42 »
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

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: -
Re:collisioni sprite/sprite
« Risposta #1 il: 08 Maggio 2021, 02:00:22 »
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

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: arkanoid
Re:collisioni sprite/sprite
« Risposta #2 il: 08 Maggio 2021, 16:05:43 »
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

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: -
Re:collisioni sprite/sprite
« Risposta #3 il: 08 Maggio 2021, 18:12:04 »
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
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

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: arkanoid
Re:collisioni sprite/sprite
« Risposta #4 il: 09 Maggio 2021, 10:33:47 »
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



 

eregil

  • Administrator
  • Utente
  • *****
  • Post: 710
  • Gioco Preferito: Impossible Mission
Re:collisioni sprite/sprite
« Risposta #5 il: 09 Maggio 2021, 10:56:16 »
280 x=x
281 y=y

Questi sono no-op, devi salvare il valore di prima della modifica.
Non rispondo a richieste private, di qualunque genere esse siano.
Per domande tecniche leggete le FAQ e usate l'apposito forum.
Per questioni amministrative contattate lo staff tramite il form Contatti sul sito.

input

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: arkanoid
Re:collisioni sprite/sprite
« Risposta #6 il: 09 Maggio 2021, 12:24:34 »
l ho avevo provato anche questo, ma non va,  ho memorizzato le variabili x e y prima della collisione in spx ed spy . e poi li ho richiamate con la sobrutina ma non va, qualcosa mi sfugge
questo e la porzione di codice che avevo provato prima ..  avevo  provato anche un altra  opzione simile a questa , ma funziona  perfettamente soltanto in un verso, delle quattro direzioni.
 c'e qualcosa che mi sfugge che non riesco a capire cosa, comunque grazie del consiglio

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
49  spx=x              :REM posizione  x prima della collisione
50  spy=y              :REM posizione  y prima della collisione 

53 REM PUNTEGGIO
54 print "{home}",t,b      Rem per un test collisione e punteggio
55 B=peek(v+30)

59 REM CONTROLLO MOVIMENTO
69  geta$: ifa$=" " then  69
71  if a$=chr$(157) then x=x-5 :REM SINISTRA
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 
157 print x
162 if B=5 then gosub 200 :REM

165  goto 40

200 print "collisione{home}"
250 REM POSIZIONI DELLO SPRITE 0  PRIMA DELLA COLLISIONE
280 x=spx
281 y=spy
 
297  t=t+1 
300 return

0scur0

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: -
Re:collisioni sprite/sprite
« Risposta #7 il: 09 Maggio 2021, 12:55:51 »
c'e qualcosa che mi sfugge che non riesco a capire cosa, comunque grazie del consiglio
Ok, un altro suggerimento da vecchio. :maximo:

Prendi un foglio di carta e prova ad eseguire il programma passo-passo come se tu fossi la CPU, scrivendo lo stato iniziale delle variabili e dei registri e come questo cambia dopo ogni istruzione.
Lo so, è noioso e faticoso ma per programmini così semplici si può fare ed è il miglior metodo che io conosca per imparare a pensare algoritmicamente.

Buon lavoro!

P.S.: si chiama "subroutine", né "sobrutina" né "ruotina".

eregil

  • Administrator
  • Utente
  • *****
  • Post: 710
  • Gioco Preferito: Impossible Mission
Re:collisioni sprite/sprite
« Risposta #8 il: 09 Maggio 2021, 14:51:57 »
49  spx=x              :REM posizione  x prima della collisione
50  spy=y              :REM posizione  y prima della collisione 

Ricorda che per il C64 le variabili si distinguono solo in base ai primi due caratteri: spx e spy sono entrambe la stessa variabile (la variabile sp). Queste due righe in quest'ordine hanno dunque l'effetto di sp=y.
Non rispondo a richieste private, di qualunque genere esse siano.
Per domande tecniche leggete le FAQ e usate l'apposito forum.
Per questioni amministrative contattate lo staff tramite il form Contatti sul sito.

input

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: arkanoid
Re:collisioni sprite/sprite
« Risposta #9 il: 09 Maggio 2021, 16:27:35 »
l avevo letto neanche una settimana fa,  nonostante lo sapessi,
 non ci sarei mai arrivato, perche devo fare molta pratica ed esperienza ancora.
comunque adesso gli sprite si attaccano  correttamente, ma non si spostano piu, sono come incollati, gia e qualcosa .
adesso povero a trovare la soluzione per poterli spostare . Di nuovo grazie a voi che mi sostenete

0scur0

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: -
Re:collisioni sprite/sprite
« Risposta #10 il: 10 Maggio 2021, 15:18:44 »
comunque adesso gli sprite si attaccano  correttamente, ma non si spostano piu, sono come incollati
Attenzione: il registro 53278 viene aggiornato solo quando viene rilevata una collisione, cioè nel momento in cui gli sprites devono essere ridisegnati sullo schermo. In generale, questo avviene un certo intervallo di tempo dopo che ne viene aggiornata la posizione (che corrisponde, nel peggiore dei casi, a circa la durata di un intero quadro video, cioè 1/50 di secondo).
Occorre quindi essere sicuri che il contenuto del registro sia consistente con le nuove coordinate memorizzate (una soluzione semplice può essere introdurre un'attesa di almeno 1/50 di secondo tra la scrittura delle nuove coordinate e la lettura del registro).

input

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: arkanoid
Re:collisioni sprite/sprite
« Risposta #11 il: 10 Maggio 2021, 16:23:16 »
da ieri che ci sto provando, dopo i vostri consigli utilissimi, ho pensato ,  essendo il basic molto
lento ad eseguire tutte queste operazioni , pertanto non riesce a finire di svuotare il baffer del registro 53278  ( leggerne il contenuto per azzerarlo) che subito gia riscontra nuovamente un ulteriotre collissione e pertanto non ha il tempo materiiale di leggere il suo contenuto è  distaccarsi , quindi  rimane sempre attaccato.
ora con questa nuova e importante  info che gentilmente mi hai  inviato,  spero di poter risolvere il problema grazie :)

input

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: arkanoid
Re:collisioni sprite/sprite
« Risposta #12 il: 10 Maggio 2021, 23:47:33 »
ho provato ad inserire un ritardo un po piu alto di 1/50 s , con un ciclo for m= 1 to 50, il tempo che impiega lo schermo a ridisegnare tutto lo schermo.  pensavo che sarebbe  stato sufficiente. ma no va lo stesso,  ho provato vari valori  piu  e piu bassi ma senza alcun risultato. il ciclo lo inserito , subito dopo la scrittuira della nuova coordinata e prima   della lettura della locazione 53728, ma il risultato rimane invariato.
avevo provato con il joystick, ma rimane lo stesso problema , si muove in tutte le direzione, appena avviene lo scontro, si incolla e non si stacca piu.
 questo è uno stralcio. questo è uno stralcio di listato della parte  interessata del listato, dove sicuramente si annida il problema che non riesco ancora a  risolvere

17  print chr$(147)                     
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

49  px=x              :REM posizione  x prima della collisione
50  py=y              :REM posizione  y prima della collisione

53 REM PUNTEGGIO
54 print "{home}",t,b

   
56  B=peek(v+30): REM lettura del rgistro 53278

59 REM CONTROLLO MOVIMENTO
69  geta$: ifa$=" " then  69
71  if a$=chr$(157) then x=x-5 :REM SINISTRA
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
157 print x
162 if B=5 then gosub 200 

164  form = 1 to 5 :nextm   :REM  ritardo
165  goto 40

200 print "collisione{home}"
250 REM POSIZIONI DELLO SPRITE 0  PRIMA DELLA COLLISIONE
260 REM  SCRITTURA NUOVE COORDINATE
280 x=px
281 y=py
282
297  t=t+1
300 return

0scur0

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: -
Re:collisioni sprite/sprite
« Risposta #13 il: 11 Maggio 2021, 00:40:09 »
Codice: [Seleziona]
200 print "collisione{home}"
250 REM POSIZIONI DELLO SPRITE 0  PRIMA DELLA COLLISIONE
260 REM  SCRITTURA NUOVE COORDINATE
280 x=px
281 y=py

Qui non stai scrivendo le nuove coordinate nei registri, stai semplicemente aggiornando delle variabili interne.

Citazione
ho provato ad inserire un ritardo un po piu alto di 1/50 s , con un ciclo for m= 1 to 50, il tempo che impiega lo schermo a ridisegnare tutto lo schermo.

Come fai ad esserne sicuro? Cerca qualcosa di più affidabile, ad esempio l'orologio di sistema (TI$).
Ribadisco l'utilità di prendere carta e penna.

Saluti

input

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: arkanoid
Re:collisioni sprite/sprite
« Risposta #14 il: 11 Maggio 2021, 16:48:33 »
credo che dovcra fare proprio cosi,  magari creando prima un diagramma di flusso e seguirlo psso passo