Fórum Sharpgames
 
 
  Forum  Criação de Jogo...  Algoritmos  Permitir que o usuário escreva textos...
Anterior Anterior
 
Próximo Próximo
Nova Entrada 6/1/2009 18:09
  Dobrowolski
13 tópicos
10th Level Poster


Permitir que o usuário escreva textos... 
Modificado Por Dobrowolski  em 6/1/2009 17:12:59)
Saudações companheiros desenvolvedores!!!

Após deparar-me com a dificuldade de pemitir que o usuário escreva textos durante o jogo (para criar um profile, ou para inserir o nome em um hi-score, por exemplo), desenvolvi uma classe específica que facilita esse trabalho.

Obviamente, pode ser melhorada em muito, mas se de repente alguém estiver precisando, ou tiver sugestões de melhoria (ou mesmo um modo completamente diferente e mais eficiente...), estou disponibilizando para uso:

O trecho a seguir é o da classe, que deverá ser criada no projeto:

using System;
using System.Collections.Generic;
using System.Text; 

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;

namespace <SEU NAMESPACE>
{
    class CaixaDeTexto
    {
        public KeyboardState Teclado;
        public KeyboardState TeclaAnterior;
        public bool Maiuscula = false;


        /// <summary>
        /// Método para adicionar letras conforme forem digitadas.
        /// Diferencia maiúsculas de minúsculas.
        /// </summary>
        /// <returns>Retorna a letra digitada.</returns>
        public string Escrever()
        {
            Teclado = Keyboard.GetState();

            string Mensagem = "";
           
            // CAPTURA DE TODAS AS LETRAS
            if (Maiuscula == true)
            {
                if (Teclado.IsKeyDown(Keys.A) && TeclaAnterior.IsKeyUp(Keys.A)) { Mensagem = "A"; }
                if (Teclado.IsKeyDown(Keys.B) && TeclaAnterior.IsKeyUp(Keys.B)) { Mensagem = "B"; }
                if (Teclado.IsKeyDown(Keys.C) && TeclaAnterior.IsKeyUp(Keys.C)) { Mensagem = "C"; }
                if (Teclado.IsKeyDown(Keys.D) && TeclaAnterior.IsKeyUp(Keys.D)) { Mensagem = "D"; }
                if (Teclado.IsKeyDown(Keys.E) && TeclaAnterior.IsKeyUp(Keys.E)) { Mensagem = "E"; }
                if (Teclado.IsKeyDown(Keys.F) && TeclaAnterior.IsKeyUp(Keys.F)) { Mensagem = "F"; }
                if (Teclado.IsKeyDown(Keys.G) && TeclaAnterior.IsKeyUp(Keys.G)) { Mensagem = "G"; }
                if (Teclado.IsKeyDown(Keys.H) && TeclaAnterior.IsKeyUp(Keys.H)) { Mensagem = "H"; }
                if (Teclado.IsKeyDown(Keys.I) && TeclaAnterior.IsKeyUp(Keys.I)) { Mensagem = "I"; }
                if (Teclado.IsKeyDown(Keys.J) && TeclaAnterior.IsKeyUp(Keys.J)) { Mensagem = "J"; }
                if (Teclado.IsKeyDown(Keys.K) && TeclaAnterior.IsKeyUp(Keys.K)) { Mensagem = "K"; }
                if (Teclado.IsKeyDown(Keys.L) && TeclaAnterior.IsKeyUp(Keys.L)) { Mensagem = "L"; }
                if (Teclado.IsKeyDown(Keys.M) && TeclaAnterior.IsKeyUp(Keys.M)) { Mensagem = "M"; }
                if (Teclado.IsKeyDown(Keys.N) && TeclaAnterior.IsKeyUp(Keys.N)) { Mensagem = "N"; }
                if (Teclado.IsKeyDown(Keys.O) && TeclaAnterior.IsKeyUp(Keys.O)) { Mensagem = "O"; }
                if (Teclado.IsKeyDown(Keys.P) && TeclaAnterior.IsKeyUp(Keys.P)) { Mensagem = "P"; }
                if (Teclado.IsKeyDown(Keys.Q) && TeclaAnterior.IsKeyUp(Keys.Q)) { Mensagem = "Q"; }
                if (Teclado.IsKeyDown(Keys.R) && TeclaAnterior.IsKeyUp(Keys.R)) { Mensagem = "R"; }
                if (Teclado.IsKeyDown(Keys.S) && TeclaAnterior.IsKeyUp(Keys.S)) { Mensagem = "S"; }
                if (Teclado.IsKeyDown(Keys.T) && TeclaAnterior.IsKeyUp(Keys.T)) { Mensagem = "T"; }
                if (Teclado.IsKeyDown(Keys.U) && TeclaAnterior.IsKeyUp(Keys.U)) { Mensagem = "U"; }
                if (Teclado.IsKeyDown(Keys.V) && TeclaAnterior.IsKeyUp(Keys.V)) { Mensagem = "V"; }
                if (Teclado.IsKeyDown(Keys.W) && TeclaAnterior.IsKeyUp(Keys.W)) { Mensagem = "W"; }
                if (Teclado.IsKeyDown(Keys.X) && TeclaAnterior.IsKeyUp(Keys.X)) { Mensagem = "X"; }
                if (Teclado.IsKeyDown(Keys.Y) && TeclaAnterior.IsKeyUp(Keys.Y)) { Mensagem = "Y"; }
                if (Teclado.IsKeyDown(Keys.Z) && TeclaAnterior.IsKeyUp(Keys.Z)) { Mensagem = "Z"; }
            }

            if (Maiuscula == false)
            {
                if (Teclado.IsKeyDown(Keys.A) && TeclaAnterior.IsKeyUp(Keys.A)) { Mensagem = "a"; }
                if (Teclado.IsKeyDown(Keys.B) && TeclaAnterior.IsKeyUp(Keys.B)) { Mensagem = "b"; }
                if (Teclado.IsKeyDown(Keys.C) && TeclaAnterior.IsKeyUp(Keys.C)) { Mensagem = "c"; }
                if (Teclado.IsKeyDown(Keys.D) && TeclaAnterior.IsKeyUp(Keys.D)) { Mensagem = "d"; }
                if (Teclado.IsKeyDown(Keys.E) && TeclaAnterior.IsKeyUp(Keys.E)) { Mensagem = "e"; }
                if (Teclado.IsKeyDown(Keys.F) && TeclaAnterior.IsKeyUp(Keys.F)) { Mensagem = "f"; }
                if (Teclado.IsKeyDown(Keys.G) && TeclaAnterior.IsKeyUp(Keys.G)) { Mensagem = "g"; }
                if (Teclado.IsKeyDown(Keys.H) && TeclaAnterior.IsKeyUp(Keys.H)) { Mensagem = "h"; }
                if (Teclado.IsKeyDown(Keys.I) && TeclaAnterior.IsKeyUp(Keys.I)) { Mensagem = "i"; }
                if (Teclado.IsKeyDown(Keys.J) && TeclaAnterior.IsKeyUp(Keys.J)) { Mensagem = "j"; }
                if (Teclado.IsKeyDown(Keys.K) && TeclaAnterior.IsKeyUp(Keys.K)) { Mensagem = "k"; }
                if (Teclado.IsKeyDown(Keys.L) && TeclaAnterior.IsKeyUp(Keys.L)) { Mensagem = "l"; }
                if (Teclado.IsKeyDown(Keys.M) && TeclaAnterior.IsKeyUp(Keys.M)) { Mensagem = "m"; }
                if (Teclado.IsKeyDown(Keys.N) && TeclaAnterior.IsKeyUp(Keys.N)) { Mensagem = "n"; }
                if (Teclado.IsKeyDown(Keys.O) && TeclaAnterior.IsKeyUp(Keys.O)) { Mensagem = "o"; }
                if (Teclado.IsKeyDown(Keys.P) && TeclaAnterior.IsKeyUp(Keys.P)) { Mensagem = "p"; }
                if (Teclado.IsKeyDown(Keys.Q) && TeclaAnterior.IsKeyUp(Keys.Q)) { Mensagem = "q"; }
                if (Teclado.IsKeyDown(Keys.R) && TeclaAnterior.IsKeyUp(Keys.R)) { Mensagem = "r"; }
                if (Teclado.IsKeyDown(Keys.S) && TeclaAnterior.IsKeyUp(Keys.S)) { Mensagem = "s"; }
                if (Teclado.IsKeyDown(Keys.T) && TeclaAnterior.IsKeyUp(Keys.T)) { Mensagem = "t"; }
                if (Teclado.IsKeyDown(Keys.U) && TeclaAnterior.IsKeyUp(Keys.U)) { Mensagem = "u"; }
                if (Teclado.IsKeyDown(Keys.V) && TeclaAnterior.IsKeyUp(Keys.V)) { Mensagem = "v"; }
                if (Teclado.IsKeyDown(Keys.W) && TeclaAnterior.IsKeyUp(Keys.W)) { Mensagem = "w"; }
                if (Teclado.IsKeyDown(Keys.X) && TeclaAnterior.IsKeyUp(Keys.X)) { Mensagem = "x"; }
                if (Teclado.IsKeyDown(Keys.Y) && TeclaAnterior.IsKeyUp(Keys.Y)) { Mensagem = "y"; }
                if (Teclado.IsKeyDown(Keys.Z) && TeclaAnterior.IsKeyUp(Keys.Z)) { Mensagem = "z"; }
            }
           
            if (Teclado.IsKeyDown(Keys.Space) && TeclaAnterior.IsKeyUp(Keys.Space)) { Mensagem = " "; }


            return Mensagem;
        }

        /// <summary>
        /// Método para apagar letras utilizando o Backspace ou toda a mensagem utilizando o Delete.
        /// </summary>
        /// <param name="Mensagem">Mensagem a ser alterada.</param>
        /// <returns>Mensagem após a alteração.</returns>
        public string Apagar(string Mensagem)
        {
            Teclado = Keyboard.GetState();

            if (Teclado.IsKeyDown(Keys.Delete) && TeclaAnterior.IsKeyUp(Keys.Delete))
            {
                Mensagem = "";
            }

            if (Teclado.IsKeyDown(Keys.Back) && TeclaAnterior.IsKeyUp(Keys.Back))
            {
                if (Mensagem.Length > 1)
                {
                    Mensagem = Mensagem.Remove(Mensagem.Length - 1);
                }
                else
                {
                    Mensagem = "";
                }
            }

            return Mensagem;
        }

        /// <summary>
        /// Método para alternar entre MAIUSCULAS e minusculas utilizando os Shifts.
        /// </summary>
        public void MaiusculaMinuscula()
        {
            Teclado = Keyboard.GetState();

            if (Teclado.IsKeyDown(Keys.LeftShift) || Teclado.IsKeyDown(Keys.RightShift))
            {
                this.Maiuscula = true;
            }
            if (Teclado.IsKeyUp(Keys.LeftShift) && Teclado.IsKeyUp(Keys.RightShift))
            {
                this.Maiuscula = false;
            }
        }
    }
}

--------------------------------------------------------------------

O objeto foi instanciado no início da Game 1

CaixaDeTexto Nome = new CaixaDeTexto();


O trecho abaixo é um exemplo de utilização de um objeto instanciado dentro do update do jogo:

 protected override void Update(GameTime gameTime)
        {
            // Aqui a mágica acontece

            Nome.MaiusculaMinuscula();
            strTeste = Nome.Apagar(strTeste);
            strTeste += Nome.Escrever();

            Nome.TeclaAnterior = Nome.Teclado;
           

           
            base.Update(gameTime);
        }


E é isso. Aguardo respostas e melhorias. Espero poder ajudar alguém com isso aqui...

Abraços!!!


Marcos Dobrowolski
 
Nova Entrada 8/1/2009 8:49
  jalf
137 tópicos
Iniciante




Re: Permitir que o usuário escreva textos... 
Muito legal...eu só mudaria os 'IF's' onde você verifica qual a tecla pressionada...penso que ao invés de um monte de IF's poderia colocar essas informações em um vetor não? Ficaria mais elegante...
Microsoft Most Valuable Professional e Administrador do Sharpgames.
 
Nova Entrada 8/1/2009 11:18
  lucianoJose
194 tópicos
Iniciante


Re: Permitir que o usuário escreva textos... 
Modificado Por lucianoJose  em 8/1/2009 10:19:53)

oi pessoal,

Dobrowolski, eu fiz um exemplo para você, utilizando a Tabela AsCii e LINQ. O exemplo abaixo ele permiti que o usuário escreve apenas letras entre 'A'e 'Z'.

Eu copiei e colei todo o código do Game1.cs só faltou os "namespaces":

namespace WindowsGame1
{
 
    public class MyTextBox
    {
        KeyboardState currentKeyboardState;
        KeyboardState lastKeyboardState;
        StringBuilder text;    
 
        public MyTextBox()
        {
            this.text = new StringBuilder();
        }
 
        public string Text
        {
            get { return this.text.ToString(); }
        }
 
        public void GetKeyBoardKeys()
        {
            Keys[] keys = currentKeyboardState.GetPressedKeys();
            Keys[] keys2 = lastKeyboardState.GetPressedKeys();
 
            //Na tabela Ascii, a letra 'A' tem valor 65 e a letra 'Z' tem valor 90.            
            var items = keys.Where(i => (int)i >= 65 && (int)i <= 90 
&& !keys2.Contains(i));           
 
            foreach (var item in items)
            {
                text.Append(item);
            }
 
            if (currentKeyboardState.IsKeyDown(Keys.Back) && lastKeyboardState.IsKeyUp(Keys.Back))
            {
                if (this.text.Length > 0)
               {
                    this.text.Remove(text.Length - 1, 1);
                }
            }
 
            if (currentKeyboardState.IsKeyDown(Keys.Delete))
            {
                this.text.Length = 0;
            }
        }
 
        public void Update()
        {
            lastKeyboardState = currentKeyboardState;
 
            currentKeyboardState = Keyboard.GetState();           
        }
    }
 
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        MyTextBox myTextBox;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
 
            Content.RootDirectory = "Content";
 
            this.myTextBox = new MyTextBox();
        }
 
        protected override void Update(GameTime gameTime)
        {
            this.myTextBox.Update();
 
            this.myTextBox.GetKeyBoardKeys();
 
            this.Window.Title = myTextBox.Text;          
 
            base.Update(gameTime);
        }
    }
}

Sugestões de melhoria:
Você pode incrementar sua classe dando a ela o poder de ser "SingleLine" ou "MultiLine". Implementa também o máximo de letras por linha.

Administrador do SharpGames.
 
Nova Entrada 8/6/2009 21:12
  Cloudwsy
31 tópicos
8th Level Poster


Re: Permitir que o usuário escreva textos... 
Eu estou usando o Visual Studio 2005, e ele não está reonhecendo o 'var'..

Que biblioteca tenho que incluir para funcionar??
 
Nova Entrada 8/6/2009 22:43
  lucianoJose
194 tópicos
Iniciante


Re: Permitir que o usuário escreva textos... 
 Cloudwsy escreveu
Eu estou usando o Visual Studio 2005, e ele não está reonhecendo o 'var'..

Que biblioteca tenho que incluir para funcionar??


A utilização de uma variável do tipo "var" no C#, está disponível a partir da versão do C# 3.0, logo você vai precisar usar o Visual Studio 2008 para usar o C# 3.0, e por fim, o que você deseja, que é uma variável do tipo "var".

abraços

Administrador do SharpGames.
 
Anterior Anterior
 
Próximo Próximo
  Forum  Criação de Jogo...  Algoritmos  Permitir que o usuário escreva textos...
Novatec
Promoção Novatec
Logos do XBox 360, XNA e Games For Windows
Copyright 2010 por SharpgamesPolítica de Privacidade  |  Termos de Uso