Domanda

Diciamo che sta costruendo un gioco di Tetris. Come qualsiasi programmatore corretta, avete la vostra logica della vista da un lato, e la logica di business sul lato opposto; probabilmente un full-on MVC in corso.

Quando il modello invia il suo update(), la vista si ridisegna, come previsto.

Ma allora ... se si vuole aggiungere, ad esempio, un'animazione a svanire una linea, come è possibile implementare che nella vista?

fare alcuna ipotesi che si desidera --- eccetto che "tutto è correttamente incapsulato".

È stato utile?

Soluzione

Personalmente, vorrei separare disegnare lo schermo il più spesso possibile, anche se non ci fosse alcun aggiornamento della posizione del blocco. Quindi avrei un ciclo da qualche parte con un "Aggiornamento" e "render" parte. Aggiorna interpreta palla, la logica che fa o non fa alcun aggiornamento posizioni e / o rimozione del blocco. Render gioca la palla alla parte grafica, che richiama i blocchi dove dovrebbero essere.

Ora, se ci sono linee da cancellare, la logica sa e può marcare quelle linee da rimuovere. Presumo qui, che ogni pezzo costituito da 4 blocchi singoli e uno di questi blocchi è un singolo oggetto. Ora, quando questo blocco ha il "morire" set -Flag, si può prendere alcuni render-parti svanire il blocco (diciamo, 500ms esplodere). Dopo questo periodo, l'oggetto può essere disposto e il blocco di una linea sopra cade. Perché 500ms? Beh, si dovrebbe assolutamente utilizzare in base al tempo di movimento come questo mantiene la velocità di gioco lo stesso su diversi computer.

A proposito, vi sono già cosiddetti motori di gioco che forniscono un tale aggiornamento-rendering-loop. Per esempio XNA, se si va la linea NET. È anche possibile codificare il proprio motore ma attenzione, non è un compito facile ed è molto che richiede tempo. Ho fatto questo una volta e non mi aspetto che sia un motore come il Source Engine; -)

Altri suggerimenti

La maggior parte dei giochi di eseguire un ciclo che ridisegna continuamente la vista del gioco il più velocemente possibile, piuttosto che in attesa di un cambiamento dello stato del modello e quindi aggiornare la visualizzazione.

Se ti piace il modello di vista del modello, allora potrebbe funzionare bene per la visualizzazione di continuare a trarre alcune tipologie di oggetti dopo che sono stati rimossi dal modello, li dissolvenza nel corso di pochi millisecondi.

Un altro approccio sarebbe quello di coniugare classe MVC con qualcosa come l'esecuzione differenziale - il 'view' è un modello di ciò che viene presentato, ma il codice di disegno a confronto il flusso di eventi della 'vista' crea con il flusso dalla prestazione precedente . Quindi, se in un flusso c'è una linea, e la prossima non c'è, il codice di disegno può animare la differenza. Questo permette il disegno da sottratto dalla vista. Spesso la 'vista' in MVC è una raccolta di widget, piuttosto che essere qualcosa che attinge direttamente il display, quindi si finisce con nidificati gerarchie MVC comunque: l'applicazione è MVC (modello di dati, Visualizza oggetti, regolatore app), dove la vista oggetto ha una collezione di widget, ciascuno dei quali è MVC (stato widget di (ad esempio, il pulsante premuto), guardare e sentire / vincolante toolkit, la mappatura degli eventi toolkit - widget di> stato).

Mi sono spesso chiesto io stesso.

I miei pensieri sono stati su questa linea:

1) La vista è dato lo stato dei blocchi (forma, bla-bla), ma con i dati extra "di transizione":

2) Il fatto che una linea deve essere rimosso è codificata nello stato, NON calcolato nella vista.

3) La vista sa come disegnare le transizioni ora:

  • Nessun cambiamento: lo stato è lo stesso per questo particolare blocco
  • Change "cadere" a "bloccato": stato è "bloccato" (da un blocco caduta)
  • Cambia da "bloccato" a "rimuovere": lo stato viene "rimosso" (da una linea di completamento)
  • Cambia da "cadere" a "rimuovere": lo stato viene "rimosso", ma vecchio stato è stato "cadendo"

interessa a pensare a un gioco come un MVC. Quello è un punto di vista non ho mai preso (per qualche strana ragione), ma sicuramente un intrigante che fa un sacco di senso. Dando per scontato che non implementare il vostro gioco di Tetris con un MVC, penso che ci sono due cose che si potrebbe desiderare di prendere in considerazione per quanto riguarda la comunicazione tra il controller e la visualizzazione: c'è stato, e ci sono eventi.

Il controller è, ovviamente, il punto centrale di interazione per l'utente. Quando emettono i comandi della tastiera, il controller sarà interpretarli, ed effettuare le regolazioni stato appropriato. Tuttavia, a volte il gioco entrerà in uno stato che coincide con un particolare evento ... come riempimento di una linea di blocchi che dovrebbero essere stati rimossi.

Scoregraphic vi ha dato una grande fondazione. La vista deve operare su un ciclo fisso per mantenere la velocità costante attraverso i computer. Ma oltre ad aggiornare la schermata per rendere nuovo stato, si dovrebbe anche avere una coda di eventi che possa eseguire le animazioni in risposta a. Nel caso di linee in Tetris riempimento, il controller potrebbe emettere oggetti evento fortemente tipizzati che derivano da una sorta di tipo base evento nella coda vista eventi, che potrebbe poi essere utilizzato dalla vista per eseguire le risposte animate appropriate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top