Quale sarebbe il modo migliore per trovare uno spazio aperto in un livello?


7

Sto lavorando a un gioco 2D in cui usi Paint per aggiungere tessere a un livello e in questo momento sto lavorando per aggiungere tessere di curvatura. L'ho impostato in modo tale che alcune vernici orientate alla direzione utilizzino due punti (un inizio e una fine) per determinare la direzione verso cui punteranno le tessere (sinistra, destra, su, giù). Le tessere di ordito hanno questi punti, ma saranno aggiunto ad altri due elenchi (inizio e fine dell'ordito). Il modo in cui funzionano gli orditi è: se il giocatore colpisce una tessera verranno teletrasportati sulla corrispondente tessera ordito. Ora, se ho intenzione di farlo funzionare correttamente, devo farlo in modo che il giocatore non possa essere teletrasportato in un muro o fuori dalla mappa. Quindi ho bisogno di spostare il punto su una tessera aperta esattamente uno spazio lontano da qualsiasi muro.

Quale sarebbe il modo migliore per farlo?


Stai impostando questi punti di curvatura in anticipo o vengono generati automaticamente in qualche modo?
Richard Marskell - Drackir,

Vedi la mia risposta e descrizione del problema dell'imballaggio su gamedev.stackexchange.com/questions/16054/…
Ingegnere

@Drackir La vernice è solo una scia di particelle che non scompare o non si muove e ogni particella ha il suo punto per mappare la sua posizione. Quindi ho creato un ciclo for che controlla la posizione di ogni particella, vede se quella piastrella è aperta, cambia la mappa di collisione di conseguenza e quindi rimuove la particella. La grafica delle piastrelle viene disegnata in base alla mappa delle collisioni.
IronGiraffe,

Sono incredibilmente confuso. Forse un'immagine aiuterebbe le persone a vedere cosa stai cercando di fare e ti darebbe risposte solide.
Richard Marskell - Drackir,

@Drackir Ecco il video del gioco finora. Ogni volta che si posano le tessere, si cambiano i valori in quella posizione sulla mappa delle collisioni (una matrice int.) Con le tessere ordito ho bisogno di 9 tessere dello spazio aperto (tutte le 9 tessere sono uguali a 0) e le tessere ordito sono creato agli estremi della linea viola (dove appaiono le bandiere a 1:32). Ciò di cui ho bisogno è un modo per usare un algoritmo di ricerca per cercare un nuovo punto che si adatti alle mie linee guida (8 riquadri vuoti intorno al punto vecchio) il nuovo punto che è anche vuoto.) Esempio.
IronGiraffe

Risposte:


3

Se tutto ciò che vuoi fare è assicurarti che la tessera cliccata abbia delle tessere aperte attorno, creerei semplicemente una funzione che controlla le tessere circostanti. E quindi chiamalo sul riquadro selezionato.

Potresti configurarlo in un ciclo (nidificato) o semplicemente creare istruzioni if ​​per esso. Quindi, in pseudo-codice:

function IsTileOpen(tile)
  if tile NOT open
    return false because if the clicked tile isn't open, why check any others
  if tile on top row
    return false because we're against the top wall
  if tile on left column
    return false because we're against the left wall
  if tile on right column
    return false because we're against the right wall
  if tile on bottom row
    return false because we're against the bottom wall
  if top left tile NOT open
    return false
  if top tile NOT open
    return false
  if top right tile NOT open
    return false
  if left tile NOT open
    return false
  if right tile NOT open
    return false
  if bottom left tile NOT open
    return false
  if bottom tile NOT open
    return false
  if bottom right tile NOT open
    return false
  return true because all the surrounding tiles were open
end function

Modifica in base al commento

Esistono due modi per gestire la situazione:

  1. (Più semplice) Puoi semplicemente riprodurre un suono e indicare che la posizione scelta non è valida e devono scegliere un'altra opzione.
  2. Utilizzare un algoritmo di ricerca per trovare un riquadro aperto. Tuttavia, penso che ci dovrebbero essere dei limiti su come utilizzarlo. Prendi, ad esempio, una situazione in cui fanno clic sul lato sinistro della mappa e l'unico punto aperto è lontano sul lato destro. Il tuo algoritmo di ricerca trova quel punto aperto e posiziona l'altro ordito lì. Questo non sembra molto intuitivo e può essere frustrante. Il mio suggerimento in questo caso (supponendo che tu non voglia fare # 1 che è il mio suggerimento principale), è di cercare solo le tessere attorno alla tessera corrente (forse in un raggio di n-tessere). In questo modo il cancello di curvatura non apparirà troppo lontano da dove si è fatto clic. Per fare una ricerca come questa (presupponendo un raggio di 1 riquadro), devi solo chiamare la funzione sopra sulle otto tessere intorno a quella corrente (supponendo che quella corrente non fosse disponibile). Potresti farlo in un ciclo o, di nuovo, con istruzioni if.

So come farlo, ma non sono sicuro di come utilizzare un algoritmo di ricerca per trovare un nuovo punto quando il vecchio punto non è aperto. Ho letto sul pathfinding e sembra che potrei fare qualcosa di simile a questo, dove avrei usato l'algoritmo di Dijkstra o A * per trovare lo spazio aperto più vicino. Non sono sicuro di come potrei farlo, perché non ho mai programmato nulla di simile prima. Mi dispiace essere un tale fastidio, sono un po 'nuovo nella programmazione, quindi non lo so ancora molto.
IronGiraffe

@IronGiraffe - Oh, capisco cosa intendi. Ok, aggiornerò la mia risposta.
Richard Marskell - Drackir,

@IronGiraffe - Aggiornato.
Richard Marskell - Drackir,

Meglio farlo "guarda se il riquadro è aperto" durante il caricamento o la generazione del livello e memorizza il risultato. Di solito devi passare attraverso tutte le tessere (almeno, tutte le tessere caricate / visibili se fai una valutazione pigra) a questo punto comunque, quel poco lavoro extra non importa e i frammenti di memoria extra non dovrebbero importare sulla maggior parte delle piattaforme o.
Martin Sojka,

@Martin - Da quello che ho capito, il livello cambia mentre giochi. Guarda il video E raccomando comunque l'opzione 1 sopra, ma se devono fare la seconda opzione, è solo con un clic, quindi è improbabile che provocherà un impatto evidente sulle prestazioni.
Richard Marskell - Drackir,

0

Penso che dovrai trovare il rettangolo "libero" più vicino a una tessera ordito, dove il giocatore può adattarsi.

C'è una domanda simile su StackOverflow. Clicca qui per vedere .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.