attualmente sto lavorando alla mia versione di un gioco basato su tessere (pensa Terraria, ma meno fantastico (penso che sia una parola? Scusa se non lo è)).
Ad ogni modo, attualmente sto lavorando al rilevamento delle collisioni (anche per casi angolari!) Che è stato un grande passo per me. C'è qualcosa di estremamente gratificante nel vedere uno sprite non attraversare un blocco. Ma poi ho avuto l'idea di fare un benchmark. Cattiva idea.
1.000 quadrati, nessun problema. 10.000 quadrati, per 3 personaggi era un po 'ritardato. 100.000 quadrati (mappa davvero enorme), per 3 personaggi era ingiocabile.
Sto riscontrando il problema per cui non voglio nemmeno prendere in considerazione i blocchi che sono troppo lontani dal giocatore, dai personaggi, dagli oggetti, ecc., Ma non voglio caricare costantemente questi in-out di memoria.
Ecco il mio algoritmo finora, sentiti libero di criticare.
foreach (Block in level)
{
if (distance from block to player > a specified amount)
ignore this block;
else
{
get the intersection depth between the two bounding boxes
if (depth of intersection != Zero-vector)
{
check y size vs x size
resolve on smallest axis
}
}
}
Come noterai, quando la dimensione del livello aumenta, l'ordine di questo algoritmo cresce di N blocchi. Non vorrei nemmeno prendere in considerazione blocchi che non sono nemmeno vicini al giocatore.
Sto forse pensando di usare un doppio array di blocchi da (0,0) a (mapWidth, mapHeight) anziché un elenco, calcolando una zona di pericolo in base alla posizione della persona, ad es. Se la posizione del giocatore è a (10, 20) guarderà da (0, 10) a (20, 30) o così via.
Qualsiasi pensiero e considerazione sono fantastici, grazie.