Rilevamento collisioni Sprite-Fondale

  Рет қаралды 464

agpxnet

agpxnet

6 ай бұрын

Un video che spiega come determinare la collisione tra gli sprite ed il fondale (versione italiana). #commodore64 #sprites #background #collision #detection
Se il video vi è piaciuto e volete vederne altri, per piacere mettete "mi piace", condividete ed iscrivetevi! Grazie!
Link al codice sorgente che implementa la formula: drive.google.com/file/d/1AK6G...
AGGIORNAMENTO:
Una versione che consuma 10 volte meno memoria RAM (spendendo 12 cicli in più):
drive.google.com/file/d/1ihqW...
Link al demo: drive.google.com/file/d/1r4s0...
English version: • Sprite-Background coll...
Voci generate via TTS dal sito: ttsfree.com/text-to-speech

Пікірлер: 7
@agpxnet
@agpxnet 6 ай бұрын
Aggiornamento: nella descrizione potete trovare una seconda versione dell'implementazione della formula, che richiede solo 50 bytes anziché 512, spendendo 12 cicli macchina in più. Dipende dalle circostanze: se vi serve avere le massime performance oppure risparmiare memoria. E a proposito di performance, si può anche evitare di sottrarre 24 e 50 nella formula e farlo invece direttamente nelle coordinate dei punti di contatto.
@andreal2023
@andreal2023 6 ай бұрын
Sei molto chiaro nelle spiegazioni e si vede quanto ti appassioni il lavorare bit per bit !!! Anche io sono appassionato di tutte quelle regole sul sistema binario (tipo lo shift di 3 bit che equivale alla divisione/moltiplicazione per 8). Una "chicca" appassionante per me è nella scomposizione in fattori primi. Sappiamo infatti che un numero è divisibile per 3 nel sistema decimale se la somma delle cifre dà un numero divisibile per 3. (ad esempio 33 è divisibile per 3 perché 3+3 fa 6 che è divisibile per 3). Ora 3 in binario è 11. Tornando nel sistema decimale sappiamo che un numero è divisibile per 11 decimale se la somma delle cifre pari meno quelle dispari da 0 oppure 11. Quindi un numero binario è divisibile per 3 binario se la somma delle cifre pari meno quelle dispari dà 0 o 11. 33 decimale in binario è 100001 ((1+0+0)-(0+0+1))=(1-1)=0 quindi 100001 è divisibile per 11 decimale (3 binario). Scriviamo un numero binario con coppie di 1 e 0. Ad esempio 11001100 sappiamo (...) che sarà divisibile per 3. Infatti si tratta del numero (128+64+8+4=204 che è 68x3, quindi in effetti divisibile per 3). Se ci pensi spostandosi da un sistema con una certa base ad un altro si possono scoprire una serie di regole interessanti ... Complimenti per il video e sono curioso di vedere la prossima puntata !
@giuseppeazzarello8426
@giuseppeazzarello8426 6 ай бұрын
buongiorno agpxnet finalmenteuna una spiegazione anche nei minimi particolari, video e spiegazione SUPER, oggi faro delle prove utilizzando le tue informazioni grazie
@carlosimetti2319
@carlosimetti2319 6 ай бұрын
Ottima spiegazione , complimenti per il video! Una curiosità a che età hai iniziato a mettere mano sull'assembly del 6510?
@agpxnet
@agpxnet 6 ай бұрын
Ciao, grazie. Intorno ai 10 anni, ma a 16 sono passato al PC. Ho ripreso il C64 nel 2020, 28 anni dopo.
@giuseppeazzarello8426
@giuseppeazzarello8426 5 ай бұрын
Ciao, ho provato a realizzare, quando da te egregiamente spiegato, per quando riguarda la collisione sprite/sfondo, utilizzando le coordinate, che apparentemente mi sembravano di aver capito tutto , e di facile applicazione , , ma sto avendo delle difficolta., non volevo disturbarti, ma la volonta di imparare e forte ed allora chiedo supporto. Al momento non sto usando xcbasic. In quando a causa di un prolema forse un virus al sistema operativo , ho dovuto formattare il pc , adesso pero ho difficolta ad installare xcbasic , ho instalato anche il tools for visual studio ma niente. Pertanto ho pensato di realizzare un piccolo programma in basic , per mettere in pratica le nuove procedure di programmazione viste nel tuo tutorial , cerco di realizzare il programma in basic, poiche è il modo migliore per imparare ed analizzazione il codice , e successivamente convertirlo in assembly o altro, sempre nei limiti della mia capacita. Pertanto , in base a quello che ho capito, ho cercato di realizzarlo , ma senza ottenere alcun risultato, apparentement sembra corretto, ma sicuramente ce del codice erraro. Applicando le formule da te descritte, le collisione non avvengono, o meglio una collisione avviene solo in quella frontale , lo sprite si ferma solo dopo aver attraversato completamente la parete (codice 165), ho visti e rivisto il codice e il tuo video, ma non riesco a venirne fuori . Pertanto chiedevo, un tuo supporto , per risolvere e capire dove sta l errore , naturalmente con spiegazione , grazie. 10 print chr$ (147) 20 poke 53280,7 :poke53281,1 :rem colore bordo/schermo 30 V=53248 :rem Inizializza area video Chip II 40 x=80: y=90 :rem Impostazione iniziale coordinata X e Y 50 poke 650,128 :rem ripetiz automativa tasti 60 POKE53287,5 :rem colora lo sprite 0 (5=verde) 70 pokev+21,1 :rem abilita sprite 0 (valore 1) 80 REM PUNTATORIA AREA DISEGNO SPRITE E CARICARICAMENTO 90 poke2040,192 100 for n=12288 to 12350: readq :poken,q: next 110 REM CARATTERI CON CUI COLLIDERE 120 PRINT "{home}{down*3} {cyan}{185}{185}{185}{185}{185}{185}{185}" 130 PRINT " {165}" 140 PRINT " {165}" 150 PRINT " {165}" 160 PRINT " {165}" 170 PRINT " {165}" 180 PRINT " {165} EEEEEEEEE" 190 PRINT " {165}" 200 PRINT " {165}" 210 PRINT " {165}" 220 PRINT " {165}" 230 PRINT " EEEEEEEEE" 240 REM COORDINATE POSIZIONE INIZIALI SPRITE 250 pokev+0,x :rem coordinata X dello sprite 0 260 pokev+1,y :rem coordinata Y dello sprite 0 270 xx=x:yy=y 280 REM GESTIONE TASTIERA 290 GETa$ 300 if a$=chr$( 29) then x=x+2 :rem con "r" sposta lo sprite a destra 310 if a$=chr$(157) then x=x-2 :rem con "l" sposta lo sprite a sinistra 320 if a$=chr$( 17) then y=y+2 :rem con "d" sposta lo sprite in giu 330 if a$=chr$(145) then y=y-2 :rem con "u" sposta lo sprite in su 340 REM SALTO 350 if a$=chr$(88) then s=4 :gosub 520 :rem con "x" SALTO DESTRA 360 if a$=chr$(90) then s=-4 :gosub 520 :rem con "z" SALTO SINISTRA 370 REM POSIZIONE CARATTERE 380 cx=int((x-24)/8) 390 cy=int((y-50)/8) 400 REM FORMULE COLLISIONE 430 q=peek(1024+cx+cy*40) 450 if (q=101) or(q=165) or (q=185) then x=xx and y=yy :goto 110 460 REM CONFINI 470 if x=255 then x=255 :rem limita il bordo destro 490 if y= 500 if y=>229 then y=229 :rem limita il bordo < 510 goto 110 520 REM SALTO DESTRA E SINISTRA 530 for H=-12 to 12 step2 550 x=x+s :rem > valore >distanza 560 y=y+H*.5 :rem > valore > altezza(.5),utilizzare valori
@agpxnet
@agpxnet 5 ай бұрын
Ciao, non ti preoccupare, sono felice di rispondere al tuo quesito. Nel video non sono stato probabilmente molto chiaro, ma la coordinata X e Y alla riga 380 e 390 non dev'essere quella dell'angolo in alto a sinistra dello sprite, ma quella del punto di possibile contatto (il quadratino verde dal minuto 1:23, vedi anche da 4:53). Nel caso dell'urto a destra, nel tuo caso, è data dalla coordinata X dello sprite più una costante, che nel caso del tuo sprite potrebbe essere 15. Quindi cambia la riga 380 con la seguente: 380 CX=INT(((X+15)-24)/8) o se vuoi semplificarla: 380 CX=INT((X-9)/8) poiché 15-24 fa -9. Questo solo per la collisione verso destra. Dovrai ripetere il test per sinistra, sopra e sotto con costanti specifiche (nelle posizioni sopra e sotto dovrai ovviamente agire sulla riga 390 anziché la 380). I punti da testare, in pratica, stanno ai confini dello sprite nelle 4 direzioni: è la che devo vedere con quale carattere sto urtando. Alcuni consigli. E' preferibile usare il joystick anziché la tastiera per leggere l'input, poiché il joystick ha una risposta molto più veloce e non ha un buffer come la tastiera. Se non sai come fare, puoi vedere i vari esempi che ho postato (dal Pac-Man a "The Runner"). Se non risultasse chiaro, ti posso spiegare come fare. Alla riga 510 è meglio non saltare alla 110, ma alla 240: 510 GOTO 240 così eviti di tracciare continuamento lo schermo (che non è cambiato) e questo accelera un po' l'esecuzione. Il ciclo principale del gioco fa le seguenti azioni: 1. Leggi input (tastiera o joystick) 2. Muove player (di un passo solo) e testa collisioni 3. Muove nemici (di un passo solo) e testa collisioni 4. ripeti dal punto 1 Ho visto che nel salto esegui un ciclo FOR. Questo va bene se non c'è altro che si muove nella scena, in caso contrario tutto il resto resterebbero fermo finché il ciclo non si completa. Per ovviare a questo problema è necessario eseguire, ad ogni ciclo, un piccolo movimento per ognuno degli "agenti" in gioco. Quindi se stai saltando, ti muoverai di un pixel verso destra e uno verso l'alto (o in movimento parabolico). Se c'è un nemico che si sta muovendo verso sinistra, ne decrementerai la coordinata di 1 pixel. E così via frame per frame. In questo modo si avrà la sensazione che tutti gli oggetti si muovano contemporaneamente. Un modo semplice di gestire questa cosa è implementare una macchina a stati per ogni agente (vedi video e codice sorgente di "The Runner"). Infine, ti consiglio vivamente di usare un linguaggio compilato come XC=BASIC 3, anziché il BASIC interpretato. Io utilizzo Visual Studio Code, se vuoi posso spiegarti un modo semplice per utilizzarlo con XC=BASIC. Per semplici giochi va più che bene e ti eviti la fatica di scrivere in assembly. Se hai altri dubbi, chiedi pure.
Sprite-Background collision detection
6:13
agpxnet
Рет қаралды 1,4 М.
C64 Sprite Multiplexing (EN)
12:34
agpxnet
Рет қаралды 17 М.
Does size matter? BEACH EDITION
00:32
Mini Katana
Рет қаралды 20 МЛН
Clown takes blame for missing candy 🍬🤣 #shorts
00:49
Yoeslan
Рет қаралды 40 МЛН
Пранк пошел не по плану…🥲
00:59
Саша Квашеная
Рет қаралды 5 МЛН
C64 Sprite Multiplexing (IT)
12:34
agpxnet
Рет қаралды 1,1 М.
Understanding how a demo works on the Commodore 64 (English)
8:41
Commodore 64 & 6510 retro-programming
Рет қаралды 5 М.
How to Create Your Own C64 Platform Game: "The Runner"
9:40
Smooth Scrolling Verticale
9:27
agpxnet
Рет қаралды 858
8-way Smooth Scrolling
9:58
agpxnet
Рет қаралды 2,7 М.
Smooth Scrolling Orizzontale Bidirezionale
4:32
agpxnet
Рет қаралды 320
Vertical Smooth Scrolling
9:27
agpxnet
Рет қаралды 4 М.
Rilevamento collisioni Sprite-Sprite
6:42
agpxnet
Рет қаралды 306
Sprite collision detection
6:42
agpxnet
Рет қаралды 888
Rate This Smartphone Cooler Set-up ⭐
0:10
Shakeuptech
Рет қаралды 3 МЛН
Todos os modelos de smartphone
0:20
Spider Slack
Рет қаралды 60 МЛН
ВАЖНО! Не проверяйте на своем iPhone после установки на экран!
0:19
ГЛАЗУРЬ СТЕКЛО для iPhone и аксессуары OTU
Рет қаралды 6 МЛН