Posts tagged giochi

AsciiCopter

Dopo un paio di giorni di smanettamenti con Flash ed AS 2.0, ecco che posso fieramente presentare il mio primo giochillo giocabile direttamente su internet: ASCIICopter. Lo scopo del gioco è evitare gli ostacoli che vi si porranno davanti durante la partita, comandando l’elicottero con il pulsante sinistro del mouse.

Senza titolo-1

(Click sull’immagine per giocare)

I ringraziamenti li troverete direttamente nel gioco, nei credits.

Per un pò credo di sparire a causa degli esami, ma ovviamente tornerò presto ;) Cheers!

  • Share/Bookmark

Disegnare una sprite animata – Grafica – XNA Tutorials

In questo articolo impareremo a disegnare su schermo una sprite animata tramite poche e semplici istruzioni. Innanzitutto, ecco l’immagine che ho usato io per questa prova:

Senza titolo-1

Come potete notare non è niente di che: un insieme di quadrati con un semplice effetto di illuminazione, fatto in photoshop in due secondi. Ora, se volessimo partire da questa immagine per creare un animazione, come fare? Basta ragionare in termini di frame. Mi spiego meglio: provate a disegnare uno dopo l’altro, nella stessa posizione, i quadrati contenuti in quest’immagine e non uno a fianco all’altro.

Quale effetto otterreste? Eccolo.

[gickr.com]_651a3e0d-5b3f-a354-9dbe-384d07960c7c

Spero di essere stato chiaro, più di tanto non potevo :P

Prenderemo la nostra immagine di esempio e disegneremo su schermo una parte per volta e non tutta insieme, in modo tale da dare l’idea dell’animazione. Come si fa? Ecco il codice, che piano piano spiegherò nel dettaglio (per quanto sia veramente facile).

Nota: nella stessa cartella dell’eseguibile ho posizionato il file “immagine.png”, in quanto ho caricato la texture direttamente da file.

using System;
using System.Collections.Generic;
using System.Linq;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace GiocoDiProva
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        Texture2D immagine;
        int number_of_frames = 10;
        int current_frame = 0;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {

            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            immagine = Texture2D.FromFile(this.GraphicsDevice, "immagine.png");
        }

        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            if (current_frame < number_of_frames)
            {
                current_frame++;
            }
            else
            {
                current_frame = 0;
            }

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            spriteBatch.Begin();
            spriteBatch.Draw(immagine, new Rectangle(200, 200, 40, 40), new Rectangle(current_frame * 40, 0, 40,40), Color.White);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

Partiamo dalle dichiarazioni delle variabili:

        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        Texture2D immagine;
        int number_of_frames = 10;
        int current_frame = 0;

La Texture2D immagine è la nostra texture che verrà “sezionata” per poi essere disegnata. “number_of_frames” è invece il numero dei frames totali di cui si compone la nostra animazione. “current_frame” è invece un intero che assumerà il numero del frame attuale per sapere in ogni istante quale parte dell’immagine deve essere riprodotta.

Il metodo Update spiega meglio l’utilizzo di queste due variabili (il metodo LoadContent l’ho saltato perchè mi pare ovvio ormai a cosa serve :) ):

protected override void Update(GameTime gameTime)
        {
            if (current_frame < number_of_frames)
            {
                current_frame++;
            }
            else
            {
                current_frame = 0;
            }

            base.Update(gameTime);
        }

In questo metodo controlliamo se il frame attuale che stiamo considerando è minore del conteggio totale dei frames. Se ciò avviene, allora andremo avanti di frame passando al successivo, tramite un semplice incremento. Altrimenti, se il controllo restituisce falso, vuol dire che abbiamo raggiunto la fine dell’animazione e dobbiamo riniziare da capo. A questo proposito aggiungiamo il “current_frame = 0″.

Ora che abbiamo deciso quale frame disegnare, dobbiamo utilizzare quest’informazione nel metodo Draw. Ecco il codice:

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            spriteBatch.Begin();
            spriteBatch.Draw(immagine, new Rectangle(200, 200, 40, 40), new Rectangle(current_frame * 40, 0, 40,40), Color.White);
            spriteBatch.End();

            base.Draw(gameTime);
        }

Stavolta basta una sola istruzione. Precisamente, il metodo Draw che prende quattro parametri in input:

  1. la texture da disegnare.
  2. il rettangolo di “destinazione”, ovvero il nostro frame con le coordinate di disegno e la grandezza del frame desiderato. In quest’esempio, ho disegnato la sprite alle coordinate 200,200, con una grandezza del frame di 40×40 (che è appunto la dimensione di ogni quadrato incluso il contorno).
  3. il rettangolo “sorgente”, ovvero quel rettangolo che racchiude tutta l’immagine (per intenderci, la prima da me esposta all’inizio dell’articolo.
  4. il colore da usare per la modulazione del canale (come al solito ho usato il bianco).

Come per ogni test, premete F5 e guardate il risultato ;)

  • Share/Bookmark

Installazione dei programmi – Inizio e Preparazione – XNA Tutorials

Adesso che abbiamo scaricato i nostri file e il necessario per iniziare, ovviamente, dobbiamo installare un pò tutto. Come prima cosa quindi avvieremo il setup del Visual C# 2008 Express Edition. Una volta avviato dovremo aspettare qualche secondo per il caricamento dei componenti.

Successivamente, ci ritroveremo davanti ad una schermata di installazione classica, nella quale dovremo andare avanti. Incontreremo anche una schermata relativa ai prodotti facoltativi da installare, simile a questa:

Senza titolo-2

(Click per Ingrandire)

Se è la prima volta che lo installate avrete più opzioni tra le quali scegliere: tralasciando il resto delle descrizioni, vi consiglio di installare una copia della documentazione MSDN sul disco fisso, in modo tale da avere sempre un riferimento anche senza una connessione ad internet.

Dopo aver proseguito ci ritroveremo quindi nella schermata di download: potrete vedere con i vostri occhi il programma che creerà una lista di applicazioni da scaricare, le scaricherà una ad una e le installerà sul sistema. Una volta terminate queste operazioni, avremo finito con il Visual C#.

Passiamo quindi all’XNA Game Studio. Apriamo il file “XNAGS31_setup.exe” ed ecco la schermata che ci si porrà davanti:

Senza titolo-3

(Click per Ingrandire)

Da questo momento in poi il discorso sarà lo stesso del Visual C#. L’installazione è automatica e quindi ci basterà cliccare su “Next” quando necessario, scegliendo in un passaggio le modalità di comunicazione dei giochi realizzati con il framework. A voi la scelta di questi parametri.

Una volta finito il processo di installazione avremo tutto il materiale pronto per l’uso. A questo punto non ci rimane che avviare Visual C# 2008 Express Edition e proseguire al prossimo articolo…

  • Share/Bookmark

Download dei files necessari – Inizio e Preparazione – XNA Tutorials

Il titolo dice tutto: come prima cosa dobbiamo prendere tutti i programmi di cui avremo bisogno, installarli e quindi iniziare a lavorare. Il download dei files a noi necessari è veramente semplice e non richiede operazioni complicate. Come prima cosa, andiamo su

http://creators.xna.com/it-IT/downloads

la pagina di download ufficiale di tutti i programmi (e relativi prerequisiti) che utilizzeremo nello sviluppo del nostro gioco.  Al momento in cui scrivo, questi sono i downloads messi a disposizione nella pagina:

  • XNA Game Studio 3.1 (che utilizzeremo durante i nostri tutorials)
  • XNA Game Studio 3.1 Documentation
  • Visual C# Express Edition
  • DirectX SDK
  • DirectX Runtime Web Installer

cco_resources_downloads_downloadItemImage_XNAGS3.1

Cliccando sulla voce di download di XNA Game Studio, verremo indirizzati alla pagina del download vera e propria, su microsoft.com/downloads. La schermata che vi dovreste trovare davanti è questa:

111

(Click per ingrandire)

basterà cliccare sul pulsante “Download” per iniziare immediatamente il download di questo primo componente. Ma proseguiamo, le cose non finiscono qui.

cco_dwnld_msdn

Le librerie e i file della guida in linea saranno essenziali per lo sviluppo del vostro gioco o programma con XNA Game Studio. Molto spesso infatti sarà necessario andare a cercare informazioni per un metodo, una proprietà oppure una classe messa a disposizione dal Framework. Qui c’è poco da dire e nulla da installare, la documentazione è tranquillamente accessibile da internet.

Una copia della guida, inoltre, sarà installata sul proprio pc in modo tale da essere consultabile anche in assenza di collegamento ad internet.

cco_dwnld_visualc2008

Visual C# 2008 Express Edition è la versione gratuita dell’ide Microsoft dedicato al C#. Non c’è bisogno che ve ne parli in quanto penso che un minimo lo conosciate già. Ma vediamo come scaricarlo. Quando cliccheremo sul link riportato, verremo redirezionati sulla home page delle versioni Express di Visual Studio. Scorriamo la pagina, nella quale potremo dare un’occhiata ai vari prodotti della suite. Una volta che troverete la voce relativa al Visual C# (come nell’immagine sotto), basterà selezionare l’Italiano come lingua e poi cliccare su Download.

Senza titolo-2

Una volta che avvierete il file scaricato, non vi preoccupate di eseguire altre operazioni, in quanto l’installer si occuperà di installare tutti i prerequisiti necessari. Probabilmente, nel caso non sia presente sulla macchina, verrà installato anche il .NET Framework più recente.

Ora, già con questi componenti installati non dovreste avere molti problemi: in molti casi i runtime directx sono già installati e nel caso non lo siano vi verranno richiesti.

  • Share/Bookmark

RetroBottega – Parte il progetto.

Cos’è Retrobottega?

E’, in un certo senso, la materializzazione dei primi passi di un viaggio. Un viaggio alla ricerca dei propri obiettivi. Il mio obiettivo è imparare a creare un videogioco, imparare ad usare vari strumenti. Da qualche tempo sto usando SDL.NET e, dopo un periodo di prova abbastanza approfondito, sto provando a mettere tutto a frutto.

logo

Ho finalmente trovato una persona che mi aiuterà con i disegni.

C’è un’idea, c’è la voglia. Si inizia a lavorare.

Spero di pubblicare presto le prime avvisaglie di sviluppo concreto di quello che sarà il primo gioco targato RetroBottega. :D

Ciao!

  • Share/Bookmark

Tempo di indecisioni.

Ebbene si.

Sto cercando sempre più di addentrarmi nella programmazione di giochi. Ho voglia di imparare, di studiare e provare magari a fare qualcosa di proprio e proporlo in giro. Le idee ce le ho.

L’unica cosa che non riesco a decidere è COME realizzare tutto questo? Fino ad oggi ho parlato di SDL.NET, ma come librerie, come ben sapranno quelli che del settore ne capiscono, sono abbastanza vecchiotte. Come disse Cherno sul forum di tgmonline, sono state tranquillamente surclassate da Allegro.

Sinceramente, però, volevo rimanere nell’ambito del C#, dato che come linguaggio mi è sembrato interessante. Certo, lo farei con una comprensione decisamente minima di un qualcosa di più potente come il C++. Il grande interrogativo è questo, ma ci sono tanti pro e contro per ogni possibile risposta.

Rimanendo su pc, dovrei trovare una valida libreria/engine con cui lavorare.

Andando su Xbox userei XNA, e fin qui ok. Ma pagare 99$ annuali per fare già solo il debug mi sembra troppo :S

Ci sarebbe la psp… tutto molto nuvoloso.

Mboh.

  • Share/Bookmark

Creazione di un pacchetto di Installazione per i propri programmi – Parte 1

Come avete visto un paio di post addietro, per il mio gioco “A Game About Wife’s Fury” ho realizzato un piccolo pacchetto di installazione, per consentire agli utenti di installarlo con la massima semplicità e scaricando un solo file. Io per primo, al tempo, mi chiesi: Come posso realizzare uno di questi pacchetti di installazione?

Nell’articolo di oggi analizzeremo uno di questi strumenti da me utilizzati. Parliamo di Advanced Installer, reperibile gratuitamente nella sua versione Freeware sul sito http://www.advancedinstaller.com/. Ovviamente, tratterò solo la parte relativa alla versione Freeware, in quanto per ovvie ragioni monetarie non posso ancora permettermi di pagare 299$ ogni sei mesi :D

Dunque, iniziamo. Colleghiamoci al sito del programma riportato poco sopra, e rechiamoci nella pagina dei Downloads. Clicchiamo sull’icona “Download” e lo scaricamento inizierà automaticamente. Una volta installato il programma (darò per scontato che sappiate farlo ;) ), troveremo una schermata semplice ed intuitiva ad accoglierci all’apertura.

install1

Ovviamente, l’unica tipologia di soluzione che potremo selezionare sarà la “Simple”. Non permetterà delle personalizzazioni a livello estetico, ma sicuramente permetterà di gestire al meglio l’installazione del nostro programma. Tra poco vedremo come.

  1. Selezioniamo Simple tra le tipologie di progetto;
  2. Deselezioniamo “Use Wizard to Create the Project”;
  3. Clicchiamo su Ok.

La schermata che ci ritroveremo sarà la seguente:

install2

Come potete vedere, qui troviamo le prime personalizzazioni base al progetto. Possiamo inserire il nome del programma, il nome del produttore, la versione del programma che installeremo e altri dati sul prodotto come Sito Web, Contatti e Url di Supporto e Update.

A lato, invece, possiamo vedere un menù dove è possibile personalizzare la nostra installazione:

install3

Attualmente ci troviamo in Product Details. Inseriamo le nostre informazioni e, una volta terminata la procedura,  passiamo alla scheda successiva: Install Parameters.

install4

In questa nuova schermata avremo a che fare con le personalizzazioni relative ai percorsi d’installazione del nostro programma e i tipi di pacchetti che devono essere installati (da qui potremo selezionare se, per esempio, il nostro programma è destinato ad un’architettura a 64bit o a 32bit). O ancora, possiamo trovare possibilità di personalizzazione riguardanti il reboot dopo l’installazione: dobbiamo riavviare o no il pc alla fine della procedura? Ma non finiamo qui: possiamo decidere se creare o no un punto di ripristino del sistema dopo l’installazione,  oppure scegliere delle opzioni di minimizzazione del programma d’installazione stesso.

Insomma, il ventaglio di possibilità che ci viene proposto non è assolutamente indifferente.

Ma andiamo avanti: stavolta saltiamo la scheda Upgrades per passare direttamente a Prerequisites.

install5

Come potete ben intuire, la scelta dei parametri in questa sezione può rivelarsi critica per la creazione di un buon pacchetto di installazione. Ogni programma da noi creato, infatti, avrà dei prerequisiti. Questi prerequisiti sono delle condizioni che devono esistere nella macchina affinchè possa avere successo l’installazione. Per esempio, per il mio gioco “A Game About Wife’s Story”, tra i prerequisiti c’è il .NET Framework 2.0 e un sistema operativo non inferiore a Windows Vista. Questo perchè, in fase di progettazione e sviluppo, ho scelto di usare il .NET Framework nella sua versione 2.0 e ho usato delle macchine con Vista e Windows 7.

Tuttavia la scelta di prerequisiti non si ferma a questi due parametri: possiamo verificare addirittura la presenza di un programma specifico della famiglia Office o di SQL Server Express, giusto per citarne due.

In una scheda al livello inferiore dello schermo inoltre è possibile selezionare delle condizioni minime del sistema per l’avvio: prerequisiti di livello hardware, insomma, come la presenza di una certa quantità di memoria RAM o una risoluzione minima.

Non analizzerò la scheda “Custom Launch Conditions” in quanto in questo articolo parlerò del programma solo a livello basilare. Nella prossima parte dell’articolo invece parlerò dell’altro menù, ovvero quello comprendente “Files & Folder”, “Registry” e “Media”.

Restate sintonizzati, alla prossima!

  • Share/Bookmark

Template per Applicazioni SDL.NET

Rieccomi qua a buttare giù due righe. Stamattina, mentre tornavo a casa, ho pensato di creare un file di template per Visual Studio che permetta, con un singolo click, di creare un modello di applicazione già pronto per l’uso con SDL.NET. Tramite Visual Studio è stato ovviamente molto facile: ve lo riporto qui, pronto da scaricare ;)

dl

Istruzioni per l’installazione del Template:

  1. Scaricare il file Zip del template.
  2. Copiarlo (per intero) nella cartella Documenti > Visual Studio xxxx > Templates > ProjectTemplates
  3. Avviate Visual C# e troverete il vostro nuovo modello di progetto bello e pronto!

xxxx ovviamente è la versione del nostro Visual Studio. Il file che scaricherete l’ho creato con Visual C# Express 2008, per cui potreste avere dei problemi ad aprirlo con altre versioni.

Ciao!

P.S: La struttura base del programma che troverete nel template è quella del file Template.cs, scritta originariamente da Paul Aspinall e commentata da me nella guida che ho scritto :)

  • Share/Bookmark

Il Template – Guida SDL.NET

Appena ho visto il file Template.Cs, messo a disposizione da Paul Aspinall sul sito ufficiale di SDL.NET, ho subito trovato questa risorsa decisamente interessante. Dove molto spesso c’è confusione nell’approccio iniziale, questo file mette subito in chiaro tutti i metodi tendenzialmente usati e permette di avere il vantaggio di uno “scheletro” base già pronto.

Ho detto base perchè, volendo partire senza troppe pretese da questo file di certo non realizzeremo Assassin’s Creed 2. Comunque sia, riporto qui di seguito il codice del file per intero commentato, fornendo anche la disponibilità per il download. Buona lettura!

[code]]czozNTEyOlwiDQovL1B1YmxpYyBEb21haW4NCi8vT3JpZ2luYWwgdmVyc2lvbiB3cml0dGVuIGJ5IFBhdWwgQXNwaW5hbGwuDQovL1Z7WyYqJl19ZXJzaW9uZSBjb21tZW50YXRhIGRhIEZyYW5jZXNjbyBNYWxhdGVzdGEgaW4gSXRhbGlhbm8gOikNCg0KLy8gRGlyZXR0aXZlIHVzaXtbJiomXX1uZyBwZXIgbFwnaW5jbHVzaW9uZSBkZWkgbmFtZXNwYWNlIGludGVyZXNzYXRpLg0KdXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLntbJiomXX1EcmF3aW5nOw0KDQp1c2luZyBTZGxEb3ROZXQuQ29yZTsNCnVzaW5nIFNkbERvdE5ldC5HcmFwaGljczsNCnVzaW5nIFNkbERvdE5le1smKiZdfXQuSW5wdXQ7DQoNCm5hbWVzcGFjZSBTZGxEb3ROZXRFeGFtcGxlcy5TbWFsbERlbW9zDQp7DQogICAgcHVibGljIGNsYXNzIFRlbXB7WyYqJl19bGF0ZQ0KICAgIHsNCiAgICAgICAgLyoNCiAgICAgICAgICogUXVlc3RvIG1ldG9kbyBiYXNlIMOoIHN0YXRpY28gZWQgw6ggaWwgcHtbJiomXX11bnRvIGRcJ2luZ3Jlc3NvIG5lbGxhIG5vc3RyYSBhcHBsaWNhemlvbmUuIERhIHF1aSwgaW5mYXR0aSwNCiAgICAgICAgICogZGljaHtbJiomXX1pYXJlcmVtbyB1bmEgbnVvdmEgdmFyaWFiaWxlIGRpIHRpcG8gVGVtcGxhdGUgZWQgZXNlZ3VpcmVtbyBpbCBtZXRvZG8gR28uDQoge1smKiZdfSAgICAgICAgKi8NCiAgICAgICAgW1NUQVRocmVhZF0NCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQ0KICAgICAgICB7WyYqJl19ew0KICAgICAgICAgICAgVGVtcGxhdGUgZ2FtZSA9IG5ldyBUZW1wbGF0ZSgpOw0KICAgICAgICAgICAgZ2FtZS5HbygpOw0KICAgIHtbJiomXX0gICAgfQ0KDQogICAgICAgIC8qDQogICAgICAgICAqIElsIGNvc3RydXR0b3JlIFRlbXBsYXRlIGF0dHVhbG1lbnRlIMOoIHZ1b3Rve1smKiZdfSBtYSBnZW5lcmFsbWVudGUgw6ggbW9sdG8gdXRpbGUgcGVyIGluaXppYWxpenphcmUgdmFyaWFiaWxpDQogICAgICAgICAqIGNoZSB7WyYqJl19dmVycmFubm8gc3VjY2Vzc2l2YW1lbnRlIHVzYXRlIG5lbCBnaW9jby4NCiAgICAgICAgICovDQogICAgICAgIHB1YmxpYyBUZW1wbHtbJiomXX1hdGUoKQ0KICAgICAgICB7DQogICAgICAgIH0NCiAgICAgICAgLyoNCiAgICAgICAgICogSWwgbWV0b2RvIEdvLCBpbiBxdWVzdG8ge1smKiZdfWNhc28sIGRlZmluaXNjZSBsYSByaXNvbHV6aW9uZSBkZWxsYSBmaW5lc3RyYSBkaSBnaW9jbyAoODAwIHggNjAwKSBlIGF2dmlhIGl7WyYqJl19bCBtZXRvZG8NCiAgICAgICAgICogQWRkSGFuZGxlcnMsIGNoZSBhbmFsaXp6ZXJlbW8gdHJhIHBvY28uIEluIHVsdGltbywgaW5vbHtbJiomXX10cmUsIGxhbmNpYSBpbCBtZXRvZG8gRXZlbnRzLlJ1bigpLCBmYWNlbmRvIHBhcnRpcmUNCiAgICAgICAgICogaW4gcXVlc3RvIG1ve1smKiZdfWRvIGlsIExvb3AgcHJpbmNpcGFsZSBkZWwgZ2lvY28uDQogICAgICAgICAqLw0KICAgICAgICBwdWJsaWMgdm9pZCBHbygpDQogICB7WyYqJl19ICAgICB7DQogICAgICAgICAgICBWaWRlby5TZXRWaWRlb01vZGUoODAwLCA2MDApOw0KICAgICAgICAgICAgdGhpcy5BZGRIYW5kbHtbJiomXX1lcnMoKTsNCiAgICAgICAgICAgIEV2ZW50cy5SdW4oKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qDQogICAgICAgICAqIEFkZEhhe1smKiZdfW5kbGVycyDDqCB1biBtZXRvZG8gY2hlIHNpIG9jY3VwYSBkaSBnZXN0aXJlIGlsIHNpc3RlbWEgYWQgZXZlbnRpLCBkZWZpbmVuZG97WyYqJl19IGNvbiBmYWNpbGl0w6AgdHV0dGkgcXVlbGxpDQogICAgICAgICAqIGNoZSBkb3ZyYW5ubyBlc3NlcmUgY29udGVtcGxhdGkgZGFsIHtbJiomXX1ub3N0cm8gcHJvZ3JhbW1hLiBJbiBxdWVzdG8gY2FzbyBhYmJpYW1vIGFnZ2l1bnRvIGRlZ2xpIEhhbmRsZXIgcGVyDQogICAgICAge1smKiZdfSAgKiBsXCdldmVudG8gUXVpdCAodXNjaXRhIGRhbCBwcm9ncmFtbWEpIGUgVGljayAoZXZlbnRvIGNoZSBzaSBwcmVzZW50YSBhZCBve1smKiZdfWduaSBmcmFtZSkuDQogICAgICAgICAqLw0KICAgICAgICBwcml2YXRlIHZvaWQgQWRkSGFuZGxlcnMoKQ0KICAgICAgICB7DQogICB7WyYqJl19ICAgICAgICAgRXZlbnRzLlF1aXQgKz0gbmV3IEV2ZW50SGFuZGxlcjxRdWl0RXZlbnRBcmdzPih0aGlzLkV2ZW50c19RdWl0KTsNCntbJiomXX0gICAgICAgICAgICBFdmVudHMuVGljayArPSBuZXcgRXZlbnRIYW5kbGVyPFRpY2tFdmVudEFyZ3M+KHRoaXMuRXZlbnRzX1RpY2spe1smKiZdfTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qDQogICAgICAgICAqIFJlbW92ZUhhbmRsZXJzKCkgdG9nbGllIHF1ZWxsbyBjaGUgQWR7WyYqJl19ZEhhbmRsZXJzKCkgYXZldmEgYWdnaXVudG86IHZlbmdvbm8gcmltb3NzaSBnbGkgSGFuZGxlciBhaSB2YXJpIGV2ZW50aQ0KICAgIHtbJiomXX0gICAgICogZSwgY29tZSB2ZWRyZW1vIHN1Y2Nlc3NpdmFtZW50ZSwgcXVlc3RvIG1ldG9kbyB2aWVuZSB1dGlsaXp6YXRvIGluIGZhe1smKiZdfXNlIGRpIHVzY2l0YSBkYWwgZ2lvY28uDQogICAgICAgICAqLw0KICAgICAgICBwcml2YXRlIHZvaWQgUmVtb3ZlSGFuZGxlcnMoKQ17WyYqJl19CiAgICAgICAgew0KICAgICAgICAgICAgRXZlbnRzLlF1aXQgLT0gbmV3IEV2ZW50SGFuZGxlcjxRdWl0RXZlbnRBcmdzPih0aGlzLntbJiomXX1FdmVudHNfUXVpdCk7DQogICAgICAgICAgICBFdmVudHMuVGljayAtPSBuZXcgRXZlbnRIYW5kbGVyPFRpY2tFdmVudEFyZ3M+KHRoe1smKiZdfWlzLkV2ZW50c19UaWNrKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qDQogICAgICAgICAqIEV2ZW50c19UaWNrIMOoIGlsIG1ldG97WyYqJl19ZG8gY29udGVtcGxhdG8gcGVyIGxcJ2V2ZW50byBUaWNrOiBxdWVsbG8gY2hlIGZhIMOoIHNlbXBsaWNlLiBJbml6aWFsbWVudGUgcml7WyYqJl19ZW1waWUNCiAgICAgICAgICogbGEgZmluZXN0cmEgZGkgYmx1ZSwgdHJhbWl0ZSBpbCBtZXRvZG8gRmlsbCBkZWxsYSBTdXJmYWNlIHtbJiomXX1TY3JlZW4uIFN1Y2Nlc3NpdmFtZW50ZSBhZ2dpb3JuYSBpbCB0dXR0byB0cmFtaXRlDQogICAgICAgICAqIGlsIG1ldG9kbyBVcGRhe1smKiZdfXRlKCksIHByb3Z2ZWRlbmRvIGluIHF1ZXN0byBtb2RvIGEgbWFuZGFyZSBzdWxsbyBzY2hlcm1vIGkgcmlzdWx0YXRpIGRlbGxcJ2Vse1smKiZdfWFib3JhemlvbmUuDQogICAgICAgICAqLw0KICAgICAgICBwcml2YXRlIHZvaWQgRXZlbnRzX1RpY2sob2JqZWN0IHNlbmRlciwgVGl7WyYqJl19Y2tFdmVudEFyZ3MgZSkNCiAgICAgICAgew0KICAgICAgICAgICAgVmlkZW8uU2NyZWVuLkZpbGwoU3lzdGVtLkRyYXdpbmcuQ29sb3tbJiomXX1yLkJsdWUpOw0KICAgICAgICAgICAgVmlkZW8uU2NyZWVuLlVwZGF0ZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgLyoNCiAgICAge1smKiZdfSAgICAqIENvbWUgZ2nDoCBkZXR0byBwcmVjZWRlbnRlbWVudGUsIEV2ZW50c19RdWl0IHByb3Z2ZWRlIGEgcmltdW92ZXJlIGkgdmF7WyYqJl19cmkgRXZlbnRIYW5kbGVycyB0cmFtaXRlIGlsIG1ldG9kbw0KICAgICAgICAgKiBSZW1vdmVIYW5kbGVycygpIGUgc3VjY2Vzc2l2YXtbJiomXX1tZW50ZSBlc2NlIGRhbCBwcm9ncmFtbWEsIHRyYW1pdGUgaWwgbWV0b2RvIEV2ZW50cy5RdWl0QXBwbGljYXRpb24oKS4NCiAgICAge1smKiZdfSAgICAqLw0KICAgICAgICBwcml2YXRlIHZvaWQgRXZlbnRzX1F1aXQob2JqZWN0IHNlbmRlciwgUXVpdEV2ZW50QXJncyBlKQ0KICB7WyYqJl19ICAgICAgew0KICAgICAgICAgICAgUmVtb3ZlSGFuZGxlcnMoKTsNCiAgICAgICAgICAgIEV2ZW50cy5RdWl0QXBwbGljYXRpb24oKXtbJiomXX07DQogICAgICAgIH0NCiAgICB9DQp9DQpcIjt7WyYqJl19[[/code]

Scarica il file Template.cs

  • Share/Bookmark

Input – Mouse e Tastiera – Guida SDL.NET

Ora cambiamo un po argomento. Abbiamo visto tutto (o quasi) ciò che poteva riguardare l’output: abbiamo imparato a caricare un immagine sullo schermo, come renderla trasparente, come caricare un font e scriverci qualcosa ed anche aprire un file audio per usare un effetto sonoro nei nostri programmi.

Sapete bene però che un gioco non è solo Output. Un gioco è interazione, un gioco è anche Input. Per cui, adesso inizieremo a guardare le varie alternative che ci vengono proposte per gestire al meglio il modo in cui l’utente interagisce con il nostro gioco. Vi ricordate il sistema degli eventi, che avevo descritto ed introdotto qualche tempo fa? Inizieremo proprio da lì.

Riprendiamo l’esempio dell’Hello World, apportando però qualche modifica al codice:

[code]]czo3OTg6XCINCnVzaW5nIFN5c3RlbTsNCg0KdXNpbmcgU2RsRG90TmV0LkNvcmU7DQp1c2luZyBTZGxEb3ROZXQuR3JhcGhpY3M7DQp7WyYqJl19DQpuYW1lc3BhY2UgU2RsRG90TmV0RXhhbXBsZXMuU21hbGxEZW1vcw0Kew0KICAgIHB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkDQogIHtbJiomXX0gIHsNCiAgICAgICAgW1NUQVRocmVhZF0NCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQ0KICAgICAgICB7DQogICAge1smKiZdfSAgICAgICAgSGVsbG9Xb3JsZCBhcHAgPSBuZXcgSGVsbG9Xb3JsZCgpOw0KICAgICAgICAgICAgYXBwLkdvKCk7DQogICAgICAgIH17WyYqJl19DQoNCiAgICAgICAgcHVibGljIEhlbGxvV29ybGQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBWaWRlby5TZXRWaWRlb01vZGUoNHtbJiomXX0wMCwgMzAwKTsNCiAgICAgICAgICAgIFZpZGVvLldpbmRvd0NhcHRpb24gPSBcIkhlbGxvIFdvcmxkIVwiOw0KICAgICAgICB9DQoNCiB7WyYqJl19ICAgICAgIHB1YmxpYyB2b2lkIEdvKCkNCiAgICAgICAgew0KICAgICAgICAgICAgRXZlbnRzLktleWJvYXJkRG93biArPSBuZXcgRXtbJiomXX12ZW50SGFuZGxlcihFdmVudHNfS2V5Ym9hcmREb3duKTsNCiAgICAgICAgICAgIEV2ZW50cy5SdW4oKTsNCiAgICAgICAgfQ0KDQoge1smKiZdfSAgICAgICB2b2lkIEV2ZW50c19LZXlib2FyZERvd24ob2JqZWN0IHNlbmRlciwgU2RsRG90TmV0LklucHV0LktleWJvYXJkRXZlbnR7WyYqJl19QXJncyBlKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoZS5LZXkgPT0gU2RsRG90TmV0LklucHV0LktleS5Fc2NhcGUpIEV2ZXtbJiomXX1udHMuUXVpdEFwcGxpY2F0aW9uKCk7DQogICAgICAgIH0NCiAgICB9DQp9DQpcIjt7WyYqJl19[[/code]

Dunque, cosa abbiamo di diverso? Sicuramente l'istruzione

Events.KeyboardDown += new EventHandler<SdlDotNet.Input.KeyboardEventArgs>(Events_KeyboardDown);


E... cosa vorrebbe dire?

Semplicemente, che abbiamo gestito l'evento che si verificherà alla pressione di un tasto sulla nostra tastiera.
Ehm... cioè? :)

Spieghiamoci meglio: ogni volta che il nostro giocatore premerà un pulsante sulla tastiera, verrà eseguito il metodo Events_KeyboardDown. Ecco quindi che troviamo il codice del metodo:

void Events_KeyboardDown(object sender, SdlDotNet.Input.KeyboardEventArgs e)

{

if (e.Key == SdlDotNet.Input.Key.Escape) Events.QuitApplication();

}

Come parametri in ingresso passeremo un oggetto sender e un KeyboardEventArgs chiamato “e”. Soprattutto questo sarà importantissimo, come vedremo tra poco. Ed infatti ecco l'istruzione chiave che spiega questo nuovo concetto:

if (e.Key == SdlDotNet.Input.Key.Escape) Events.QuitApplication();

Non è molto difficile da capire: in poche parole qui si dice al nostro caro programma che ogni volta che l'utente premerà il tasto Escape (ESC) il programma dovrà terminare, tramite la chiamata al metodo QuitApplication, già menzionato precedentemente.

Avviando il nostro programma di prova premendo F5, potremo subito verificare i risultati. Premendo Esc, infatti, l'applicazione terminerà facendoci tornare alla schermata del nostro IDE (ho scritto F5 perchè do per scontato l'uso del Visual C# Express, che agevola di molto le cose).

L'oggetto "e" che passiamo, inoltre, offre svariate possibilità grazie alle sue proprietà: la booleana Down, che restituisce true se un tasto è stato premuto. Oppure ancora Unicode ed UnicodeCharacter, che forniscono informazioni sul carattere Unicode rappresentato dal tasto appena premuto. Ciò, quindi, lascia spazio per un buon numero di possibilità e personalizzazioni.

Passiamo ora a dare un occhiata al Mouse: anche in questo caso abbiamo un buon numero di eventi da gestire e metodi pronti da usare per facilitare il nostro lavoro. Un esempio pratico è rappresentato dal codice di seguito.

[code]]czoxNjg0OlwiDQp1c2luZyBTeXN0ZW07DQoNCnVzaW5nIFNkbERvdE5ldC5Db3JlOw0KdXNpbmcgU2RsRG90TmV0LkdyYXBoaWNzOw17WyYqJl19Cg0KbmFtZXNwYWNlIFNkbERvdE5ldEV4YW1wbGVzLlNtYWxsRGVtb3MNCnsNCnB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkDQp7DQpGb3tbJiomXX1udCBmMSA9IG5ldyBGb250KFwiQ2FsaWJyaS50dGZcIiwgMTIpOw0KDQp1c2luZyBTeXN0ZW07DQoNCnVzaW5nIFNkbERvdE5ldC5Db3J7WyYqJl19ZTsNCnVzaW5nIFNkbERvdE5ldC5HcmFwaGljczsNCg0KbmFtZXNwYWNlIFNkbERvdE5ldEV4YW1wbGVzLlNtYWxsRGVtb3MNCnsNCntbJiomXX0gICAgcHVibGljIGNsYXNzIEhlbGxvV29ybGQNCiAgICB7DQogICAgICAgIEZvbnQgZjEgPSBuZXcgRm9udChcIkNhbGlicmkudHRmXCJ7WyYqJl19LCAxMik7DQoNCiAgICAgICAgc3RyaW5nIHBvc2l6aW9uZSA9IFwiXCI7DQoNCiAgICAgICAgW1NUQVRocmVhZF0NCiAgICAgICAgcHVie1smKiZdfWxpYyBzdGF0aWMgdm9pZCBNYWluKCkNCiAgICAgICAgew0KICAgICAgICAgICAgSGVsbG9Xb3JsZCBhcHAgPSBuZXcgSGVsbG9Xb3J7WyYqJl19bGQoKTsNCiAgICAgICAgICAgIGFwcC5HbygpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIEhlbGxvV29ybGQoKQ0KICAgIHtbJiomXX0gICAgew0KICAgICAgICAgICAgVmlkZW8uU2V0VmlkZW9Nb2RlKDQwMCwgMzAwKTsNCiAgICAgICAgICAgIFZpZGVvLldpbmRvd0Nhe1smKiZdfXB0aW9uID0gXCJIZWxsbyBXb3JsZCFcIjsNCiAgICAgICAgfQ0KICAgICAgICBwdWJsaWMgdm9pZCBHbygpDQogICAgICAgIHsNCiAgIHtbJiomXX0gICAgICAgICBFdmVudHMuS2V5Ym9hcmREb3duICs9IG5ldyBFdmVudEhhbmRsZXIoRXZlbnRzX0tleWJvYXJkRG93bik7DQogICAge1smKiZdfSAgICAgICAgRXZlbnRzLk1vdXNlTW90aW9uICs9IG5ldyBFdmVudEhhbmRsZXIoRXZlbnRzX01vdXNlTW90aW9uKTsNCiAgICAgICB7WyYqJl19ICAgICBFdmVudHMuVGljayArPSBuZXcgRXZlbnRIYW5kbGVyKEV2ZW50c19UaWNrKTsNCiAgICAgICAgICAgIEV2ZW50cy5SdW4oKXtbJiomXX07DQogICAgICAgIH0NCg0KICAgICAgICB2b2lkIEV2ZW50c19UaWNrKG9iamVjdCBzZW5kZXIsIFRpY2tFdmVudEFyZ3MgZSkNCiAge1smKiZdfSAgICAgIHsNCiAgICAgICAgICAgIFZpZGVvLlNjcmVlbi5GaWxsKFN5c3RlbS5EcmF3aW5nLkNvbG9yLkJsYWNrKTsNCiAgICAgICB7WyYqJl19ICAgICBWaWRlby5TY3JlZW4uQmxpdChmMS5SZW5kZXIocG9zaXppb25lLCBTeXN0ZW0uRHJhd2luZy5Db2xvci5XaGl0ZSksIG5ld3tbJiomXX0gU3lzdGVtLkRyYXdpbmcuUG9pbnQoMjAsIDIwKSk7DQogICAgICAgICAgICBWaWRlby5TY3JlZW4uVXBkYXRlKCk7DQogICAgICAge1smKiZdfSB9DQoNCiAgICAgICAgdm9pZCBFdmVudHNfTW91c2VNb3Rpb24ob2JqZWN0IHNlbmRlciwgU2RsRG90TmV0LklucHV0Lk1vdXNlTW97WyYqJl19dGlvbkV2ZW50QXJncyBlKQ0KICAgICAgICB7DQogICAgICAgICAgICBwb3NpemlvbmUgPSBcIk1vdXNlIC0gWDogXCIgKyBlLlkuVG9Te1smKiZdfXRyaW5nKCkgKyBcIiwgWTogXCIgKyBlLlguVG9TdHJpbmcoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZvaWQgRXZlbnRzX0tleWJvYXtbJiomXX1yZERvd24ob2JqZWN0IHNlbmRlciwgU2RsRG90TmV0LklucHV0LktleWJvYXJkRXZlbnRBcmdzIGUpDQogICAgICAgIHsNCiAgICAge1smKiZdfSAgICAgICBpZiAoZS5LZXkgPT0gU2RsRG90TmV0LklucHV0LktleS5Fc2NhcGUpIEV2ZW50cy5RdWl0QXBwbGljYXRpb24oKTsNCiB7WyYqJl19ICAgICAgIH0NCiAgICB9DQp9DQpcIjt7WyYqJl19[[/code]
Qui cosa abbiamo fatto? Andiamo con ordine. L'obiettivo di questo programma non è niente di eccezionale: leggendo ogni spostamento del mouse, riportiamo a schermo le sue coordinate. Queste saranno memorizzate in una stringa che verrà utilizzata con un font.

Ecco che dichiariamo la nostra stringa (inizialmente vuota) “posizione” e il nostro font f1(ricordate che il file del carattere da utilizzare dovrà essere ubicato nella stessa cartella dell'eseguibile che compileremo):

Font f1 = new Font("Calibri.ttf", 12);

string posizione = "";

Adesso andiamo a gestire l'evento relativo al movimento del mouse, che si chiama MouseMotion:

public void Go()

{

Events.KeyboardDown += new EventHandler<SdlDotNet.Input.KeyboardEventArgs>(Events_KeyboardDown);

Events.MouseMotion += new EventHandler<SdlDotNet.Input.MouseMotionEventArgs>(Events_MouseMotion);

Events.Tick += new EventHandler<TickEventArgs>(Events_Tick);

Events.Run();

}

Il metodo che lanceremo per gestire la procedura sarà Events_MouseMotion. Il nome è creato automaticamente dal sistema, ma potete crearne uno direttamente voi. L'ho fatto per comodità e per il fatto che viene generato al volo dall'Intellisense del Visual Studio, alla semplice pressione del tasto Tab. Comunque, ecco il nostro codice:

void Events_MouseMotion(object sender, SdlDotNet.Input.MouseMotionEventArgs e)

{

posizione = "Mouse - X: " + e.X.ToString() + ", Y: " + e.Y.ToString();

}

Anche stavolta abbiamo un oggetto sender ed uno “e”, stavolta però di tipo MouseMotionEventArgs. Quindi, cosa fa questo metodo? Semplicemente, ogni volta che il sistema rileva uno spostamento del mouse assegneremo alla stringa “posizione” i valori di X ed Y che il mouse assume in quel momento. Finchè il mouse non verrà mosso, i valori non cambieranno ulteriormente.

Una schermata del programma di Prova.

Una schermata del programma di Prova.

Occorre anche in questo caso fare una bella scarrellata di proprietà che ci vengono messe a disposizione dall'oggetto “e”. Non le riporto tutte ovviamente, ma solo alcune:

  • X ed Y: due proprietà che indicano la posizione sull'asse X ed Y del mouse allo stato attuale del sistema;
  • Button: restituisce il nome del pulsante del mouse attualmente premuto usando come valori possibili l'enumerazione Input.MouseButton;
  • ButtonPressed: booleana che restituisce True nel caso un pulsante sia stato premuto.

Questi strumenti permettono di gestire al meglio l'input da parte dell'utente, sfruttando le potenzialità del classico metodo “mouse più tastiera” tipico della grande maggioranza di giochi in circolazione negli ultimi anni.

Spero di essere stato chiaro in queste spiegazioni. Vi consiglio assolutamente di fare molte prove e, come già detto precedentemente, sperimentare per bene il sistema ad eventi se non lo si è capito bene. Specialmente adesso, forti di queste nuove piccole nozioni. Con queste basi, molto presto saremo pronti ad affrontare la creazione di un piccolo gioco vero e proprio.

Alla prossima!

  • Share/Bookmark