2. Agenda
Mostrar el inicio de la creación de un juego.
Algoritmos y como testear y mejorar uno.
Averiguar como un programa puede detectar cambios
del estado de los botones de un gamepad.
Crear un programa que cuente los eventeos para crear
un juego llamado:”Button Bashing”
3. Crear un juego
Hasta ahora conocemos como están estructurados los
juegos en XNA y como se adiciona el código c# dentro
de los métodos que controlan el juego.
Podemos leer la entrada del usuario utilizando un
gamepad.
Podido mostrar mensajes de texto en la pantalla bajo el
control del programa.
Ahora vamos a crear nuestro primer (propio) juego.
Hay muchos juegos comerciales basados en la idea de
este juego
4. La idea del juego
La idea de este juego es ver
cuantas veces un jugador
puede presionar un botón en
10 segundos.
Hay un gran número de juegos
que simulan deportes que
trabaja con este método
Muchos juegos tienen este tipo
de juego como un “mini juego”
5. El diseño del juego
Este juego puede incrementar un contador cada vez
que uno de los botones del gamepad es presionado y
soltado.
Eso significa que necesitamos una variable contador
que almacena el valor actual del contador.
Cada vez que el método update detecta la presión de
un botón, el contador será incrementado.
El método Draw dibujará el valor actual del contador.
La versión final del juego tiene un contador para cada
Botón del gamepad, por lo que el juego puede soportar
la acción de múltiples jugadores.
6. Iniciando la versión para un solo
jugador
Sus vamos a comenzar haciendo una versión del juego
para un solo jugador.
Podemos expandir luego de soporte para múltiples
jugadores por juego y aún para múltiples gamepad.
El juego soportara eventualmente hasta 16 jugadores.
Comenzar con soporte para un jugador, mantendrá las
cosas simples.
7. El mundo del juego para Button
Bash
El mundo del juego tiene dos items.
La variable count que almacena el número de presiones.
La variable font utilizada para dibujar texto.
La variable count es del tipo int y puede almacenar
valores hasta 4,000,000,000
Esto debería ser suficiente para la mayoría de
jugadores
// Game World
SpriteFont font;
int count;
8. Limpiar el contador al inicio del
juego
Al inicio del juego el valor de count debe ser cero.
Podemos utilizar el botón Start del gamepad.
Cuando el boton Start es presionado c el valor de count
es configurado de nuevo a cero
GamePadState pad1 = GamePad.GetState(PlayerIndex.One);
if (pad1.Buttons.Start == ButtonState.Pressed)
{
count = 0;
}
9. Mostrar el contador dentro del
método Draw
El método Draw contiene el código necesario para
dibujar en pantalla el valor actual de count.
Utilizamos el método ToString proveído por la variable
count para obtener una versión de texto del valor
almacenado
string countString = count.ToString();
Vector2 countVector = new Vector2(50, 400);
spriteBatch.Begin();
spriteBatch.DrawString(font, countString,
countVector, Color.Red);
spriteBatch.End();
10. Contar las veces que se presiona
El método Update es donde el estado del juego debe
ser actualizado.
Si el botón ha sido presionado el contador debe de
incrementarse ninguno
if (pad1.Buttons.B == ButtonState.Pressed)
{
count++;
}
12. Encontrando el fallo
Sabemos que el método Update es llamado 60 veces en
un segundo.
Cada vez que el método es llamado, verificamos el
botón B del gamepad e incrementamos el contador si
el botón esta presionado.
Pero esto no lo que queremos.
Queremos incrementar el contador cuando el botón
cambie de estado de arriba hacia abajo, y no sólo
cuando el botón esté presionado.
13. Señales y límites
El contador no debe de incrementarse cuando el botón
este presionado abajo.
Debe incrementarse justo cuando es presionado.
El programa puede detectar este límite.
Todos los teclados trabajan de manera similar.
14. Detectando un límite
La segunda vez que el método Update es llamado el
estado del voto ha cambiado de arriba hacia abajo.
El juego debe detectar este cambio
15. Mundo del juego para la prueba
del Button Bash
El mundo del juego ahora contiene una variable extra.
Esta registra el estado previo del gamapad.
Esto permite al juego comparar el estado actual del
estado de una tecla con previo estado.
El código en el método Update puede testear un
cambio de estado del botón.
// Game World
SpriteFont font;
int count;
GamePadState oldpad1;
16. Un algoritmo de detección de limites
Un algoritmo es la manera de resolver un problema.
El algoritmo de detección es:
“Si el estado previo del botón es arriba y el estado actual
del botón estaba, el contador debe ser incrementado ”
Ahora necesitamos convertir este algoritmo a un
lenguaje como C# y luego adicionarlo al método
Update
17. El código
Este es el código que implementa el algoritmo.
Este incrementará el Valor de la variable count
solución botón ha cambiado de estado de liberado a
presionado.
Note que además almacena el estado antiguo para la
siguiente llamada del método Update
if ( oldpad1.Buttons.B == ButtonState.Released &&
pad1.Buttons.B == ButtonState.Pressed )
{
count++;
}
oldpad1 = pad1; // remember the state for next time
19. Fallos y algoritmos
La primera versión del juego no trabajaba porque el
algoritmo estaba erróneo.
Nuestro entendimiento de cómo solventar el problema
estaba erróneo
Este es el peor tipo de terror en programación.
Con frecuencia un programa trabajará bien hasta que
se obtengan valores para los cuales no se diseñó:
La edad de 1 millón en un programa de pensiones
La presión de -50 en un cálculo de descuento
20. Resumen
La primera idea que obtenemos para implementado un
juego puede no ser la que sea funcional.
La descripción de la solución al problema que es
llamada algoritmo
Algunas entradas al programa serán por niveles (alto o
bajo) y otros serán eventos (cambio del estado).
Para que un juego XNA detecte cambios en el estado,
debe contener datos del mundo del juego para retener
el estado previo del juego
21. Verdadero o falso
Un algoritmo debe ser escrito en C#
Para detectar el nivel de un signo, un programa debe
retener el valor del predio signo
Un programa XNA puede solamente detectar límites
de un solo botón del gamepad
El método Update en los juegos XNA es llamado 60
veces en un segundo
22. Verdadero o falso
Un algoritmo debe ser escrito en C#
Para detectar el nivel de un signo, un programa debe
retener el valor del predio signo
Un programa XNA puede solamente detectar límites
de un solo botón del gamepad
El método Update en los juegos XNA es llamado 60
veces en un segundo
23. Verdadero o falso
Un algoritmo debe ser escrito en C#
Para detectar el nivel de un signo, un programa debe
retener el valor del predio signo
Un programa XNA puede solamente detectar límites
de un solo botón del gamepad
El método Update en los juegos XNA es llamado 60
veces en un segundo
24. Verdadero o falso
Un algoritmo debe ser escrito en C#
Para detectar el nivel de un signo, un programa debe
retener el valor del predio signo
Un programa XNA puede solamente detectar límites
de un solo botón del gamepad
El método Update en los juegos XNA es llamado 60
veces en un segundo
25. Verdadero o falso
Un algoritmo debe ser escrito en C#
Para detectar el nivel de un signo, un programa debe
retener el valor del predio signo
Un programa XNA puede solamente detectar límites
de un solo botón del gamepad
El método Update en los juegos XNA es llamado 60
veces en un segundo
26.
27. Agenda de trabajo
Construir un juego que cuente el número de veces que
se presiona un botón en particular.
Extender el juego para permitir que varios jugadores
compitan al mismo tiempo.
Crear un juego que automáticamente en reaccione
cuando un jugador se integra.
Averiguar cómo utilizar la compilación condicionar
para hacer programas más fáciles de probar
28. Extendiendo a cuatro jugadores
La presente versión del
botón solamente trabajar
con un jugador.
El siguiente paso es
extender este soporte
para cuatro jugadores en
un solo juego.
Cada jugador debe
presionar un botón.
Es posible adicionarlo
más si así se desea.
29. Variables contador para el
Gamepad 1
Cada una de estas variables almacenada un Valor de
contado para uno de los botones del gamepad1.
El identificador de la variable ha sido seleccionador
para ser claro, que botón va a trabajar esa variable
Se crearán variables como nombres similares para
otros gamepad
int acount1;
int bcount1;
int xcount1;
int ycount1;
30. Va configurando las posiciones en
donde se mostraran
Cada una de las variables
contadores debe ser mostrado
en la pantalla.
El mundo del juego también
contienen una posición a
mostrar para cada valor
Estos son arregladas en la
misma posición que tienen
dentro de un gamepad
int acount1;
int bcount1;
int xcount1;
int ycount1;
31. Comportamiento del método
Update
El comportamiento del mercado es solamente activar
sí el gamepad es conectado
pad1 = GamePad.GetState(PlayerIndex.One);
if (pad1.IsConnected)
{
if (oldpad1.Buttons.A == ButtonState.Released &&
pad1.Buttons.A == ButtonState.Pressed)
{
acount1++;
}
// repeat for the other gamepad buttons
}
32. Comportamiento del método draw
Los contadores son mostrados sí el Gamepad es
conectado
El valor de Pad1 es parte de las variables del ,mundo
del juego
if (pad1.IsConnected)
{
spriteBatch.DrawString(font, acount1.ToString(),
apos1, Color.Green);
spriteBatch.DrawString(font, bcount1.ToString(),
bpos1, Color.Red);
spriteBatch.DrawString(font, xcount1.ToString(),
xpos1, Color.Blue);
spriteBatch.DrawString(font, ycount1.ToString(),
ypos1, Color.Yellow);
}
33. Demostración
En esta versión del juego soportar hemos hasta cuatro
Gamepad
Solamente muestra valores para los Gamepad que han
sido conectados
34. Diseño del programa
Esta versión del programa trabajo bien.
Puede soportar hasta dieciséis jugadores.
Sin embargo, el diseño no es tan bueno, ya que las
mismas sentencia se repiten entrada en Gamepad
Cualquier falla en el programa debe ser corregido cuatro
veces.
Luego vamos a ver, diseñar un programa con código
que pueda ser rehusado
35. Diseño de prueba
La versión final del juego trabajará con hasta cuatro
Gamepad
Sin embargo, cuando hacemos la prueba
probablemente no tengamos disponible los cuatro
Gamepad
Es necesario encontrar alguna manera de probar el
programa sin la necesidad de todo el hardware
Este diseño de pruebas, es muy importante cuando
creamos proyectos de gran escala
36. Prueba con un solo Gamepad
Una manera de probar con un solo Gamepad es copiar
el Valor del primer Gamepad dentro de la variable que
es utilizada por el segundo
// test code – copy the value of pad1 into pad2
pad2 = pad1;
if (pad2.IsConnected)
{
// code for gamepad 2
}
37. Utilizando una compilación
condicional
Necesitamos adicionarlo sentencias para permitir al
juego ser probado con un solo Gamepad
Las sentencias copian los datos del Gamepad uno
dentro de las variables Gamepad de los otros que se
utilizan.
Esto nos permite prorrogar la versión de cuatro
jugadores del juego con un solo Gamepad.
Sin embargo, necesitamos recordar que queremos
quitar las sentencias de pruebas antes de enviar el
juego finalizado
38. Uso de la directiva condicional #if
Esto luce como una decisión de un programa cuando este
apartado, pero no es lo que está pasando.
El código fuente puede contener directivas de pre
procesador
Un directiva de la pre procesador se inicia con el carácter #
La directiva #if controla que código es compilador a
#if test
// test code - copy the value of pad1 into pad4
pad4 = pad1;
#endif
39. El proceso de compilación
El trabajo de compilar es tomar el código C# y
convertirlo a instrucciones de bajo nivel la que se
utilizan en la plataforma seleccionada.
El pre procesador es el frente del compilador y procesa
el código fuente antes de que este alcance al
compilador
...
#if test
// test code
pad4 = pad1;
#endif
...
Pre-processor
Compiler
Low
Level
Instructions
40. La directiva de compilación
condicional
Las directivas de pre procesador comienzan con el carácter
#.
Si el símbolo test la ha sido definido, el pre procesador
pasara la asignación de sentencia dentro del compilador y
aparecerá la en la salida que el compilador genera.
Síel símbolo test no está definido en la sentencia no pasará
al compilador
#if test
// test code - copy the value of pad1 into pad4
pad4 = pad1;
#endif
41. Definiendo un símbolo
Los símbolos son definidos al inicio del programa.
#define es el comando de pre procesador para definir
un símbolo.
El símbolo puede ser utilizado para controlar una
compilación condicional.
Es posible definir tanto símbolos como se desee en
dentro de un programa
#define test
43. Uso de la compilación condicional
Cuando un programa es creado, es muy buena idea
decidir cómo va a ser probado.
Muchos de los juegos utilizan compilación condicional
para permitir que pequeños códigos sean movidos a
través de el código.
Los juegos además utiliza una compilación condicional
para hacer más fácil la producción de versiones demo
de un juego
44. Resumen
Es posible escalar un programa replicando el mismo
código para adicionar comportamientos.
Sin embargo, desde un buen punto de diseño
extradición no es la mejor manera para escribir
programas.
Cuando creamos un programa es necesario poner
atención a cómo éste será aprobado.
Es posible utilizar la compilación condicional para
adicionar pruebas de código que pueden ser fácilmente
intercambiables cuando un programa es construido
45. Verdadero o falso
La propiedad IsConnected de una variable
Gamepadstate permite a los juegos determinar si aún
Gamepad está conectado a la consola
Para que un juego se ejecute debe tener conectado al
menos un Gamepad
La compilación condicional es administrado por el
compilador llamado pre procesador
Los comandos del pre procesador comienzan como el
carácter #
46. Verdadero o falso
La propiedad IsConnected de una variable
Gamepadstate permite a los juegos determinar si aún
Gamepad está conectado a la consola
Para que un juego se ejecute debe tener conectado al
menos un Gamepad
La compilación condicional es administrado por el
compilador llamado pre procesador
Los comandos del pre procesador comienzan como el
carácter #
47. Verdadero o falso
La propiedad IsConnected de una variable
Gamepadstate permite a los juegos determinar si aún
Gamepad está conectado a la consola
Para que un juego se ejecute debe tener conectado al
menos un Gamepad
La compilación condicional es administrado por el
compilador llamado pre procesador
Los comandos del pre procesador comienzan como el
carácter #
48. Verdadero o falso
La propiedad IsConnected de una variable
Gamepadstate permite a los juegos determinar si aún
Gamepad está conectado a la consola
Para que un juego se ejecute debe tener conectado al
menos un Gamepad
La compilación condicional es administrado por el
compilador llamado pre procesador
Los comandos del pre procesador comienzan como el
carácter #
49. Verdadero o falso
La propiedad IsConnected de una variable
Gamepadstate permite a los juegos determinar si aún
Gamepad está conectado a la consola
Para que un juego se ejecute debe tener conectado al
menos un Gamepad
La compilación condicional es administrado por el
compilador llamado pre procesador
Los comandos del pre procesador comienzan como el
carácter #