Domanda

Ho giocato a questo gioco flash e dopo Ho superato la reazione iniziale ("lol, fire") e ho iniziato a chiedermi come avrei potuto replicare questo comportamento mutato da contatto durante la programmazione. Immagino sia un po 'come il honeypot xkcd .

Stavo pensando di iniziare con uno scenario in cui le particelle si flettono l'una dall'altra e le pareti di contenimento. La sequenza inizierebbe con un determinato numero di particelle "mutanti", e quando questi mutanti si scontrano con particelle regolari diventerebbero essi stessi mutanti. Potrei lavorare su alcune cose più divertenti in seguito.

Il mio problema è come iniziare con questo. Sto pianificando di farlo in C # usando gli elementi Drawing di .NET (anche se sono abbastanza nuovo in C # - se c'è una parte diversa di .NET dovrei usare fammelo sapere) ma se ci sono documenti generali su di esso sarei interessato a leggerli (se sono disponibili online ovviamente).

Grazie, Ross

È stato utile?

Soluzione

Penso che tu sia sulla strada giusta con quello che stai pensando, alcune particelle in una scatola andrebbe bene qui. Non riesco a immaginare che troverai articoli su un caso così specifico e semplice, ma forse per alcune delle tecniche richieste, ma un'implementazione del backend dovrebbe essere relativamente semplice rispetto a un renderer.

Per spostare le particelle attorno a un metodo semplice è Euler iteration , dove memorizzi le posizioni e le velocità. posizione = posizione + velocità * dt; dove dt è il cambiamento nel tempo dall'ultimo fotogramma. È meglio mantenere dt fisso e interpolare tra i punti per il renderer se è possibile ... questo ridurrà i problemi di stabilità e faciliterà il rilevamento delle collisioni.

Per riflettere una particella fuori da un muro, controlla se i suoi componenti x o y componenti della posizione supereranno i limiti e quindi capovolgi il segno dell'altro componente della velocità, ad es.

if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound) 
    velocity.y_component = -velocity.y_component;

if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound)
    velocity.x_component = -velocity.x_component;

Se hai costante dt, questo funziona abbastanza bene, ma se varia dovrai fare qualcosa di più complicato. trova il punto di collisione con la scatola e riflette la parte di il vettore fuori dagli schemi nella faccia con cui è stato scontrato.

Per far collidere le particelle tra loro è probabilmente meglio un controllo della distanza, innescando la riflessione una volta che la distanza è troppo piccola. cioè se si avvicinano troppo si scontrano. Rifletti i componenti della velocità come se le particelle fossero sfere, quindi il normale per la riflessione è la differenza delle loro posizioni.

Puoi trovare questo articolo su gamedev anche utile ...

Spero che questo aiuti.

Altri suggerimenti

Perché non dare un'occhiata al classico gioco degli Asteroidi come punto di partenza? Ecco un collegamento a uno che non utilizza DirectX ed è in c #

http://www.codeproject.com/KB/GDI-plus /asteroids.aspx

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