Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308

    [C#] Xna 4.0 disegno sprite su Texture2D in trasparenza

    Buonanotte.
    Ho un problemino: devo disegnare la sprite cerchio.bmp (un cerchio rosso su fondo nero) sopra un'immagine sfondo.jpg che riempe tutta la finestra grafica, in modo che si veda solo il cerchio e non anche il quadrato nero. Ho provato ad usare l'overload s.Begin() senza parametri ma si vede il quadrato nero con dentro il cerchio rosso; con l'overload mostrato nel codice, invece, riesco a "trasparire" correttamente il quadrato nero ma il cerchio rosso mi diventa trasparente.
    Sono tre giorni che studio la fusione dei colori ma qui l'unico che si sta fondendo sono io!
    Quello che mi fa disperare è che in molti tutorials riescono a fare quello che vorrei fare io semplicemente col metodo Begin() senza parametri. Ma che razza di sprite usano?

    codice:
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;
    namespace CiaoGabri
    {
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            GraphicsDeviceManager g;
            SpriteBatch s;
            Texture2D cerchio,sfondo;
                   
            public Game1()
            {
                g = new GraphicsDeviceManager(this);
                g.PreferredBackBufferWidth = 1000 ;
                g.PreferredBackBufferHeight = 500;   
                Content.RootDirectory = "Content";
            }
    
            protected override void Initialize()
            {
                base.Initialize();
            }
    
            protected override void LoadContent()
            {
                s = new SpriteBatch(GraphicsDevice);
                cerchio = Content.Load<Texture2D>("cerchio");
                sfondo = Content.Load<Texture2D>("sfondo");
            }
    
            protected override void UnloadContent()
            {
            }
    
            protected override void Update(GameTime t)
            {
                base.Update(t);
            }
    
            protected override void Draw(GameTime t)
            {
                GraphicsDevice.Clear(Color.Black);
    
                s.Begin(SpriteSortMode.Deferred, BlendState.Additive); 
                s.Draw(sfondo,Vector2.Zero, Color.White);
                s.Draw(cerchio, Vector2.One*200, Color.White);
                s.End();
                base.Draw(t);   
            }
        }
    }

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    io tempo fa ho provato xna giusto per divertirmi qualche giorno. non ricordo molto su come usare i vari effetti sulle texture2d pero ti copio incollo il metodo draw della navicella che è una png con lo sfondo trasparente.

    ti posto due metodi perchè il gioco è diviso in componenti (una cosa che vedrai piu in la se lo stai imparando). In ogni caso il primo richiama il secondo, per cui per ora vedili come un unico metodo.

    codice:
    public override void Draw(GameTime gameTime)
            {
                EnemyBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
                Enemy1.Draw(EnemyBatch);
                EnemyBatch.End();
    
                base.Draw(gameTime);
            }
    
    public void Draw(SpriteBatch Batch)
            {
                Batch.Draw(TextureImage, Position, null,
                     Color.White, Rotation, Origin, Scala, SpriteEffects.None, 0f);
            }

  3. #3
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Intanto grazie per la risposta.
    Tu parli di una sprite "png con fondo trasparente" e forse il problema è proprio quello.
    Io ho creato una sprite bmp con Paint ma ho letto in giro che le bmp non supportano il canale Alpha, "tranne le ultime versioni...". Mi sa che l'effetto trasparenza che cerco io non dipende dai parametri nella SpriteBatch.Begin, ma da come è costruito lo sprite che deve avere già in se lo sfondo trasparente. Ho letto che invece il formato png supporta il canale Alpha ma non so come impostare il canale Alpha dello sfondo su "Trasparente". Eppure in Paint se copio un disegno su un altro e seleziono la modalità "Trasparente" ottengo l'effetto che voglio, invece quando creo il disegno gli unici componenti di colore che posso gestire sono gli ordinari canali RGB ma non il canale Alpha... come faccio a creare una bmp oppure una png "con lo sfondo (bianco o nero che sia) trasparente"?
    Il parametro BlendState.AlphaBlend mi disegna solo la bmp con lo sfondo bianco, invece
    BlendState.Additive funziona con gli sprite su sfondo nero (sia bmp che png) ma rende trasparenti anche i disegni degli sprite e non solo lo sfondo (!!)

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    devi procurarti un software di grafica migliore di paint con cui creare facilmente i png con lo sfondo trasparente.. C'è paint.net che è gratuito:

    http://www.getpaint.net/

  5. #5
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Miiiiiiiiiiiiiiiiiiiiiiiiii.......
    Ho dovuto scaricare Paint.Net, studiarlo e impararlo, creare uno sprite a due livelli con sfondo in trasparenza e disegno opaco, salvarlo in formato png e alla fine con una semplice
    SpriteBatch.Begin() senza il minimo parametro funziona tutto alla perfezione.
    Grazie rsdfshetgdvdvdfert (hai un nome difficile ) mi sei stato di grandisssssimo aiuto.
    grazie grazie grazie grazie grazie grazie grazie grazie grazie grazie grazie grazie grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.