Quando si scrive un gioco senza l'utilizzo di eventi ... tutto ciò che si sta realmente facendo è implementare eventi personalmente. Questo è vantaggioso, perché puoi renderlo molto più efficiente rispetto all'utilizzo degli eventi incorporati nella tua lingua. I giochi scritti in questo modo sono meno soggetti a errori se sai cosa stai facendo.
Ad esempio, quando stavo cercando di insegnare a mio fratello come sono scritti i giochi, ho scritto per lui un semplice gioco di serpenti. Ho avuto il ciclo principale in una discussione, spostare il serpente e disegnarlo nella sua nuova posizione in un ciclo. Avrei un thread in esecuzione allo stesso tempo che controlla continuamente 4 cose:
1) Se il serpente si è schiantato su se stesso (game over); se si verifica un game over, interrompi il thread principale che aggiorna la posizione principale del serpente, stampa il gioco sullo schermo, attendi l'input da tastiera, quindi riavvia il gioco.
2) Se il serpente avesse mangiato una mela; incrementare la variabile contatore che indica quante mele sono state mangiate e stampare questo nuovo valore sullo schermo, sovrascrivendo ciò che era precedentemente presente.
3) Se il serpente aveva mangiato una quantità di mele divisibile per 10 (serpente cresce da 1 cella, sottrarre da una variabile di attesa che dice quanto tempo deve passare tra ogni movimento del serpente rende)
4) Se è stato premuto un tasto freccia. Se lasciato, imposta move to 0, se right set muove su 1, se down set muove su 2, se su set muovi verso 3. L'int in cui è memorizzato è un puntatore a un array di 4 delegati che fanno muovere il serpente nella giusta direzione.
Il ciclo principale che aggiorna la posizione del serpente indica al thread il controllo di queste 4 cose su cosa sta facendo il serpente. Il modo in cui lo faccio è che ho ogni cella sullo schermo che la testa del serpente si muove per riferirsi a una matrice bidimensionale di delegati. Informazioni su questa serie di delegati:
Il gioco è scritto in modalità console e utilizza i colori della console. La console è impostata su 80x50 caratteri. Un delegato come segue: "delegate void ptr()"; quindi creo l'array con: "ptr [,] pos = new ptr [80,50]". Dite che la testa del serpente è in posizione (4,5) sullo schermo, dopo che si è spostata lì il ciclo principale eseguirà "pos [4,5] .Invoke();".
Uno di essi: Quando il serpente si sposta in una nuova posizione, il thread del ciclo principale otterrà ogni cella che il serpente copre sullo schermo e imposta il delegato in quella posizione in modo che punti a una funzione chiamata "gameover vuoto() "che imposta la variabile gameover_ su true. Quindi, quando il thread del loop che controlla lo stato del gioco controlla il gameover, blocca il gioco e stampa il gioco sullo schermo.
Altro: Quando una mela viene disegnata sullo schermo, la posizione del delegato su cui viene disegnata (che è casuale) è impostata su "void increment_apple()" che incrementa il contatore della mela, rimuove la mela corrente da visualizza e disegna una nuova mela sullo schermo, impostando la vecchia posizione della mela in modo che punti a "void nop()" che non fa nulla e la nuova posizione della mela indicherà "void increment_apple()".
Questo è fondamentalmente come funziona il gioco. Come puoi vedere, il serpente si sposta su queste posizioni sullo schermo, e senza eseguire controlli espliciti come "if (snake_position == some_position)", il gioco fa automaticamente tutto ciò che è necessario per tutto ciò che accade nel gioco, molto simile a come quando fai clic su un pulsante su un modulo, un'azione viene assegnata automaticamente a quell'evento, senza che tu debba controllare tu stesso l'evento.
Quindi, vedete, avrei potuto usare un modulo e gli eventi predefiniti forniti da C#, ma non l'ho fatto. Ho usato l'interfaccia della console e implementato il mio sistema di eventi.
Ecco come funziona dietro le quinte: il ciclo principale per la tua app form verrà eseguito in un thread che controlla l'input da tutti i pulsanti, ecc sullo schermo. Ognuno di questi elementi imposterà una variabile booleana che usano per vero. Quando si fa clic su questo pulsante, un altro thread che esegue un ciclo controlla ciò che si è premuto, e dice di aver premuto un pulsante chiamato "button1", a quel pulsante sarebbe stato assegnato un delegato; quel delegato viene quindi eseguito con qualunque cosa punti.
Tipo di difficile da spiegare, ma ha senso per te?
** Le applicazioni della Console ** normalmente non interagiscono con il mouse né hanno molte preoccupazioni sui sistemi di coordinate pixel. Mentre sono sicuro che stai per ottenere un sacco di risposte che descrivono come catturare il mouse e quant'altro, penso che sia meglio fare un passo indietro e riconsiderare quello che stai facendo. –
Molte grazie per il commento, ma sto imparando il più possibile sulle app per console C#. Tra circa 3 mesi sarò soddisfatto e passerò ai moduli e infine alle nuove lingue. Ho letto parte del tuo blog e apprezzo le tue opinioni sull'apprendimento delle lingue. Ottenere una lingua per fare qualcosa che normalmente non fa in alcuni casi è solo una parte della sfida. – Bloodyaugust