Affichage d'une image jpg avec direct3d mobile 5.0

Soyez le premier à donner votre avis sur cette source.

Vue 14 384 fois - Téléchargée 634 fois

Description

Bonjour
J'ai cherche quelque temps pour trouver comment afficher une simple image a l'ecran avec Direct3D Mobile 5.0 sur mon telephone.
Je vous ai mis cette source que j'ai realisee a partir de plusieurs toturiaux dont je me suis servit et de l'aide que j'ai eu sur Codes-sources.
DirectX Mobile 5.0 ne contient pas DirectDraw, donc pour faire de la 2D, vous n'avez pas le choix il faut passer par Direct3D.

L'affichage d'une image se fait par le biais de la creation de deux triangles (positionnes et construits pour qu'ils forment un rectangle) qui seront textures avec l'image a afficher.

Source / Exemple :


using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using Microsoft.WindowsMobile.DirectX;
using Microsoft.WindowsMobile.DirectX.Direct3D;
using System.Reflection;

namespace DarkDominion
{
    class GraphicEngine : System.Windows.Forms.Form
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [MTAThread]
        static void Main()
        {
            GraphicEngine fenetre = new GraphicEngine();
            fenetre.InitializeGraphics();
            fenetre.Show();
            while (fenetre.Created)
            {
                fenetre.Render();
                Application.DoEvents();
            }
            fenetre.DisposeGraphics();
        }

        public Device device;
        public bool Created;
        public Texture texture;
        public VertexBuffer vertices;
        public VertexBuffer vertices2;

        protected bool InitializeGraphics()
        {
            Created = true;
            PresentParameters pres = new PresentParameters();
			// Plein ecran, dans le cas ou vous ne voulez pas du plein ecran, retirer les affectations
			// du BackBufferWidth et du BackBufferHeight qui seront correctement geres tout seuls
            pres.Windowed = false;
            pres.BackBufferWidth = this.Width;
            //pres.BackBufferHeight = this.Height;
			// En utilisant la ligne precedente qui semblerait normal, la taille ne sera pas exactement
			// la bonne car il prendra encore en compte la barre du menu demarrer en haut
            pres.BackBufferHeight = this.Width * 4 / 3; // avec cette affectation la taille est la bonne
            pres.SwapEffect = SwapEffect.CopyVSync;
            device = new Device(0, DeviceType.Default, this, CreateFlags.None, pres);

			// Chargement de la texture
            texture = CreateOverlayTexture(device);
			// creation du premier triangle
            vertices = CreateVertexBuffer(device); 
			// creation du second triangle
            vertices2 = CreateVertexBuffer2(device);
            return true;
        }

        protected VertexBuffer CreateVertexBuffer(Device device)
        {
            VertexBuffer buf = new VertexBuffer(typeof(CustomVertex.TransformedTextured), 3, device, 0, CustomVertex.TransformedTextured.Format, Pool.Managed);
            PopulateVertexBuffer(buf);
            return buf;
        }

        protected void PopulateVertexBuffer(VertexBuffer vertices)
        {
            // Notez qu'on utilise TransformedTextured
            CustomVertex.TransformedTextured[] verts =(CustomVertex.TransformedTextured[])vertices.Lock(0, 0);
            int i = 0;
            verts[i++] = new CustomVertex.TransformedTextured(
              0, 0, 0.5F, // position du sommet
              1,                           // rhw (avancé)
              0, 1);                       // coordonnées texture
            verts[i++] = new CustomVertex.TransformedTextured(
              Width, Height, 0.5F,
              1,
              1, 0);
            verts[i++] = new CustomVertex.TransformedTextured(
              0, Height, 0.5F,
              1,
              1, 1);

            vertices.Unlock();
        }

        protected VertexBuffer CreateVertexBuffer2(Device device)
        {
            VertexBuffer buf = new VertexBuffer(typeof(CustomVertex.TransformedTextured), 3, device, 0, CustomVertex.TransformedTextured.Format, Pool.Managed);
            PopulateVertexBuffer2(buf);
            return buf;
        }

        protected void PopulateVertexBuffer2(VertexBuffer vertices)
        {
            CustomVertex.TransformedTextured[] verts = (CustomVertex.TransformedTextured[])vertices.Lock(0, 0);
            int i = 0;
            verts[i++] = new CustomVertex.TransformedTextured(
              0, 0, 0.5F, // position du sommet
              1,                           // rhw (avancé)
              0, 1);                       // coordonnées texture
            verts[i++] = new CustomVertex.TransformedTextured(
              Width, 0, 0.5F,
              1,
              0, 0);
            verts[i++] = new CustomVertex.TransformedTextured(
              Width, Height, 0.5F,
              1,
              1, 0);

            vertices.Unlock();
        }

        
        protected Texture CreateOverlayTexture(Device device)
        {
            Texture t = TextureLoader.FromStream(device, Assembly.GetExecutingAssembly().GetManifestResourceStream("DarkDominion.Photos.HERVE_Production_Logo.jpg"));
            return t;
        }

        protected void Render()
        {
            device.Clear(ClearFlags.Target, Color.Black, 1.0F, 0);
            device.BeginScene();

            // Nouvelle ligne
            device.SetTexture(0, texture);

            //device.VertexFormat = CustomVertex.TransformedTextured.Format;
            device.SetStreamSource(0, vertices, 0);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
            device.SetStreamSource(0, vertices2, 0);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);

            device.EndScene();
            device.Present();
        }

        protected void DisposeGraphics()
        {
            device.Dispose();
        }
    }
}

Conclusion :


Le code est encore assez redondant, mais je vais l'ameliorer pour le rendre plus generique et pratique a utiliser.
La source vous permettra de comprendre comment faire de la 2D avec Direct3D Mobile 5.0

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Diabolus
Messages postés
61
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
28 septembre 2007
1
Bonsoir
communiquer avec un serveur apache, c'est à dire requête HTML (ou PHP...) donc utilise Internet Explorer de ton Windows Mobile, ou n'importe quel navigateur web installable sur Windows Mobile.

Je n'ai jamais travaillé sur la communication réseau sur Windows Mobile. Regarde sur MSDN par exemple. Ils donnent de nombreux exemples de code.
Bonne soirée
patpout
Messages postés
2
Date d'inscription
mercredi 11 mars 2009
Statut
Membre
Dernière intervention
16 mai 2010

bonjour
vous pouvez m'aider pour développer une petite application pour se connecter a un serveur apache et afficher le contenu d'un fichier texte via windows mobile .
et merci d'avance :)
babou6a
Messages postés
27
Date d'inscription
samedi 19 juin 2004
Statut
Membre
Dernière intervention
14 octobre 2008
2
Bonjour,
Je trouve très intéressant de trouver des morceaux de code dans ce genre pour apprendre.
Cependant j'ai un petit problème, car à l'exécution le texture loader retourne null ce qui fait un exception.
Pourtant j'ai bien changé le fichier et mis ma propre texture, je ne comprends pas.

Babou
gretata
Messages postés
172
Date d'inscription
lundi 22 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2011

Merci beaucoup d'avoir repondu aussi vite, je vois se qui faut faire, encore une fois merci et bonne journée
cs_Diabolus
Messages postés
61
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
28 septembre 2007
1
Salut
Une fois que tu as installé correctement le SDK et que tu as créé ton projet pour Windows Mobile 5 (pour Pocket PC ou Smartphone ou autre), dans le menu "Solution Explorer" (la liste de tes fichiers), déplies "References" et fais bouton droit sur "References", puis "Add References"et dans l'onglet ".NET" tu trouveras "Microsoft.WindowsMobile.DirectX". Tu fais OK et tu pourras ensuite faire fonctionner le "using Microsoft.WindowsMobile.DirectX.Direct3D" et "using Microsoft.WindowsMobile.DirectX"

J'espère que cela t'aura aidé
A++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.