Autore Topic: Formato Dati  (Letto 1955 volte)

harlock1975

  • Neo-iscritto
  • *
  • Post: 16
  • Gioco Preferito: turrican
Formato Dati
« il: 12 Settembre 2010, 11:36:04 »
 Ciao a tutti, mooolto lentamente sto procedendo con un primo esperimento in LM. Ho una bozza di grafica e i primi pezzi di codice (funzionanti) per il raster e la gestione del joystick.
Vorrei ora provare a visualizzare la prima "stanza" del gioco.
La mia idea era avere tile di 2x2 caratteri e stanze di 20x12 tile (niente scroll).
Il fatto è che in ogni stanza vorrei poi avere eventuali nemici, informazioni di transizione ad altre stanze (porte o simili), oggetti, ... Inoltre credo serva anche un qualche codice di inizializzazione (che so, se ho preso un oggetto, non devo visualizzarlo nella stanza da cui l'ho preso).
Come è possibile fare una cosa del genere? C'è un modo migliore che potete consigliarmi?
Non ho le capacità necessarie per disassemblare, altrimenti i modelli potrebbero essere Joe Gunn o Pitfall II.
Ciao e grazie!!!

harlock1975

  • Neo-iscritto
  • *
  • Post: 16
  • Gioco Preferito: turrican
Formato Dati
« Risposta #1 il: 17 Settembre 2010, 12:37:51 »
 Nessuno?  :huh:
Intanto pensavo di dare ad ogni tile un attributo che identifichi il tipo (muro,porta, piattaforma,...).
Poi, a particolari tile in una stanza assocerei un altro attributo dipendente dal tipo (ad es., x una porta indicherei l'indice della stanza di destinazione).
Quindi avrei, x ogni stanza
- 240 byte di tile
- 1 byte x colore di sfondo
- x byte di attributi (dipende da quanti tile "particolari" ho nei 240)
Ma poi???
I mostri da visualizzare, eventuale codice specifico per la stanza,...???

Grazie!

med

  • Utente
  • **
  • Post: 103
    • med64.tk
  • Gioco Preferito: Turrican 2
Formato Dati
« Risposta #2 il: 17 Settembre 2010, 15:08:13 »
 Sinceramente non riesco a capire quali siano i tuoi dubbi. Stai esattamente risolvendo da solo i problemi che ti poni:

Citazione
Intanto pensavo di dare ad ogni tile un attributo che identifichi il tipo (muro,porta, piattaforma,...).

é quello che devi fare infatti... Non devi fare altro che creare una sorta di "tabella" aggiuntiva per i tiles e all'interno di ogni "cella" inserire un qualche numero che identifichi una funzione da eseguire. Ok, ti sta facendo male la testa. Vediamo se mi spiego meglio.
Immagina di avere 256 tiles numerati ovviamente da 0 a 255.
Adesso riserva un'area di memoria di 256 bytes ad una tabella per gli attributi dei tiles: per esempio scegliamo l'area che si estende da $C000 a $C0FF (cioè da 49152 a 49407). Ogni singola locazione dovrà contenere informazioni utili alla gestione di ogni singolo tile. Immaginiamo che:
- #$00 --> Indica che il tile fa parte dello sfondo per cui, di fatto, non influenza in alcun modo il gioco o i suoi sprites.

- #$01 --> Indica che il tile contiene "elementi" che uccidono l'eroe, per cui se toccati da un suo sprite ne causano la morte.

- #$02 --> Indica che il tile contiene una porta che consente, se toccato dallo sprite dell'eroe, di saltare... chessò... ad un nuovo livello di gioco.

- etc etc

Ora che ti resta da fare? Semplice. Durante il gioco, quando controlli le collisioni tra gli sprites e lo sfondo, devi determinare con quale tile sono venuti in "collisione". Ad esempio, immaginiamo che lo sprite dell'eroe abbia toccato il tile numero 7...

                          LDX #$07 ;cioè il numero del tile che andiamo a esaminare
                          LDA $C000,X ;la locazione in cui inizia la "tabella" attributi
                          BNE CONFRONTO1
                          JMP TILEDISFONDO

CONFRONTO1    CMP #$01
                          BNE CONFRONTO2
                          JMP MORTEDELLEROE

CONFRONTO2    CMP #$02
                          BNE FINECONFRONTI
                          JMP LIVELLOSUCCESSIVO

FINECONFRONTI RTS


In pratica non facciamo altro che andare a leggere il valore posto nella locazione $C007 (cioè $C000 + #$07, che contiene le informazioni per il tile numero 7, appunto) e in base al suo contenuto saltiamo a delle apposite routine che svolgano determinate funzioni: TILEDISFONDO (non facciamo nulla), MORTEDELLEROE (ucciadiamo l'eroe, ricominciamo lo stesso livello o determiniamo il game over), LIVELLOSUCCESSIVO (carichiamo il livello successivo di gioco). Come avrai capito, hai la possibilità di definire fino a 256 "attributi" possibili per ogni tile.
Questo è il sistema che uso io. Spero ti sia stato chiaro.

Lo stesso sistema lo puoi, in grande, pensare anche per la gestione dei personaggi che devono caratterizzare ogni livello che andrai a realizzare.

Spero, un minimo, di esserti stato utile.

harlock1975

  • Neo-iscritto
  • *
  • Post: 16
  • Gioco Preferito: turrican
Formato Dati
« Risposta #3 il: 17 Settembre 2010, 17:10:13 »
 Grazie, med!
La parte tile mi è abbastanza chiara, anche se mi mancava l'organizzazione dei confronti.
Quello che non mi è chiaro è come gestire i dati "variabili".  :doh:
Ad es. in una stanza ho un oggetto e due nemici. In un'altra niente.
Come posso organizzare questi dati?
Metto degli slot fissi?
Cioè decido a priori che non avrò mai più di 2 oggetti e 4 nemici per stanza, quindi per ogni stanza avrò sempre 6 byte dedicati.
Ma tornando all'esempio sopra, mi trovo con 3 byte "sprecati" per la prima stanza e 6 per la seconda!
Mi sto facendo un problema x niente?

Grazie ancora  

med

  • Utente
  • **
  • Post: 103
    • med64.tk
  • Gioco Preferito: Turrican 2
Formato Dati
« Risposta #4 il: 17 Settembre 2010, 17:47:09 »
 
Citazione
Mi sto facendo un problema x niente?
Mi sa di si...

Citazione
Ma tornando all'esempio sopra, mi trovo con 3 byte "sprecati" per la prima stanza e 6 per la seconda!
Se cerchi di risparmiare il più possibile bytes, l'unico modo è quello (a mio vedere) di creare routine personalizzate per ciascun livello di gioco. In questo modo risparmieresti si i tuoi 3 bytes, ma ne sprecheresti decine e decine con le nuove routine... quindi, per come la vedo io...

Citazione
Metto degli slot fissi
...diventa la soluzione migliore!
A titolo informativo, questo forum è frequentato da gente che "ha scritto e pubblicato" giochi e quindi è probabile che loro abbiano "sistemi" migliori di gestione di un gioco. Io userei slot fissi per ciascun livello (sprecando appunto bytes) ma routine uniche e comuni a qualunque livello guadagnondone non solo in spazio, in quanto il codice del gioco diventerebbe più lineare e meno "intricato". Ti immagini dover riscrivere decine di volte la stessa routine, ad esempio di animazione di una porta, per il primo, il secondo, il quindicesimo livello etc etc? Che confusione...

Comunque, spero di vedere passo passo i progressi che fai? Posta ogni tanto qualche immagine.

harlock1975

  • Neo-iscritto
  • *
  • Post: 16
  • Gioco Preferito: turrican
Formato Dati
« Risposta #5 il: 18 Settembre 2010, 09:14:02 »
 
Citazione da: "med"
Mi sa di si...
Chiarissimo, non è assolutamente mia intenzione scrivere lo stesso codice diverse volte!
E' solo che 64 Kb sono pochi e la roba che vorrei mettere nel gioco tanta  :lol:
Spero di avere qualcosa da pubblicare a breve (anche se il tempo che gli dedico è mooolto poco), mi farebbe piacere avere feedback!

Ciao e grazie ancora x i suggerimenti!