Ir al contenido

publicidad
publicidad

Foto

GUI en XNA


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
6 respuestas en este tema

#1

Escrito 11 octubre 2010 - 02:51

Hola, vereis, en XNA me gustaria implementar un GUI (interfaz de usuario), con sus botones, textbox y cosas de esas.

El problema es que en XNA no hay ninguna opcion para crear una GUI.

He pensado en varias opciones:

1. Usar los windowsforms (probé de intentar implementarlo, pero no se me ven). Seguramente el problema vendra de que deberia usar una ventana de windows para poder meter ahi el windowsform, pero prefiero integrarlo en el juego.

2. Crear mi propia GUI: Por ahora tnego hechos los botones, pero tengo algunas complicaciones con el textbox, pero sobretodo los Scrollbars.

Vereis, he leido que un scrollbar se ajusta a un porcentaje que será el procentaje que se ven en el recuadro respecto del total del contenido en él. Bien, parece no ser dificil, pero me gustaria saber unas cosas:

- Como podria hacer para mostar una parte de lo que contiene el textbox y borrar lo demas (borrar me refiero a que no se dibuje lo que no debe mostrarse)? He pensado en hacer como una especie de viewport, pero como digo, el problema es el no dibujo.

- Esto es opcional, pero alguien sabe como dibujar un cursor de teclado que parpadee?

Por cierto, creo que hay GUIs creadas por otros usuarios, pero preferiria no usarlas. Lo digo para que lo tengais en cuenta.

#2

Escrito 11 octubre 2010 - 09:32

En la web de creators hay un par de ejemplos de como añadir winforms en juegos XNA, pero la web lleva unos cuantos dias caidas por mantenimiento.

Un saludo

PD: Habiendo ya librerias muy bien hechas para esas cosas... porque no coges una y la usas o la extiendes? Lo digo porque al igual que hay churros, tambien hay alguna libreria muy buena como por ejemplo Nuclex

  • deviax

  • Methuselah

  • vida restante: 100%
  • Registrado: 23 mar 2005
  • Mensajes: 182
#3

Escrito 12 octubre 2010 - 19:54

Hola NullPointerException,

Como te dice rantamplan87, si encuentras una librería que te de estos controles de lujo (es más, avísame por favor ^^), aunque tampoco es tan difícil implementarlos..., te explico:

1. Si usas Windows Forms tengo entendido que te cargas la posibilidad de portarlo a xbox, además no sé si podrías integrarlo dentro de la misma ventana a lo contenedor MDI.

2. Respecto al tema de los scrollbars dependerá del tipo de contenido que quieras mostrar, pero si por ejemplo hablas de hacer scroll por una imagen, puedes usar el método SpriteBatch.Draw Method (Texture2D, Rectangle, Nullable, Color), en la definición del segundo rectángulo si le pasas null te pintaría toda la imagen, pero puedes definir un rectángulo en pixeles (cuyo origen es la esquina superior izquierda) indicando qué parte de toda la imagen quieres pintar.

En cuanto al parpadeo, puedes hacer algo como:
[code:1]//Este es el caracter que va a parpadear
Texto unTexto="|";

//Esta es la variable que dirá si se pinta el texto o no
bool mostrar=true;

//Este valor se utilizará para medir el tiempo del parpadeo, a 30 parpadeará 2 veces por segundo en condiciones normales
int CONTADOR_MAXIMO=30;

//Utilizado también para medir el parpadeo
int contador=0; [/code]

Con esas variables, en el método Update() tendrías:
[code:1]contador++; //Incrementas el contador
if(contador == CONTADOR_MAXIMO)
{ //Si el contador llega al máximo, alternamos el parpadeo
contador=0;
mostrar = !mostrar;
}[/code]

Y en el método Draw():
[code:1]if(mostrar)
unTexto.Draw();[/code]

Un saludo.

#4

Escrito 12 octubre 2010 - 20:07

Lo del scrollbar supongamos que no quiero imagenes, que quiero texto y imagenes varias (no una sola). La cosa ya es más complicada.

  • deviax

  • Methuselah

  • vida restante: 100%
  • Registrado: 23 mar 2005
  • Mensajes: 182
#5

Escrito 12 octubre 2010 - 20:29

Si haces una buena programación orientada a objetos lo veo igual de complicado.

En mi caso todo el contenido lo envuelvo en clases, es decir, tengo una clase Imagen, otra Texto, CuadroDeTexto (que es una composición de Imagen y Texto), Boton (también Imagen y Texto pero con un comportamiento distinto), etc.

Todas estas clases heredan de una clase abstracta que es Contenido y que les obliga a implementar los métodos Update y Draw más otra serie de propiedades.
Si lo haces así, en la clase Contenido puedes definir una propiedad que sea el rectángulo que quieres mostrar de ese contenido, y luego en cada método Draw que implementes en las sub-clases sólo tienes que controlarlo en función del tipo contenido final que sea.

#6

Escrito 14 octubre 2010 - 21:20

Sobre lo del cuadro del texto he pensado en hacer como un string generalizado que se dibuja, y luego al añadir otra frase de un textbox entonces se le añade un '\n' al final para hacer el salto de linea.

Ahora bien, el problema seria ir ocultando partes del texto e ir mostrando las demás y ahi me he quedado bloqueado, el ocultar/mostrar un texto más grande que el recuadro

  • deviax

  • Methuselah

  • vida restante: 100%
  • Registrado: 23 mar 2005
  • Mensajes: 182
#7

Escrito 14 octubre 2010 - 22:59

Para el texto, una opción que puedes seguir es tener en una string el texto completo (variable strTextoCompleto), tener en otra string la parte del texto que se va a mostrar en pantalla (variable strTextoMostrado), y una tercera variable que sea el porcentaje de deslizamiento actual sobre la scrollbar (variable intPorcentajeScrollbar).

Tienes un método en SpriteFont el método MeasureString que te sirve para medir el tamaño de una cadena de texto.

En este escenario y pensando en una scrollbar horizontal (aunque una idea similar se podría aplicar en vertical), utilizando intPorcentajeScrollbar y el tamaño de la cadena calculado con MeasureString, puedes calcular en que parte del strTextoCompleto te deberías encontrar y volcar a partir de esa parte del texto en strTextoMostrado el texto de strTextoCompleto hasta que alcances el ancho del control sobre el que estás escribiendo el texto.

Este cálculo lo podrías realizar en cada bucle Update, y lo único que tendrías que hacer es mantener la variable intPorcentajeScrollbar actualizada con el desplazamiento actual, e incluso para minimizar la necesidad de cálculo podrías añadir una 4 variable booleana que indique cuando se ha interactuado con la barra de scroll y sólo calcularlo si se ha desplazado el scroll.

No sé si te servirá la idea...


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
publicidad
publicidad