Interacciones táctiles en el desarrollo de juegos para Windows Phone 7 Parte 2 Multitouch

Actualización de la página :
Fecha de creación de la página :

¡Programación! - 2.Prueba multi-touch

Acerca de este ejemplo

Aquí, me gustaría explicar el programa para realizar la entrada multitáctil. En Windows Phone 7, la entrada multitáctil a través del panel táctil es uno de los elementos más importantes para la entrada del usuario. Esto se debe a que, a diferencia de Windows y Xbox 360, la interfaz de entrada principal es el "panel táctil". Puede haber teléfonos Windows con teclados, pero, por supuesto, no siempre los tienen. Por lo tanto, para que el juego funcione en cualquier Windows Phone, debe ser táctil.

Si limita el panel táctil a "un solo toque", los tipos de juegos que se pueden hacer inevitablemente se verán limitados cuando se trata de hacer juegos. Piense en una consola de juegos portátil (puede dejarla estacionaria). La mayoría de las consolas de juegos requieren que sostengas el controlador de juegos (o consola real) con ambas manos y presiones varios botones al mismo tiempo.

Windows Phone 7 no tiene tantos botones como los controladores de juegos, y no necesariamente tiene un teclado. Por lo tanto, las teclas y botones virtuales se pueden colocar en la pantalla, y al presionarlos, es inconveniente porque no se pueden presionar simultáneamente con un solo toque.

Por supuesto, además del ejemplo de botón virtual anterior, el multitáctil es necesario para juegos en los que varias personas operan una pantalla, como "pellizcar y estirar (mover dos puntos más cerca o más lejos)" que es común en multitáctil.

Por cierto, la introducción es larga, pero en esta muestra, me gustaría adquirir información multitáctil utilizando una clase dedicada a los paneles táctiles. Es divertido crear una muestra que se pueda reproducir con multi-touch de repente, pero primero me gustaría averiguar qué tipo de información se puede obtener con multi-touch. Hay algunos hábitos, por lo que al conocerlos primero, puede reducir el tiempo dedicado a investigar la causa, como cuando no funciona bien en la programación posterior.

Objetivos de este programa de muestra

Muestre y confirme la información cuando se realiza multitáctil.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Figura 1: La información táctil se muestra como texto cuando se toca

Programa - Declaración de campos

Los campos deben tener la etiqueta TouchPanelCapabilities Structure y TouchCollection Structure.

/// <summary>
///  スプライトでテキストを描画するためのフォント
/// </summary>
SpriteFont font;

/// <summary>
///  タッチパネルの機能情報
/// </summary>
TouchPanelCapabilities capabilities;

/// <summary>
///  取得したタッチ情報の一覧
/// </summary>
TouchCollection touches;

La "estructura TouchPanelCapabilities" es una estructura que puede tener las funciones del propio panel táctil como parámetros. Se utiliza para comprobar si el panel táctil se puede utilizar durante la actualización.

La estructura TouchCollection contiene una lista de información sobre el estado actualmente tocado. Si se detectan varios toques, se pueden recuperar varias "estructuras de TouchLocation". Más sobre eso más adelante.

Programa - Cargando fuentes

Antes de dibujar texto en la pantalla, agregue la definición de fuente al proyecto de contenido y cárguela con el método Game.LoadContent. Esto no está directamente relacionado con los paneles táctiles, por lo que omitiré una explicación detallada.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Figura 2: Agregar "Font.spritefont" a su proyecto de contenido

// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");

Programa - Obtener información del panel táctil

Obtenga la información del panel táctil dentro del método Game.Update.

// タッチパネルの機能情報を取得
capabilities = TouchPanel.GetCapabilities();

// タッチパネルが使用可能であるかチェック
if (capabilities.IsConnected)
{
  // 現在のタッチパネルの入力情報を取得
  touches = TouchPanel.GetState();
}

Puede llamar al método "TouchPanel.GetCapabilities" para obtener la información de función del panel táctil. Hay dos tipos de información que se pueden adquirir: "¿Se puede usar el panel táctil?" y "Número máximo de puntos de contacto que puede adquirir el panel táctil". Ninguno de ellos cambia durante el juego, así que creo que no hay problema si lo obtienes según el método Game.Initialize, pero en el futuro, aparecen dispositivos que pueden quitar el panel táctil (panel táctil que se puede conectar a USB o dispositivos reales que no sean Windows Phone), y se describe en el método Update.

Además, no es necesario verificar si se puede usar el panel táctil porque siempre se puede usar en Windows Phone 7, pero al compartir código con Windows y Xbox 360, este hardware no requiere interfaces de entrada y debe verificarse.

Si puede confirmar que el panel táctil está disponible en la propiedad "TouchPanelCapabilities.IsConnected", el método "TouchPanel.GetState" obtiene el estado táctil actual.

Originalmente, parte del procesamiento de operaciones se realiza después de adquirir información táctil, pero en este ejemplo, solo se muestra la información, por lo que no se realiza ningún procesamiento adicional en el método Game.Update.

Programa - Obtenga el número máximo de puntos de contacto que puede obtener

El número máximo de puntos de contacto que se pueden recuperar es aproximadamente fijo, por lo que a menudo no es necesario recuperarlos durante el juego, pero puede obtener el número máximo de puntos de contacto que se pueden recuperar de la propiedad TouchPanelCapabilities.MaximumTouchCount. Por ejemplo, si la propiedad MaximumTouchCount es "4", no puede obtener la información de quinta posición tocando el panel táctil con cinco dedos.

El número de adquisiciones para el teléfono inteligente "HTC 7 Trophy" utilizado en esta muestra fue "4". (Por cierto, XNA Game Studio 4.0 está definido para devolver siempre 4). La especificación de Windows Phone 7 dice que es más de 4 puntos, por lo que no devuelve menos de 4).

// タッチ可能な最大数を表示
spriteBatch.DrawString(font,  
                       "MaximumTouchCount : " +
                         capabilities.MaximumTouchCount,
                       new Vector2(20, 50),
                       Color.LightGreen);

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Figura 3: Recuento de recuperación de propiedades TouchPanelCapabilities.MaximumTouchCount

Programa - Obtener información táctil

La estructura TouchCollection recuperada contiene información táctil múltiple. Por ejemplo, si tocas con dos dedos, generalmente contiene dos toques.

El número de información táctil se puede recuperar en la propiedad TouchCollection.Count. La información táctil se muestra repetidamente en la instrucción for tantas veces como se obtiene. Originalmente, no hay ningún problema para hacer un bucle con foreach, pero como usaremos el índice de matriz (índice int) en la explicación posterior, lo hacemos en bucle con for.

// タッチ情報の数だけループする
for (int index = 0; index < touches.Count; index++)
{
  // 指定したインデックスのタッチ情報取得
  TouchLocation tl = touches[index];

  // タッチ情報を可視化
  string mes = "Index : " + index + Environment.NewLine +
               "Id : " + tl.Id + Environment.NewLine +
               "Position : " + tl.Position + Environment.NewLine +
               "State : " + tl.State;

  // 文字の描画
  spriteBatch.DrawString(font,
                         mes,
                         new Vector2(30 + (index % 4) * 10,
                                     80 + index * 140),
                         Color.White);
}

Ahora, cada información táctil se obtiene como una estructura "TouchLocation". Si está en bucle con for, se puede obtener con "TouchCollection[index]". (También puede obtener la estructura "TouchLocation" directamente en primer plano).

Los siguientes cuatro tipos de información se pueden obtener de la estructura "TouchLocation", y cada información se muestra en el ejemplo.

Cuando realmente lo ejecuta, la información táctil se muestra como se muestra a continuación. Como estás tocando con tres dedos, puedes ver tres toques. Por cierto, si tocas con cinco dedos, solo verás hasta cuatro. (Porque el número máximo de adquisiciones es 4)

図 4 :3 本の指でタッチしているところ
Figura 4: Tocar con tres dedos

Programa - Cosas a tener en cuenta al recuperar información táctil 1 (índice e ID)

Mencioné anteriormente que hay cosas a tener en cuenta cuando se trata de información táctil, pero la primera es "índice" e "ID". Un índice simplemente se refiere a un índice de matriz.

Creo que es más fácil de entender si lo pruebas en una máquina real que explicarlo por escrito. Por ejemplo, digamos que operas con dos dedos, "dedo índice" y "dedo medio", y tocas primero con el dedo índice.

図 5 :人差し指でタッチ
Figura 5: Toque con el dedo índice

Como se muestra en la pantalla, el índice será "0". Luego tócalo con el dedo medio.

図 6 :中指でタッチ
Figura 6: Toque con el dedo medio

En este estado, está tocando con dos dedos, por lo que se muestran dos piezas de información. El índice tocado con el dedo medio es "1".

Levantemos nuestro dedo índice aquí. Entonces la información táctil se verá como la siguiente.

図 7 :人差し指を放す
Figura 7: Suelte el dedo índice

Como ya habrás notado, el índice de la información que estás tocando con tu dedo medio es "0". Si administra el carácter por índice cuando lo mueve, la operación anterior dará lugar a las siguientes acciones.

・ Mueve el carácter "A" con el dedo índice

・ Mueva el carácter "B" con el dedo medio en ese estado.

・ Suelte el dedo índice mientras mueve el personaje con el dedo medio

・ El carácter controlado por el dedo medio cambia repentinamente a "A"

Otro fenómeno es que si suelta o toca repetidamente uno de los dos dedos mientras los toca, el texto del dibujo de la información del primer toque puede parpadear. Esto se debe a que el segundo dedo interrumpe el índice "0" en el momento en que lo toca o lo suelta.

Como se mencionó anteriormente, el índice y el orden de la información táctil cuando se interactúa con la función táctil no coinciden con el orden en que se tocan. Por lo tanto, si desea realizar alguna operación, no la administre en el índice TouchCollection.

Lo que se debe administrar es que la estructura "TouchLocation" tenga una propiedad "Id", y el Id se reescriba con un nuevo valor cada vez que se toca, pero la relación entre el punto de contacto y el ID está garantizada mientras se toca, por lo que lo administraremos.

Por supuesto, esto no significa que tenga que administrarlo por identificación, y en algunos casos, la posición táctil por sí sola es suficiente. Por ejemplo, si solo toca un botón en la pantalla, puede determinar que presionó un botón verificando la posición táctil independientemente del ID. Sin embargo, cuando se incluye el procesamiento de arrastre, la posición siempre cambia, por lo que creo que aún debe determinarse por ID.

Programa - Cosas a tener en cuenta al adquirir información táctil 2 (número de información táctil adquirida)

Aunque no está incluido en el programa del artículo, el ejemplo dibuja la cadena "GetMaxTouchCount" en la parte inferior de la pantalla y "el número máximo de información táctil adquirida al mismo tiempo". Esto ha mostrado el número máximo de información táctil adquirida por el método "TouchPanel.GetState" en el pasado, pero en esta máquina de prueba, la propiedad "TouchPanelCapabilities.MaximumTouchCount" es 4, por lo que el valor máximo que se muestra aquí suele ser 4. Si pones cinco dedos sobre él, seguirá siendo 4.

図 8 :5 本の指を置いたときの数値
Figura 8: Número de cinco dedos

Hagamos un pequeño experimento. Intente repetir el panel táctil con varios dedos a alta velocidad. Depende de la máquina de prueba, pero el número puede exceder 4 antes de que te des cuenta.

図 9 :GetMaxTouchCount が 4 を超えている
Figura 9: GetMaxTouchCount es mayor que 4

De hecho, la información táctil adquirida por el método "TouchPanel.GetState" no es la información táctil en el momento de llamar al método "TouchPanel.GetState", sino que el momento en que la toca y el momento en que la libera desde el último tiempo de actualización se almacenan en caché. Por lo tanto, aunque se pueden detectar hasta cuatro toques al mismo tiempo, volver a tocar el mismo dedo se trata como un toque independiente, por lo que se puede obtener más información táctil que TouchPanelCapabilities.MaximumTouchCount.

Por lo tanto, incluso si TouchPanelCapabilities.MaximumTouchCount es 4, si el número de elementos de matriz de datos relacionados con la función táctil se fija en 4, puede producirse un error de exceso de índice según el método de procesamiento.

Por cierto, en la ayuda de XNA Game Studio, el valor máximo de la propiedad TouchCollection.Count se describe como "8", por lo que si desea corregir el número de elementos de la matriz, debe establecer el número de elementos en al menos 8. (Si piensa en futuras actualizaciones de versión, es posible que desee incluir una cláusula de protección para que el índice no se supere).

Resumen de este ejemplo

Esta vez, examinamos varios parámetros para la información obtenida de multi-touch. También confirmamos que hay algunos puntos a tener en cuenta al adquirir información del panel táctil. Basándome en este conocimiento, me gustaría explicar una muestra que realmente usa multi-touch.