Você está na página 1de 13

Neste artigo, iremos trabalhar sobre o uso de controles do Windows e UserControls WPF dentro de um projeto de jogo XNA.

Dizem Windows controla no pode ser usado dentro de um jogo XNA muito menos WPF. Bem, isso foi provado neste artigo.

Agora vamos adicionar reference.Project-> Add Reference e, em seguida, escolha "System.Windows.Forms" namespace.

E declar-la em Game1.cs:

ota: Pode ser necessrio declarar e adicionar uma referncia "System.Drawing" namespace tambm. TextBox controle: Um controle de entrada, podemos usar no Windows Forms.We adicionar caixa de texto para o nosso projeto XNA: Em qualquer lugar podemos declarar variveis: TextBox text1 = new TextBox (); Com isso criamos uma nova caixa de texto variable.We est adicionando o cdigo abaixo para o nosso Initialize () funo. protected override void Initialize () { base.Initialize (); text1.Location = new System.Drawing.Point (40, 40); text1.BorderStyle = BorderStyle.None; text1.Multiline = true; text1.Size = Tamanho nova (400, 400); Control.FromHandle (Window.Handle) Controls.Add (text1).; } Vamos explicar: "Control.FromHandle (Window.Handle) Controls.Add (Ornek);". "Control.FromHandle" - ajuda-nos a chamar a ala vamos adicionar caixa de texto. "Control.FromHandle (Window.Handle)" Tomamos a ala de GameWindow classe chamada classe Window.Game no um control.But por causa de GameWindow um controle que pode ser usado em projeto XNA, que podemos chamar e adicionar controles do Windows atravs de isso.ns foram capazes de adicionar ou remover qualquer controle, enquanto a codificao no Windows Forms Windows Forms, porque era em si um too.Now controle deixeme dizer-lhe isto:. "classe Form & classe GameWindow parece igual" Ao pensar para que possamos fazer RAD ( Rapid Application Development) em XNA assim como ns, enquanto o Windows Form Aplicativos Baseados em desenvolvimento. Mas se voc executar o projeto, voc no ser capaz de inserir uma chave dentro da classe TextBox.

Porque enquanto classe TextBox usa "System.Windows.Forms.Keys", XNA aceita somente "XNA.Framework.Input.Keys". Embora ns no podemos fazer isso com o Windows Way, vamos faz-lo, como fazemos em Entradas XNA. string var_text1; ns adicionamos uma string valioso que ir armazenar todos os textos de sua entrada e em seguida, atribuir ao nosso chamado text1 TextBox classe protected override void Update(GameTime gameTime) { base.Update(gameTime); if (text1.Focused) { KeyboardState ns = Keyboard.GetState(); foreach (Microsoft.Xna.Framework.Input.Keys a in ns.GetPressedKeys()) { var_text1 = a.ToString(); text1.Text += var_text1; } } } "KeyboardState ns = Keyboard.GetState ();" -> temos toda a entrada do teclado ("ns.GetPressedKeys ()") Isso nos ajuda a escrever qualquer valor chave para a nossa caixa de texto.. Se quiser, voc no pode tomar todas as teclas, basta usar "if-else" estrutura e tomar qualquer chave que voc deseja. Vamos executar os project.Whats vai acontecer?

Quando pressionar uma tecla, ele escreveu como ns pressionado 5 times.Let me explicar isso:

No XNA, cada evento acontece em funo de atualizao depende Gametime processo sec value.1 repetido 5 vezes para que as atualizaes janela do jogo como ns want.Why 1 seg / 5? Porque em coisas contnuas como "perseguir um carro, atirando um adversrio" devemos ver o que est acontecendo usurio instantly.The deve se sentir como ele est jogando um "tempo real" de que game.Because Gametime repete 5 vezes em 1 sec.Even 1 s pode ser diferente em algum momento. Vamos voltar ao nosso project.How vamos resolver isso? criar uma varivel int e consult-lo em funo de atualizao. int ct = 0; / / o valor inicial deve ser 0 para que isso no pode ser repetido. Em seguida, actualizar a nossa funo de atualizao visto abaixo:
protected override void Update(GameTime gameTime) { base.Update(gameTime); if (text1.Focused) { ct = ct -1; if(ct < 0) { ct = 5; } if(ct == 0) { KeyboardState ns = Keyboard.GetState(); foreach (Microsoft.Xna.Framework.Input.Keys a in ns.GetPressedKeys()) { var_text1 = a.ToString(); Text1.Text += var_text1; } } } }

E voc pode inserir qualquer valor sem repetir:

isso! Voc criou um controle de caixa de texto dentro de uma janela XNA ... Controle de boto: Controle Button nos ajuda a aceitar um process.In Nesta seo, vou estar falando sobre como adicionar um controle de boto e sua eventhandler. Declaramos nossa classe Button em primeiro lugar.
Button btn = new Button(); Para adicionar este projeto dentro update-Inicializar funo exatamente como abaixo: protected override void Initialize() { base.Initialize(); btn.Text = "Press Me!"; btn.Location = new System.Drawing.Point(50, 50); btn.FlatStyle = FlatStyle.Popup; Control.FromHandle(Window.Handle).Controls.Add(btn); }

Agora vamos escrever uma EventHandler simples que vai nos mostrar um MessageBox.
protected override void Initialize() { base.Initialize(); btn.Text = "Press Me!"; btn.Location = new System.Drawing.Point(50, 50); btn.FlatStyle = FlatStyle.Popup; btn.Click += new System.EventHandler(ButtonClick); Control.FromHandle(Window.Handle).Controls.Add(btn); } private void ButtonClick(object sender, EventArgs e) { MessageBox.Show("Button is Clicked!"); }

Ao faz-lo temos acrescentado "do Windows baseada em controle" eventos dentro do jogo XNA.

Controle CheckBox: Controle Checkbox nos ajuda a selecionar mltiplas opes. Ns declar-lo como visto abaixo: CheckBox cb = new CheckBox(); Us-lo: Controle CheckBox: Controle Checkbox nos ajuda a selecionar mltiplas opes. Ns declar-lo como visto abaixo: CheckBox CheckBox cb = new (); Us-lo:
protected override void Initialize() { base.Initialize(); cb.CheckState = CheckState.Unchecked; cb.Location = new System.Drawing.Point(50, 50); cb.Text = "Yes"; cb.BackColor = System.Drawing.Color.CornflowerBlue; Control.FromHandle(Window.Handle).Controls.Add(cb); }

Vamos criar um eventhandler e altere o valor de texto do objeto checkbox.

protected override void Initialize() { base.Initialize(); cb.CheckState = CheckState.Indeterminate; cb.Location = new System.Drawing.Point(50, 50); cb.Text = "Indeterminate"; cb.BackColor = System.Drawing.Color.CornflowerBlue; cb.CheckStateChanged += new EventHandler(CBChanged); Control.FromHandle(Window.Handle).Controls.Add(cb); } private void CBChanged(Object sender, EventArgs e) {

if (cb.CheckState == CheckState.Unchecked) { cb.Text = "No"; } else if (cb.CheckState == CheckState.Checked) { cb.Text = "Yes"; } }

Ns mudamos o cdigo um pouco. Check=Checked No Check=Unchecked Both of Them=Indeterminate Permite execut-lo! Modo indeterminado:

Modo desmarcada:

Modo Checked:

Eu expliquei o Windows controla to detalhado quanto i can.Now vamos falar sobre a caracterstica mais interessante: WPF! Usurio WPF Controles:

Controles de usurio do WPF so os controles mais interessantes que podemos acrescentar dentro do jogo XNA. Mas primeiro precisamos adicionar algumas referncias que um aplicativo WPF s precisa de: Apresentao Ncleo Presentation Framework UIAutomationProvider WindowsBase WindowsFormsIntegration Depois disso iremos adicionar nosso WPFUserControl pr-fabricados a partir de projeto-> "Add Existing Item ..."

Encontre os arquivos com o Windows Markup Files & arquivo de origem C # e adicion-los:

Agora o que vamos fazer adicion-los ao nosso projeto como fizemos antes. Voc pode adicionar o namespace que usamos para WPF UserControl.
using WindowsFormsApplication1; / / Esse o Namespace temos usado dentro WPF

UserControl Dentro desta Controle do Usurio WPF ns adicionamos um combobox e um evento "SelectionChanged", que mostra-nos a mensagem para o item selecionado. Cdigo de WPF UserControl:
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) { ComboBoxItem cbi = ((ComboBox)sender).SelectedItem as ComboBoxItem; MessageBox.Show(cbi.Content.ToString()); }

XAML do WPF UserControl:


<UserControl x:Class="WindowsFormsApplication1.Kontrol1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="300" Width="300"> <Grid> <ComboBox Height="23" Margin="48,70,132,0" Name="comboBox1" VerticalAlignmen t="Top"SelectionChanged="comboBox1_SelectionChanged"> <ComboBoxItem>1</ComboBoxItem> <ComboBoxItem>2</ComboBoxItem> <ComboBoxItem>3</ComboBoxItem> <ComboBoxItem>4</ComboBoxItem> </ComboBox> </Grid> </UserControl>

Permite adicionar o controle!


Kontrol1 kontrol11 = new Kontrol1();

Ns declaramos o controle. Ento, dentro "Inicializar ()" chamada de funo de nosso controle chamado Kontrol11 ...
protected override void Initialize() { base.Initialize(); //ElementHost object helps us to connect a WPF User Control. ElementHost elementHost1 = new ElementHost(); elementHost1.Location = new System.Drawing.Point(308, 69); elementHost1.Name = "elementHost1"; elementHost1.Size = new System.Drawing.Size(350, 181); elementHost1.TabIndex = 1; elementHost1.Text = "elementHost1"; elementHost1.Child = this.kontrol11; Control.FromHandle(Window.Handle).Controls.Add(elementHost1); }

Como voc pode ver acima, adicionou um UserControl WPF para o nosso projeto Permite executar este project.Whats vai acontecer?

Sim UIS diferentes como XAML no pode ser usado diretamente no interior de um Game.For XNA que devemos convert-lo para single-threaded. Abra o arquivo Program.cs: Mudar medida que :

using System; namespace DemoTest { static class Program { [STAThread] static void Main(string[] args) { using (Game1 game = new Game1()) { game.Run(); } } } }

[STAThread] nos ajuda a atingir this.Now nosso projeto nico Threaded.And chamar as UIs diferentes dentro XNA!

Como voc pode ver que ns adicionamos-lo dentro XNA Game!

Estamos selecionando um item e, em seguida:

Ela nos mostra o valor selecionado.

Neste artigo eu ter escrito to detalhado quanto muito a explicar como podemos fazer tudo isso XNA Game dentro. Ao fazer isso voc tem integrado Controles Windows e Controles de usurio do WPF dentro XNA! Eu vou dizer muito mais sobre REXA (Aplicaes Ricas de Efeitos XNA) nos dias seguintes. Update: FULL SCREEN Como voc bem sabe executar estas amostras Mode.But Windowed que se eles estavam executando tela cheia? Se usarmos graphics.ToggleFullScreen XNA de () ou graphics.IsFullScreen = true ento todas as coisas que temos utilizado-como controles de janelas e dilogos-vontade disappear.Thats

porque Direct3D que usa XNA vai assumir o controle e remover toda a janela baseada em controles e caixas de dilogo de visualizao de tela cheia. Se ns no podemos usar o XNA Framework para tela cheia, o que vamos fazer? fcil chamar um cdigo de uma linha para tela cheia, no ? Bem o que voc vai fazer quando voc enfrenta algo assim no capaz de ver controles do Windows ou qualquer coisa relacionada ao modelo de objeto Windows? H uma soluo! : Ns vamos desenvolv-lo o "Windows-Way" .. Ns estaremos usando a API do Windows para Screen.So completo o que eu sugiro que voc seguir os passos, ento voc vai achar mais fcil: 1) Adicione essas referncias atravs de codificao: using System.Runtime.InteropServices; 2) Adicionar declaraes de API do Windows: [DllImport ("user32.dll")] private static extern bool SetWindowPos (IntPtr hWnd, IntPtr hWndIntertAfter, int x, int y, int cx, int cy, int uFlags); [DllImport ("user32.dll")] private static extern int GetSystemMetrics (int qual); private const int SM_CXSCREEN = 0; private const int SM_CYSCREEN = 1; privada IntPtr HWND_TOP = IntPtr.Zero; private const int SWP_SHOWWINDOW = 64; Estes vo mostrar em tela cheia ou restaurar o modo de janela. 3) Obter Valores de tela: public int screenX { obter { voltar GetSystemMetrics (SM_CXSCREEN); } } screenY int pblico { obter { voltar GetSystemMetrics (SM_CYSCREEN); } } 4) Escrever Full Screen & Restore Cdigos: FullScreen private void ()

{ . Form.FromHandle (Window.Handle) FindForm () WindowState = FormWindowState.Maximized.; Form.FromHandle (Window.Handle) FindForm () FormBorderStyle = FormBorderStyle.None..; . Form.FromHandle (Window.Handle) FindForm () TopMost = true.; SetWindowPos (Window.Handle, HWND_TOP, 0, 0, screenX, screenY, SWP_SHOWWINDOW); } Restaurao private void () { Form.FromHandle (Window.Handle) FindForm () WindowState = FormWindowState.Normal..; Form.FromHandle (Window.Handle) FindForm () FormBorderStyle = FormBorderStyle.FixedDialog..; . Form.FromHandle (Window.Handle) FindForm () TopMost = false.; } 5) Para chamar esses 2 funes, vamos escrever um cdigo de funo @ Update: KeyboardState newstat = Keyboard.GetState (); if (newstat.IsKeyDown (Microsoft.Xna.Framework.Input.Keys.Escape)) { FullScreen (); } else if (newstat.IsKeyDown (Microsoft.Xna.Framework.Input.Keys.Space)) { Restaurar (); } Se clicar em escapar do jogo ser executado em screen.If Completa, pressione espao que vai restaurar o modo de janela. Permite executar a parte atualizada e ver o que acontece: O modo de janela:

TELA CHEIA:

isso! Conseguimos executar o nosso projeto em Screen.As completa voc pode ver muito simples no

Você também pode gostar