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
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.