IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XNA/Monogame Discussion :

obtenir une texture2d à partir d'un objet Image ou Bitmap


Sujet :

XNA/Monogame

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut obtenir une texture2d à partir d'un objet Image ou Bitmap
    Bonjour à tous,

    Je cherche à faire un éditeur pour un jeu RPG avec XNA. Seulement je me heurte à un problème. Je n'ai pas réussi à trouver de méthode pour arriver à mes fins.

    Je charge sur une picturebox une image. Avec la souris je fais une selection sur une portion de l'image. Cela me permet de faire une selection que je peux utiliser afin d'avoir un curseur avec cette portion d'image afin de pouvoir la déplacer sur la zone de l'écran qui servira à l'affichage de la carte. C'est un composant que j'ai créer qui s'appuye sur le framework XNA afin d'afficher des sprites selon des classes que j'ai défini et seront utilisés dans mon jeu.
    Seulement, débutant encore avec ce framework je peine à trouver un moyen afin de pouvoir créer une texture qui n'est pas un fichier, mais n'est pas non plus dans le content. Car finalement, mon image est un objet soit Image ou Bitmap pour l'instant.

    Et je ne sais pas obtenir à partir de ces deux objets un objet Texture2D.

    Aussi je viens vers vous afin que vous puissiez m'expliquer la démarche à suivre, ou même la documentation qui me permettrait de résoudre mon problème.

    merci d'avance
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Je vais noter ici ma petite reflexion sur le sujet...

    En fait, la nuit portant conseil :p j'ai eu l'idée de charger la Texture2D en même temps que mon image dans ma picturebox. J'ai vu qu'il fallait que je regarde du coté de la compilation dynamique de fichier xnb... en m'inspirant de l'utilitaire fourni ici http://www.ziggyware.com/readarticle.php?article_id=183 cela devrait être possible

    Aprés sur mon composant je n'ai plus qu'à réutiliser ma Texture2d en affichant seulement la zone qui m'interresse et le tour est joué.

    Je fais mes tests des que j'ai un peu de temps et je vous tiens au courant
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  3. #3
    Membre régulier Avatar de LeonardL
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 57
    Points : 71
    Points
    71
    Par défaut
    De mémoire, un objet de type Texture2D possède une méthode du genre SetPixels()/GetPixels() qui te permet de traiter ton image pixel par pixel

    De mémoire toujours, il me semble que les classes Image/Bitmap ont également une méthode de ce genre. Il suffirait donc de faire passer les pixels de ton image vers ton objet Texture2D.

  4. #4
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Si tu ne cherche qu'a afficher une portion d'une image tu peux utiliser la classe Rectangle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    //
    // Résumé*:
    //     Initializes a new instance of Rectangle.
    //
    // Paramètres*:
    //   x:
    //     The x-coordinate of the rectangle.
    //
    //   y:
    //     The y-coordinate of the rectangle.
    //
    //   width:
    //     Width of the rectangle.
    //
    //   height:
    //     Height of the rectangle.
     
    Rectangle selection = new Rectangle(int x, int y, int width, int height);
     
    spritebatch.Draw( texture,
    	           position,
    	           selection,
    	           Color.White);

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Oui mais non ^^
    Désolé pour le retard de ma réponse je fus pris par d'autres choses.

    Je n'ai pas regardé du côté de getPixel/setPixel, car finalement si je peux importer un texture directement depuis un fichier image, cela me serait plus simple.

    Sinon pour l'histoire du rectangle oui c'est ce que je compte faire. dessiner seulement une zone de ma texture.

    Le soucis étant d'importer ma texture correctement.

    Pour l'instant je suis en train de chercher à importer ma texture via la documentation fourni sur le lien http://www.ziggyware.com/readarticle.php?article_id=183

    Mais je coince lors de l'importation des fichiers cibles. J'ai juste voulu intégrer le projet afin de l'utiliser...
    Mais visiblement cela ne fonctionne pas directement

    Donc il faut que j'enquête sur le fonctionnement du projet.

    A moins que vous sachiez m'expliquer rapidement l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Include the standard targets file that defines
                // how to build XNA Framework content.
                msBuildProject.AddNewImport("$(MSBuildExtensionsPath)\\Microsoft\\XNA " +
                                            "Game Studio\\v2.0\\Microsoft.Xna.GameStudio" +
                                            ".ContentPipeline.targets", null);
    L'erreur que j'obtiens est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le projet importé "C:\Program Files\MSBuild\Microsoft\XNA Game Studio\v2.0\Microsoft.Xna.GameStudio.ContentPipeline.targets" est introuvable. Vérifiez que le chemin d'accès dans la déclaration <Import> est correct et que le fichier existe sur le disque.
    Seulement, je ne comprends pas trop en quoi consiste cet import :s

    Sur mon projet, j'ai juste fait une méthode de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
            public static Texture2D getTexture(string cheminTexture)
            {
                string assemblyLocation = Path.GetDirectoryName(
                Path.GetFullPath(Assembly.GetExecutingAssembly().Location));
     
                string dllPath = assemblyLocation + "/NamedTextureProcessor.dll";
                string importDll = Path.GetFullPath(dllPath);
     
                XNBCompiler compiler = new XNBCompiler(
                    new string[] { importDll }
                    );
     
     
                string buildError = null;
                Texture2D tex = compiler.LoadContent<Texture2D>(
                    Path.GetFullPath(cheminTexture),
                    "NamedTextureImporter",
                    "NamedTextureProcessor",
                    out buildError);
     
     
                compiler.Dispose();
     
                return tex;
            }
    afin de pouvoir obtenir une Texture2d...

    Donc si vous avez étudier un peu plus le fonctionnement de ce projet merci de m'aiguillonner. Car sur le lien, il n'y a pas beaucoup d'explication sur le sujet hélas.

    merci d'avance
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Bon aprés avoir étudié un peu la question, la réponse est assez simple...

    J'utilise la version 3 du framework Xna, et d'autre part le projet et déclarer pour fonctionner avec le framework .net 2.0 alors que tu coup, avec le framework xna 3.0 il faut la version 3.5.

    En modifiant la compilation pour utiliser le framework 3.5, et en modifiant la version préciser dans le projet en 2.0 en 3.0.

    Il suffit de modifier la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msBuildEngine = new Engine(RuntimeEnvironment.GetRuntimeDirectory());
    En :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                string version = RuntimeEnvironment.GetRuntimeDirectory();
                version = version.Substring(0, version.LastIndexOf(@"\v"));
                version += @"\v3.5";
     
                msBuildEngine = new Engine(version);
    Et le tour est joué . Enfin presque il ne faudra pas oublier d'importer dans le projet qui fera la compilation également les références aux projets :
    • NamedTexture
    • NamedTextureProcessor (en plus de XNBCompiler).


    Sinon vous aurez une erreur lors de la tentative d'importation.

    Mais et oui hélas, même si maintenant j'arrive à obtenir mon objet Texture2D à partir d'un fichier en un tour de main...
    Mon idée de départ se révéle incorrect, car à présent j'obtiens l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    Bref j'explique comment j'ai fait les choses.

    J'ai créer une interface graphique avec un système d'onglet. un onglet me founir la picturebox sur lequel j'importe ma texture. (J'en profite pour importer ma texture2D que je met en mémoire dans une classe singleton (elle contient une collection de texture2D).
    Sur ma fameuse picturebox, je peux selectionner une zone afin de récupérer une partie de l'écran. Cette zone c'est ce qui va définir un Sprite à créer. bref, je détermine un Rectangle, une position et la liste des morceaux de tile à utiliser sur ma texture (histoire de pouvoir créer ma carte).

    Sur un autre onglet, j'ai créer un composant héritant d'un panel. je l'ai redéfini de manière à avoir une méthode paint qui est rafraichi par un timer.
    J'affiche ce que j'appelle le spriteManager. C'est un objet qui contient ce qu'il faut afficher sur le panel. Bref mes fameux sprites. Donc en cliquant j'ajoute mon sprite crée depuis la selection sur ma picturebox.

    jusqu'ici tout va bien.
    Mais une fois qu'il a été importé dans mon spriteManager, le fait de créer le rendu me provoque cette erreur.

    C'est sur la portion de code suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                spriteBatch.Begin();
     
                if(spriteManager!=null)
                    spriteManager.Draw(intervalRafraichissement);
     
                spriteBatch.End();
    l'exception se produit sur le spriteBatch.End().
    Donc ce n'est même pas lorsque je cherche à dessiner mon sprite (cela se fait dans le spriteManager...

    Donc le fait d'avoir ma Texture2D dans un objet partagé ne semble pas une bonne idée en soi .

    Si vous avez une idée d'une autre technique pour éviter ce problème je suis preneur

    Merci d'avance...
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  7. #7
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Ton spriteManager est de quel type ?

    C'est une classe que tu a créer ? Dérive t elle de Spritebatch ?

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    oui c'est une classe que j'ai créer, C'est seulement une collection de sprite à afficher à l'écran.

    Par contre pour l'instant, ma classe Sprite que j'ai crée contient le spriteBatch que je fourni à la construction des Sprites dont j'ai besoin. Je dessine avec lors de l'appel à la méthode Draw sur le spriteManager.

    Qui lui va appeller donc la méthode Draw de tous les sprites de sa collection.
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  9. #9
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    il y a moyen de voir la fonction Draw de ta classe SpriteManager ?

  10. #10
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Oui bien sur, mais elle n'a rien d'extraordinaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void Draw(int interval)
    {
           foreach (Idessinable s in listeSpriteEcran)
                 s.Draw(interval);
    }
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  11. #11
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Citation Envoyé par estacado Voir le message
    elle n'a rien d'extraordinaire
    Effectivement et ça va pas m'aider pour trouver !

    Dans ce cas est t il possible de me montrer la classe Sprite ?

    En fait j'arrive pas comprendre comment tu dessine tes sprites. A un moment donné il faut bien que tu fasse un spritebatch.Draw(). Et j'arrive pas a voir comment tu le fais

  12. #12
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Hehehe

    Donc le véritable endroit interressant c'est la classe la méthode draw de la classe Sprite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public virtual void Draw(int interval)
    {
            spriteBatch.Draw(textureManager.GetTexture(identifiantTexture), rectangleSelection, couleur);
    }
    Donc comme je le disais le textureManager c'est un singleton qui contient une collection de texture2D. Mon identifiant me permet de savoir quel texture est désirée, donc aprés je n'ai plus qu'à travailler dessus pour dessiner la zone de la texture qui m'interresse...

    Et en écrivant ces lignes d'explications je m'aperçois que je fais une bétise Mais cela n'explique pas l'erreur de mémoire partagée...
    Bref, il manque le rectangle de destination, je n'ai mis qu'un rectangle donc il est interprété comme rectangle de destination. Or vu ma classe en fait c'est le rectangle source... Bref il y a méli-mélo dans ma gestion des zones sources et destination.

    Doué comme un camion sans pneu pour le coup -_-"

    Bref en modifiant mon code cela pose toujours soucis quoi qu'il arrive (ouf, même si j'ai pas de pneu j'arrivais à avancer malgré tout )

    Aprés modification j'ai qlq chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Rectangle rec = new Rectangle((int)position.X,(int)position.Y,rectangleSelection.Width,rectangleSelection.Height);
                spriteBatch.Draw(textureManager.GetTexture(identifiantTexture), rec, rectangleSelection, couleur);
    tandis que pour le textureManager j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     public Texture2D GetTexture(int index)
            {
                return liste[index];
            }
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  13. #13
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Pourquoi la méthode Draw de ta classe Sprite est "virtual" ?

  14. #14
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    car je suis amené à pouvoir la redéfinir dans une classe qui peut hérité de la classe Sprite.

    Notamment pour mon objet SpriteAnime . Je réutilise les propriétés de base auquel je rajoute quelques fonctionnalités qui permet d'afficher une animation à partir d'une texture.

    Mais bon, je vais revoir mon architecture. Car elle n'est pas très propre actuellement.
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  15. #15
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Tu peux mettre le libellé de l'erreur stp ?

    Je cherche mais je t'avoue que je vois pas trop. En plus j'ai jamais eu cette erreur ...

  16. #16
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    c'est un AccessViolationException, avec le message :

    Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.

    EDIT:
    En tout cas, même si tu n'as jamais eu cette erreur ou ne vois pas trop.
    C'est déjà bien gentil de ta part de prendre du temps à tenter de trouver
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  17. #17
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    J'ai pas trouvé d'ou venait ton erreur mais j'ai trouvé un bout de code pour convertir une image System.Drawing.Bitmap en Texture2D.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    //Returns a Texture2D containing the same image as the bitmap parameter, resized if necessary.  Returns null if an error occurs. 
    public Texture2D CreateTextureFromBitmap( GraphicsDevice graphics_device, System.Drawing.Bitmap bitmap ) 
    { 
        Texture2D   texture         = null; 
        bool        dispose_bitmap  = false; 
        try 
        { 
            if (bitmap != null) 
            { 
                //Resize the bitmap if necessary, then capture its final size 
                if (graphics_device.GraphicsDeviceCapabilities.TextureCapabilities.RequiresPower2) 
                { 
     
                    System.Drawing.Size new_size; //New size will be next largest power of two, so bitmap will always be scaled up, never down
                    new_size        = new Size( (int)Math.Pow( 2.0, Math.Ceiling( Math.Log( (double)bitmap.Width ) / Math.Log( 2.0 ) ) ), (int)Math.Pow( 2.0, Math.Ceiling( Math.Log( (double)bitmap.Height ) / Math.Log( 2.0 ) ) ) );
                    bitmap          = new Bitmap( bitmap, new_size );
                    dispose_bitmap  = true; 
                } 
                System.Drawing.Size bitmap_size = bitmap.Size; 
     
                //Create a texture with an appropriate format 
                texture = new Texture2D( graphics_device, bitmap_size.Width, bitmap_size.Height, 1, TextureUsage.None, SurfaceFormat.Color ); 
     
                //Lock the bitmap data and copy it out to a byte array 
                System.Drawing.Imaging.BitmapData bmpdata = bitmap.LockBits( new System.Drawing.Rectangle( 0, 0, bitmap_size.Width, bitmap_size.Height ), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb ); 
                byte [ ] pixel_bytes = null;
                try
                {
                    pixel_bytes = new byte[bmpdata.Stride * bmpdata.Height];
                    Marshal.Copy( bmpdata.Scan0, pixel_bytes, 0, temp_bytes.Length );
                }catch{} //If error occurs allocating memory, bitmap will still be unlocked properly
                bitmap.UnlockBits( bmpdata ); 
     
                //Set the texture's data to the byte array containing the bitmap data that was just copied 
                if (pixel_bytes != null) texture.SetData<byte>( pixel_bytes ); 
            } 
        } 
        catch 
        { 
            //Error occured; existing texture must be considered invalid 
            if (texture != null) 
            { 
                texture.Dispose(); 
                texture = null; 
            } 
        } 
        finally 
        { 
            if (dispose_bitmap) 
                bitmap.Dispose(); 
        } 
        return texture; 
    }
    Le code provient du XNA game creator club forum :
    http://forums.xna.com/forums/t/12154.aspx

    Je pense que tu devrais essayer ça.

  18. #18
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Effectivement c'est plus simple.

    Mais sur plus long terme, la méthode que j'utilise actuellement me conviendra mieux, puisqu'elle va me permettre de générer les fichiers *.xnb à la volée.

    Ce qui est utile pour un éditeur... car le but, c'est au final de produit les fichiers de ressources pour l'éxécution du jeu

    Je vais tout de même voir pour faire un test voir si cela change quelque chose par cette méthode... mais je ne pense pas que cela change le problème que j'ai.
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  19. #19
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    A tu essayer de charger un Sprite en dur dans ton code dans ton spritemanager pour voir si déjà tu arrive a l'afficher ?

  20. #20
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Cela va être un peu long pour faire ce test

    car je suis dans un environnement winform. Et je n'ai pas de quoi charger de manière classique le projet car le contentManager est fourni normalement via la classe game.

    Donc il faut que je regarde de plus prés cette partie (de toute manière il faut que je m'y attéle car il faudra bien que je puisse charger des ressources compiler depuis mon éditeur hehehe).

    EDIT:
    J'ai testé avec la méthode que tu as décrite tout à l'heure.
    Quand je tente d'ajouter mon sprite, je n'ai pas d'erreur. En mode pas à pas, j'ai bien ma liste de sprite dans ma classe SpriteManager. Mais rien ne s'affiche sur mon panel .

    Par contre quand je quitte l'éditeur, j'ai la même erreur qu'auparavant
    Donc le comportement est assez étrange.
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/08/2011, 19h36
  2. [c#] chargement d'une texture a partir d'un objet Image
    Par elguignardo dans le forum DirectX
    Réponses: 2
    Dernier message: 29/03/2006, 09h18
  3. Obtenir une chaîne à partir d'une énumération
    Par zidenne dans le forum Langage
    Réponses: 1
    Dernier message: 12/11/2005, 10h39
  4. [Regexp] Obtenir une regexp à partir du texte ?
    Par Alec6 dans le forum Langage
    Réponses: 1
    Dernier message: 12/09/2005, 16h40
  5. Réponses: 17
    Dernier message: 04/04/2005, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo