.NET: Helloworld usando o Managed Direct3D Mobile

Publicado por Marcos Dell Antonio em 12/02/2007 | .NET, Direct3D, Mobilidade

Há dias estou estudando o Direct3D versão Mobile e Managed para dispositivos que suportam o .NET Compact Framework 2.0.

Hoje consegui escrever um Hello World e definir uma estrutura básica para renderizar o que for preciso. Veja o que foi feito abaixo.

Inicialização do Device

 

 1 private void InitializeGraphics()

 2 {

 3     try

 4     {

 5         PresentParameters presentParams = new

 6             PresentParameters();

 7         presentParams.Windowed = true;

 8         presentParams.SwapEffect =

 9             SwapEffect.Discard;

10 

11         _device = new Device(0,

12                              DeviceType.Default,

13                              this,

14                              CreateFlags.None,

15                              presentParams);

16 

17         _device.DeviceReset +=

18             new EventHandler(OnResetDevice);

19 

20         OnResetDevice(_device, null);

21     }

22     catch (Exception ex)

23     {

24         MessageBox.Show("Erro na inicialização: " +

25             ex.Message);

26     }

27 }

Este método será chamado no Main e inicializa a variável privada _device, portanto não esqueça de declará-la.

OnResetDevice (por enquanto inutilizado)

 

private void OnResetDevice(object sender, EventArgs e)

{

    //

}

Override do evento OnPaint

 

1 protected override void OnPaint(PaintEventArgs e)

2 {

3     Render();

4 

5     Invalidate();

6 }

Sempre que for preciso redesenhar os elementos da interface, o próprio dispositivo chamará o método OnPaint. Portanto, é ele que deve ser sobrescrito para desenvolver a aplicação. Neste caso, o método Render() (veja o item abaixo) é que fará o desenho de tudo o que for preciso e o Invalidate(), do próprio framework, fará com que a janela seja redesenhada futuramente.

Método responsável por desenhar os objetos - Render()

 

 1 private void Render()

 2 {

 3     _device.Clear(ClearFlags.Target,

 4                   Color.Red,

 5                   1.0f,

 6                   0);

 7 

 8     _device.BeginScene();

 9 

10     // Desenha alguma coisa...

11 

12     _device.EndScene();

13     _device.Present();

14 }

Este é “o cara”. Ele é que fará o desenho de tudo o que for preciso na aplicação. Vale a pena lembrar que tudo o que deve ser desenhado deve estar entre o BeginScene() e o EndScene().

Método Main()

 

 1 static void Main()

 2 {

 3     Form1 form = new Form1();

 4 

 5     form.InitializeGraphics();

 6 

 7     try

 8     {

 9         Application.Run(form);

10     }

11     catch (Exception ex)

12     {

13         MessageBox.Show("Erro ao iniciar a app: " +

14             ex.Message);

15     }

16 }

É aqui que a vida começa. :)

Workaround (leia-se: gambiarra)

Se você fizer tudo o que está escrito acima, ao rodar a aplicação, o dispositivo ficará piscando, como se estivesse redesenhando tudo a todo momento (e está). Para corrigir isso, faça o seguinte:

 

1 private void OnResetDevice(object sender, EventArgs e)

2 {

3     //

4 }

Resultado final

O resultado apresentado será este:

Exemplo utilizando o MD3DM
É claro que a cor vermelha foi usada somente para demonstrar que o fundo realmente foi alterado. Isto é feito no método Render(), na chamada do _device.Clear(). Veja o segundo parâmetro, ele define a cor que será usada no background.É isso ae. Até +.

Ps: para tirar screenshots do emulador rodando, pressione Alt+PrintScreen (o Alt pode variar conforme a configuração da Host Key que pode ser acessada no emulador através do menu File / Configure / General / Host Key).

1 comentário

  1. 1
    Paulo César // February 10th, 2011 at 10:29 am

    Olá… não vi a diferença no metodo onResetDevice, se puder mostrar aonde é agradeço…

    Obrigado,

    Paulo.

Deixe o seu comentário

Anúncios

Anúncio provido pelo BuscaPé