Il presente articolo è stato tradotto automaticamente.

Going posizioni

Gioco nella chiave di Zune

Mike Calligaro

Contenuto

Uomo, che C È sharp
Anatomia di un gioco
Sprite raggruppati in polvere di Pixie
I nomi di cespiti e chiavi di colore
Ya risposta sposta in riproduzione
Sprite in una casella
Bing Bang boom
Avanzate disegno
Il resto È su A È

Il figlio che è stato esecuzione Xbox dall'ha tre, è stato avviato con un interesse nella programmazione, in particolare la scrittura di giochi. Questo richiesto mi scaricare XNA Game Studio e nel manuale, si conosce, in modo che Impossibile adattare lui. Che è sempre volevo scrivere i proprio giochi era non con esso. In realtà.

XNA Game Studio 3.0 aggiunto la possibilità di scrivere giochi per Zune, ovvero il Zune ora una piattaforma di sviluppo mobile. Pertanto è notevole,, gioco per un articolo Going posizioni. Se sei già un sviluppatore XNA, potrebbero essere verificare alcuni concetti che è già comprendere. Tuttavia, se sei come me, leggere i programmatori che enthusiastic sull'ma piuttosto familiarità con lo sviluppo dei giochi.

Uomo, che C È sharp

Per la maggior parte della mia carriera di quindici anno in Microsoft è stato uno sviluppatore di sistemi e i driver. La lingua di scelta e necessità è stata una piuttosto vasta bones c ++. VIENE visualizzato raramente consente di runtime MFC e Microsoft .NET Framework. Fino a quando non recente, Impossibile disporre anche digitato STL molto meno modificate utilizzare.

Questo è il processo di giorno. Ma nel mio tempo fuori Adoro riproduzione intorno a C#. Principalmente scrivere applicazioni piccolo per i dispositivi Windows Mobile e in alcuni casi per PC. C ++ non considera avviene per molti sviluppatori nativi, ma È ancora viene visualizzato un po'giddy quando viene scritto in C# me. È possibile ottenere molto con poche righe di codice. C# imprecare è così tanta divertente deve rendono è un sostanza controlled.

Nel divertimento XNA Game Studio categoria è simile a C# in steroids. Il team in tale posizione è eseguito un processo può di facile lo sviluppo dei giochi. Il framework è semplice, contenuti hardware gran parte sono gestiti per l'utente e sono state rilasciate una tonnellata di esempi in cui l'obiettivo a insegnare i vari aspetti dello sviluppo dei giochi.

Avviare in creators.xna.com. Da qui è possibile scaricare il libero XNA Game Studio 3.0. Se è già utilizzare uno delle varie versioni di Visual Studio 2008, XNA Game Studio verrà integrare con esso. Se non si dispone di Visual Studio 2008, non fret. XNA Game Studio funziona anche con il gratuito Visual C# Express Edition. (In altre parole, anche se è possibile parlare di Visual Studio, è possibile sostituire Visual C# Express Edition se ciò che si sta utilizzando.)

Il sito Web di creators.xna.com anche è di per passare informazioni grande. Fare clic sul collegamento formazione nella parte superiore della pagina per trovare le guide di principiante, esempi e come - della. È la documentazione che Ottiene installata con XNA Game Studio è particolarmente valido "di principiante guide per giochi 2D". In alcuni casi, la documentazione di installazione contiene informazioni che non è sul Web. In Visual studio, è possibile ottenere tale documentazione selezionando Guida | sommario e impostando il filtro a XNA Game Studio 3.0.

XNA Game Studio consente di scrivere un codice di base e distribuirlo in Xbox, PC e Zune. Tutto ciò che qui funzionerà in tutte le piattaforme tre. Il download gratuito sono tutti che necessari per lo sviluppo per PC o Zune, ma lo sviluppo di Xbox richiede un abbonamento Premium che i costi di una tariffa annua.

Anatomia di un gioco

Dopo che è stato ottenuto 3.0 Studio gioco XNA installato, è possibile creare un gioco di Hello World per Zune selezionando file | nuovo | progetto. Quindi selezionare Visual C# | XNA Game Studio 3.0 fare clic su giochi Zune (3.0). Mentre il programma che verrà generato non effettivamente pronuncia Hello World, controllo input, disegnare lo sfondo blu e uscire da su richiesta.

Se è previsto qualcosa di complicato in realtà si è in per una sorpresa ottimale. Gli importi di tutta l'infrastruttura gioco a circa venti righe di codice distribuito funzioni su sei. Ecco una descrizione di tali funzioni.

Il costruttore è solo un diversi standard e giardino C# oggetto costruttore. Considerarlo lo stesso come si farebbe altro uno.

Inizializzazione viene chiamato dopo il costruttore termina. Consente di eseguire ulteriori inizializzazione, soprattutto per operazioni riguardanti il sistema di grafica.

LoadContent viene chiamato dopo l'inizializzazione e viene cui Carica immagini e suoni.

UnloadContent viene chiamato in uscita gioco e consente di scaricare il contenuto. Ma, poiché lo scaricamento della maggior parte delle immagini e file audio viene gestito per l'utente, in genere non è necessario effettuare alcuna operazione qui.

Aggiornamento è probabilmente la posizione in cui è lo sviluppo dei giochi diverso più dallo sviluppo di applicazioni normale. Invece di un ciclo di messaggi, i giochi regolarmente polling input, calcolo da eseguire con tale e quindi disegnare il risultato di questi calcoli. La maggior parte delle che si verifica in Update, in modo che questo sia in cui verrà live la maggior parte del codice.

Disegno viene chiamato dopo ogni aggiornamento e viene in cui è possibile disegnare le immagini.

Si tratta. Anche se il programma è troppo breve, Avvia, disegna la schermata blu legge input e viene terminata quando si sarà scelto il pulsante Indietro. Che cos'è che? Ha si ritiene che lo sviluppo dei giochi potrebbe essere difficile? Non a XNA Game Studio.

Sprite raggruppati in polvere di Pixie

Che era semplice, ma uno sfondo blu chiusura non per un gioco interessante. Le immagini effettive è necessario se si prevede che un gioco. Per fortuna, inserimento immagini sullo schermo è difficile.

In un minuto verrà per visualizzare il codice, ma prima è necessario caricare un'immagine nel progetto. In Visual Studio, è necessario disporre di una finestra di Esplora soluzioni (in caso contrario, puoi trovarlo nel menu Visualizza). In Esplora soluzioni, fare clic con il pulsante destro del mouse sul contenuto e scegliere Aggiungi | elemento esistente. Da qui è possibile selezionare qualsiasi file di immagine BMP, JPG, PNG, .TGA o .DDS.

Seguito si presuppone una fotografia di un utente denominato player.jpg e che è stato appena aggiunto al contenuto. La figura 1 mostra il codice per visualizzare tale immagine sullo schermo.

Figura 1 visualizzazione di un'immagine

// Add these member variables
Texture2D texture;
Vector2 position;

// Add this line to the constructor
position = new Vector2(100, 100);

// Add this line to LoadContent()
texture = Content.Load<Texture2D>("player");

// And add these lines to Draw();
spriteBatch.Begin();
spriteBatch.Draw(texture, position, Color.White);
// (Draw the rest of your sprites)
spriteBatch.End();

Prima che è possibile descrivere le righe, verranno fornite gergo. XNA Game Studio avviato come un sistema di sviluppo per la Xbox. Di conseguenza, sia tutte basato su grafica 3D. Giochi 2D (e, poiché il Zune non ha un renderer 3D, è necessario eseguire i giochi 2D) sono giochi 3D effettivamente dove tutto ciò che è effettivamente sottile. Pertanto si vedrà termini 3D sprinkled attorno al codice. Ad esempio, mentre sprite è il termine di un'immagine in un gioco 2D normale, la trama di parola deriva dal gioco 3D. Quanto XNA Game Studio riguarda, sprite sono effettivamente sottili rettangoli 3D con trame mappate a essi.

La funzione Content.Load accetta un nome di cespiti, ovvero in base all'impostazione predefinita il nome di file senza l'estensione. Poiché è possibile caricare un'immagine denominata player.jpg, passata la stringa coinvolta Content.Load. Nella funzione LoadContent, si scoprirà che c'già una linea che alloca un SpriteBatch. Tutti i disegni avviene con questo SpriteBatch. Nella funzione di disegno, indicare il SpriteBatch che sta per iniziare, disegnare tutti gli sprite e quindi indicare è che avere.

La variabile membro della posizione è un vettore di struttura che contiene la x e la posizione y in cui si desidera sprite da disegnare. Nell'esempio, utilizzato posizione di pixel (100, 100). Il colore è una tinta che è possibile aggiungere i sprite. Utilizzo bianco lascia l'immagine invariato.

Era pertanto, per ottenere un'immagine sullo schermo, è solo necessario caricare la trama e indicare il batch di sprite per disegnare. La prima immagine ha fondamentalmente quattro righe di codice e ciascuno di essi successive richiede più di due.

I nomi di cespiti e chiavi di colore

Probabilmente, a questo punto si sta osservando l'immagine del giocatore sullo schermo e pensare che questo non è così difficile. Ma forse non si è soddisfatti completamente. Cosa succede se non è quello che il codice deve utilizzare il nome di file dell'immagine? E, cosa più importante, cosa accade se l'immagine sia caricata è rettangolare, ma il lettore non? Come è possibile disegnare solo il lettore e non lo sfondo

Per rispondere entrambe queste domande, è necessario esaminare le proprietà per l'immagine che sia caricata. Tornare alla Esplora soluzioni e fare clic con il pulsante destro del mouse sul file (in questo esempio, player.jpg). Scegliere Proprietà. Verrà visualizzato un riquadro delle proprietà sotto Esplora soluzioni, fornendo una quantità elevata di informazioni utili. Osservare innanzitutto nome cespiti. Questo è il nome passato a Content.Load. Se si desidera rendere un valore diverso dal nome del file, modificarlo qui.

Espandere ora processore contenuto facendo clic sul leggermente + a sinistra del nome. La proprietà che interessano è il colore di chiave di colore. Qualsiasi pixel cui colore corrisponde alla chiave di colore dovrà essere trasparente. Ecco come rendere un'immagine rettangolare e rimuovere lo sfondo. Pertanto, per eliminare il sprite dello sfondo, modificare il colore o modificare il colore chiave impostazione in modo che corrispondano. L'impostazione predefinita, viene inserito i valori di rosso, verde, blu e alfa di 255, 0, 255, 255, ossia fucsia.

Ya risposta sposta in riproduzione

Certamente uno sprite solo su sfondo blu non intende essere grande ora in gioco. Minime, è necessario l'utente sia in grado di spostare tale sprite qualche modo. E, a tale scopo, è necessario sapere che cosa si desidera eseguire. Se la funzione Aggiorna stato esaminato nel programma, è probabilmente già un'idea come effettuare questa operazione. Il codice predefinito legge l'input e termina se viene premuto il tasto Indietro. Sfortunatamente, sono di tipo monopolized l'input. Necessario modificare diversi elementi un bit consentono di utilizzare l'input.

Ecco le informazioni attualmente disponibili:

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == 
    ButtonState.Pressed)
    this.Exit();

Suggerisco modifica simile al seguente:

GamePadState input = 
    GamePad.GetState(PlayerIndex.One);
if (input.Buttons.Back == ButtonState.Pressed)
    this.Exit();

Ora è possibile utilizzare la variabile di input per esaminare l'input dell'utente. Si noti che input è un GamePadState. Considerare la Zune input come un game pad a Xbox alcuni dei pulsanti è mancante. Nella figura 2 fornisce l'elenco completo di mapping per i pulsanti del Zune.

Nella figura 2 pulsante Zune mapping
Pulsante Mapping
Eseguire il backup GamePadState.Buttons.Back
Riproduzione/pausa GamePadState.Buttons.B
Centro DPad GamePadState.Buttons.A
Bordi DPad GamePadState.DPad
Variabile nel ZunePad GamePadState.Thumbsticks.Left
Facendo clic sul ZunePad GamePadState.Buttons.LeftShoulder

Assicurarsi pertanto si completata, il lettore spostare. Il codice nella Figura 3 vengono illustrate sia DPad ZunePad input, in modo che funzionino in qualsiasi Zune. (Zunes originale non dispongono di funzionalità il ZunePad).

Nella figura 3 supporto di spostamento

// add these lines to Update()
const int c_speedScalar = 100;
Vector2 speed = Vector2.Zero;

speed.X = input.ThumbSticks.Left.X * c_speedScalar;
speed.Y = input.ThumbSticks.Left.Y * c_speedScalar * -1;

if (input.DPad.Left == ButtonState.Pressed)
    speed.X -= c_speedScalar;
else if (input.DPad.Right == ButtonState.Pressed)
    speed.Y += c_speedScalar;

if (input.DPad.Up == ButtonState.Pressed)
    speed.Y -= c_speedScalar;
else if (input.DPad.Down == ButtonState.Pressed)
    speed.Y += c_speedScalar;

position += speed * (float)gameTime.ElapsedGameTime.TotalSeconds;

Tenere presente che la routine di disegno è disegno il lettore nella posizione specificata dalla variabile membro di posizione. Pertanto, per spostare lo sprite, a scopo è sufficiente aggiornare tale percorso.

La parte realmente elaborata in seguito è l'ultima riga in cui è possibile modificare la posizione. La Xbox prevede funzionalità di grafica più complessa rispetto Zune, la routine di aggiornamento viene chiamato più di frequente. In altre parole, ha un framerate superiore. In tal caso che è necessario verificare movimento indipendenti l'framerate. A tale scopo, utilizzare l'input per calcolare una velocità, non una posizione. Convertire la velocità in una posizione moltiplicando per il periodo di tempo trascorsa dall'ultima chiamata a Update.

Sprite in una casella

Tutti gli utenti possono spostare. Il trucco è sapere quando interrompere.

Se la partita sarà interessante, sarà necessario conoscere quando crea uno sprite un conflitto con un'altra. Termini dello sviluppatore gioco elaborata per questo sono rilevamento del conflitto e la più semplice per eseguire il rilevamento di conflitti in XNA Game Studio consiste nell'utilizzare un oggetto denominato un BoundingBox. In sostanza, è disposto caselle invisibili gli oggetti e quindi verificare se una delle tali caselle si intersecano tra loro.

Oltre dal gioco corrente da minore interessante, il problema principale è che lo sprite possibile spostare fuori dello schermo. Correggere seguito che. Ogni volta che lo sprite visitate un bordo, è necessario rendono tornare alla posizione (100, 100).

È necessario innanzitutto una casella di delimitazione per la schermata:

// Add this member variable
BoundingBox bbScreen;

// Add these lines to Initialize() 
Vector3 min = new Vector3(0, 0, 0);
Vector3 max = new Vector3(graphics.GraphicsDevice.Viewport.Width,
    graphics.GraphicsDevice.Viewport.Height, 0);
bbScreen = new BoundingBox(min, max);

C'è un po'di chiave in questo campo, ma non molto complicato chiave. Il framework di Hello World assegnato una variabile membro denominata elementi grafici che contiene la larghezza e altezza dello schermo gioco. È possibile impostare l'angolo superiore sinistro del riquadro l'angolo in alto a sinistra dello schermo e l'angolo inferiore destro del riquadro visualizzato intorno all'angolo inferiore destro dello schermo. BoundingBoxes richiedono vettori 3D, quindi impostare le coordinate z su 0.

Ora possibile creare una casella per lo sprite in questo modo:

// Add these lines to Update() after 
// the position has been calculated.
Vector3 min = 
    new Vector3((int)position.X, (int)position.Y, 0);
Vector3 max = 
    new Vector3((int)position.X + texture.Width - 1,
    (int)position.Y + texture.Height - 1, 0);
BoundingBox bb = new BoundingBox(min, max);

Infine, passiamo a esaminare se lo sprite è contenuto interamente nella schermata. In caso contrario, deve avere visite un bordo. Aggiungere queste righe direttamente sotto quelle aggiunte in precedenza:

ContainmentType ct = bbScreen.Contains(bb);
if (ct != ContainmentType.Contains)
    position = new Vector2(100, 100);

Ora lo sprite verrà passare nuovamente a (100, 100) ogni volta che accede bordo dello schermo. È, ovviamente, deve probabilmente eseguire un'operazione più intelligente, ad esempio interrompere o piegare su altro lato.

Colliding rispetto al bordo della finestra è leggermente diversa da colliding con un altro oggetto. La situazione normale è che si all'interno dello schermo, ma all'esterno di altri oggetti. Pertanto, per verificare la presenza di un conflitto con il bordo dello schermo, si desidera visualizzare se casella sullo schermo contiene si. Ma se si desidera verificare un conflitto con un altro oggetto, si desidera vedere se casella quell'oggetto interseca con te. A tal fine, l'oggetto BoundingBox ha una funzione membro intersects. Interseca restituisce un bool è true quando si intersecano due caselle. Utilizzare intersects se si desidera verificare se gli sprite due accessi al loro.

Bing Bang boom

Si è ora una tecnologia lontano da scrivere proprio giochi. È possibile disegnare immagini, spostarli in risposta all'input dell'utente nonché agire su di essi in esecuzione in tra loro. Poiché si tratta di un gioco, probabilmente si desidera un conflitto di sprite alla fine di un notevole esplosione. Si conosce già come disegnare l'esplosione, ma non verrà effettivamente soddisfacente a meno che non rattle troppo altoparlanti il lettore. Fortunatamente, riproduzione di suoni è ancora più semplice di sprite.

In primo luogo, è necessario aggiungere un suono al progetto. Di seguito il processo è simile all'aggiunta di un'immagine. Per Esplora soluzioni, fare clic con il pulsante destro del mouse sul contenuto e scegliere Aggiungi | elemento esistente. Da qui è possibile scegliere un file wav, WMA, MP3 o .xap. Inoltre, come file immagine, se si desidera che un nome di cespite diverso dal nome del file è possibile modificarlo nelle proprietà.

Ora si tale suono. Nel codice si presuppone che il file che è stato caricato è explode.wav:

// Add this member variable
SoundEffect sndBoom;

// Add these lines to LoadContent()
ContentManager contentManager = 
    new ContentManager(Services, "Content");
sndBoom = 
    contentManager.Load<SoundEffect>("explode");

// Add these lines to Update()
if (input.Buttons.B == ButtonState.Pressed)
    sndBoom.Play();

La chiamata contentManager.Load è simile alla funzione utilizzato per caricare trama il sprite. Quindi, come si notare, quando si desidera ascoltare il suono solo Esegui. Si noti che, come scritti, questo codice verrà tenta di riprodurre un suono di nuovo ogni frame mentre viene premuto il pulsante B. Seconda la lunghezza del suono, ciò potrebbe causare troppe copie di è la riproduzione e la partita generando un'eccezione. È necessario impedire che riproducendo una sola volta per ogni pressione del pulsante. Il classico per tale scopo consiste nell'archiviare lo stato precedente dell'input e agire solo quando lo stato di modifica.

Avanzate disegno

È stato ottenuto ora gli strumenti di base che necessari per creare il proprio giochi. Suggerisco che richiedere alcuni minuti per riprodurre con tali strumenti e comprenderà con essi. Quando si è pronti per ulteriori informazioni, è possibile leggere questa sezione per una breve introduzione alle idee avanzate. I documenti della Guida in linea per queste funzioni fornirà tutto ciò che serve per utilizzarli.

In primo luogo, si parla nell'ordine Z. Come il codice attualmente è, se si sovrappongono due sprite, quella disegnata è l'ultimo corrisponderà in primo piano. Questo è un tipo di problemi. Un quantità metodo migliore è per assegnare una variabile che indica l'ordine in cui deve essere creato ogni sprite. A tale scopo, è necessario utilizzare le versioni più complesse di spriteBatch.Begin e spriteBatch.Draw, in questo modo:

spriteBatch.Begin(
    SpriteBlendMode.AlphaBlend, 
    SpriteSortMode.BackToFront, 
    SaveStateMode.None);
spriteBatch.Draw(texture, position, 
    null, Color.White, 0, Vector2.Zero, 
    1.0F, SpriteEffects.None, zOrder);

Dedicare alcuni minuti alla documentazione relativa SpriteBatch e provare. Queste funzioni sono un po'complicate, ma sono anche molto potente. Ad esempio, se si desidera modificare le dimensioni dei sprite, è possibile utilizzare un rettangolo invece di un vettore per la posizione. Se i limiti del rettangolo sono diverse rispetto alle dimensioni della trama, XNA Game Studio verrà adattata per consentire automaticamente. Se la trama dispone di più immagini che si desidera spostarsi tra, è possibile passare un rettangolo di origine che specifica quale parte della trama per disegnare.

Se si desidera uno sprite semitrasparente, modificare il valore alfa del colore che si passa a disegnare:

Color trans = new Color(
    Color.White.R, Color.White.G, 
    Color.White.B, 128);

Passaggio di trasporto per disegnare anziché Color.White e lo sprite sarebbe altra metà semitrasparente.

Infine, ecco alcuni codice brillante che puoi utilizzare per ruotare schermo da verticale e orizzontale:

// Add this member variable
Matrix matTransform;

// Add these lines to the constructor
matTransform = Matrix.Identity;
matTransform *= 
    Matrix.CreateRotationZ(MathHelper.ToRadians(90));
matTransform *= 
    Matrix.CreateTranslation(240, 0, 0);

// In Draw() change spriteBatch.Begin to this
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, 
    SpriteSortMode.BackToFront, SaveStateMode.None, 
    matTransform);

Il resto È su A È

Il codice completo per mio esempio è illustrato nella Figura 4 e deve ottenere è lo spostamento. Se si esegue aground, il sito di Web creators.xna.com è completo di esempi che illustrano come eseguire tutti i tipi di elementi per lo sviluppo dei giochi arcane, da per pixel delimitazione caselle ai modelli fisica.

Figura 4 A semplice Zune gioco

public class Game1 : Microsoft.Xna.Framework.Game {
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Matrix matTransform;
    Texture2D texture;
    SoundEffect sndBoom;
    BoundingBox bbScreen;
    Vector2 position;

    public Game1() {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        position = new Vector2(100, 100);
        matTransform = Matrix.Identity;
        // Uncomment these lines to do Landscape Mode
        //matTransform *= Matrix.CreateRotationZ(          MathHelper. ToRadians(90));
        //matTransform *= Matrix.CreateTranslation(240, 0, 0);
    }

    protected override void Initialize() {
        Vector3 min = new Vector3(0, 0, 0);
        Vector3 max = 
            new Vector3(
            graphics.GraphicsDevice.Viewport.Width, 
            graphics.GraphicsDevice.Viewport.Height, 0);
        bbScreen = new BoundingBox(min, max);
        base.Initialize();
    }

    protected override void LoadContent() {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        texture = Content.Load<Texture2D>("player");
        ContentManager contentManager = 
            new ContentManager(Services, @"Content\Audio");
        sndBoom = contentManager.Load<SoundEffect>("explode");
    }

    protected override void UnloadContent() {
    }

    protected override void Update(GameTime gameTime) {
        GamePadState input = GamePad.GetState(PlayerIndex.One);
        if (input.Buttons.Back == ButtonState.Pressed)
            this.Exit();

        if (input.Buttons.B == ButtonState.Pressed)
            sndBoom.Play();

        const int c_speedScalar = 100;
        Vector2 speed = Vector2.Zero;

        speed.X = input.ThumbSticks.Left.X * c_speedScalar;
        speed.Y = input.ThumbSticks.Left.Y * c_speedScalar * -1;

        if (input.DPad.Left == ButtonState.Pressed)
            speed.X -= c_speedScalar;
        else if (input.DPad.Right == ButtonState.Pressed)
            speed.X += c_speedScalar;

        if (input.DPad.Up == ButtonState.Pressed)
            speed.Y -= c_speedScalar;
        else if (input.DPad.Down == ButtonState.Pressed)
            speed.Y += c_speedScalar;

        position += speed * (float)gameTime.ElapsedGameTime.TotalSeconds;

        Vector3 min = new Vector3((int)position.X, (int)position.Y, 0);
        Vector3 max = new Vector3((int)position.X + 
            texture.Width - 1, (int)position.Y + texture.Height - 1, 0);
        BoundingBox bb = new BoundingBox(min, max);

        ContainmentType ct = bbScreen.Contains(bb);
        if (ct != ContainmentType.Contains)
            position = new Vector2(100, 100);

        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime) {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin(SpriteBlendMode.AlphaBlend, 
            SpriteSortMode.BackToFront, SaveStateMode.None, matTransform);
        spriteBatch.Draw(texture, position, null, Color.White, 
            0, Vector2.Zero, 1.0F, SpriteEffects.None, 0.5F);
        spriteBatch.End();

        base.Draw(gameTime);
    }
}

Spero che è individuare lo sviluppo dei giochi XNA in C# da quante divertente come farebbe. Probabilmente qualcosa che si scrive diventerà la successiva operazione grande in gioco in corso... Se ad esso non beat mio figlio. Codifica felice.

Inviare domande e commentigoplaces@Microsoft.com.

Mike Calligaro è un Senior sviluppo lead con il team Windows Mobile Microsoft e un collaboratore al blog di team Windows Mobile, è possibile visualizzare inblogs.msdn.com/WindowsMobile.