Interações de toque no desenvolvimento de jogos para Windows Phone 7 Part 2 Multitouch
Programação! - 2.Tente multi-toque
Sobre esta amostra
Aqui, eu gostaria de explicar o programa para a realização de entrada multi-toque. No Windows Phone 7, a entrada multi-toque via painel de toque é um dos itens mais importantes para a entrada do usuário. Isso porque, ao contrário do Windows e Xbox 360, a interface de entrada principal é o "painel de toque". Pode haver telefones Windows com teclados, mas é claro que eles nem sempre os têm. Então, para que o jogo funcione em qualquer Windows Phone, ele precisa ser capaz de tocar.
Se você limitar o painel de toque apenas a "single touch", os tipos de jogos que podem ser feitos serão inevitavelmente limitados quando se trata de fazer jogos. Pense em um console portátil (você pode deixá-lo parado). A maioria dos consoles de jogos exige que você segure o controlador de jogo (ou console real) com ambas as mãos e pressione vários botões ao mesmo tempo.
O Windows Phone 7 não tem tantos botões quanto os controladores de jogos, e não necessariamente tem um teclado. Portanto, teclas e botões virtuais podem ser colocados na tela, e ao pressioná-los, é inconveniente porque eles não podem ser pressionados simultaneamente com apenas um único toque.
É claro que, além do exemplo de botão virtual acima, o multi-touch é necessário para jogos onde várias pessoas operam uma tela, como "beliscar e esticar (mover dois pontos mais perto ou mais longe)" que é comum em multi-toque.
A propósito, a introdução é longa, mas nesta amostra, gostaria de adquirir informações multi-touch usando uma classe dedicada a painéis sensíveis ao toque. É divertido criar uma amostra que pode ser jogada com multi-toque de repente, mas primeiro eu gostaria de descobrir que tipo de informação pode ser obtida com multi-toque. Existem alguns hábitos, por isso, conhecendo-os primeiro, você pode reduzir o tempo gasto investigando a causa, como quando não funciona bem na programação posterior.
Metas deste programa amostral
Exiba e confirme as informações quando o multi-toque for executado.
Figura 1: As informações de toque são exibidas como texto quando tocadas
Programa - Campos Declarando
Os campos devem ser rotulados de Estrutura touchpanelcapabilities e TouchCollection Structure.
<summary>
スプライトでテキストを描画するためのフォント
</summary>
SpriteFont font;
<summary>
タッチパネルの機能情報
</summary>
TouchPanelCapabilities capabilities;
<summary>
取得したタッチ情報の一覧
</summary>
TouchCollection touches;
A estrutura "TouchPanelCapabilities" é uma estrutura que pode ter as funções do próprio painel de toque como parâmetros. É usado para verificar se o painel de toque pode ser usado durante a atualização.
A estrutura TouchCollection contém uma lista de informações sobre o estado atualmente tocado. Se vários toques forem detectados, várias "estruturas de TouchLocation" podem ser recuperadas. Mais sobre isso depois.
Programa - Carregando Fontes
Antes de desenhar texto na tela, adicione a definição da fonte ao seu projeto de conteúdo e carregue-a com o método Game.LoadContent. Isso não está diretamente relacionado com painéis de toque, então vou omitir uma explicação detalhada.
Figura 2: Adicione "Font.spritefont" ao seu projeto de conteúdo
// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");
Programa - Obter informações do painel de toque
Obtenha as informações do painel de toque dentro do método Game.Update.
// タッチパネルの機能情報を取得
capabilities = TouchPanel.GetCapabilities();
// タッチパネルが使用可能であるかチェック
if (capabilities.IsConnected)
{
// 現在のタッチパネルの入力情報を取得
touches = TouchPanel.GetState();
}
Você pode chamar o método "TouchPanel.GetCapabilities" para obter as informações de função do painel de toque. Existem dois tipos de informações que podem ser adquiridas: "O painel de toque pode ser usado?" e "Número máximo de pontos de toque que podem ser adquiridos pelo painel de toque". Nenhum deles muda durante o jogo, então eu acho que não há problema se você obtê-lo pelo método Game.Initialize, mas no futuro, dispositivos que podem remover o painel de toque (painel de toque que pode ser conectado a USB ou dispositivos reais que não o Windows Phone) aparecem, e ele é descrito no método Atualização.
Além disso, não há necessidade de verificar se o painel de toque pode ser usado porque ele sempre pode ser usado no Windows Phone 7, mas ao compartilhar código com Windows e Xbox 360, esses hardwares não são interfaces de entrada necessárias e precisam ser verificados.
Se você puder confirmar que o painel de toque está disponível na propriedade "TouchPanelCapabilities.IsConnected", o método "TouchPanel.GetState" recebe o estado de toque atual.
Originalmente, algum processamento de operação é realizado após a aquisição de informações de toque, mas nesta amostra, as informações são exibidas apenas, de modo que nenhum processamento adicional é feito no método Game.Update.
Programa - Obtenha o número máximo de pontos de contato que você pode obter
O número máximo de pontos de contato que podem ser recuperados é aproximadamente fixo, por isso não é muitas vezes necessário recuperá-los durante o jogo, mas você pode obter o número máximo de pontos de toque que podem ser recuperados da propriedade TouchPanelCapabilities.MaximumTouchCount. Por exemplo, se a propriedade MaximumTouchCount for "4", você não poderá obter as informações da quinta posição tocando no painel de toque com cinco dedos.
O número de aquisições para o smartphone "HTC 7 Trophy" utilizado nesta amostra foi "4". (A propósito, o XNA Game Studio 4.0 é definido para sempre retornar 4.) A especificação do Windows Phone 7 diz que tem mais de 4 pontos, por isso não retorna menos de 4.)
// タッチ可能な最大数を表示
spriteBatch.DrawString(font,
"MaximumTouchCount : " +
capabilities.MaximumTouchCount,
new Vector2(20, 50),
Color.LightGreen);
Figura 3: TouchPanelCapabilities.MaximumTouchCount Contagem de recuperação de propriedades
Programa - Obter informações sobre toque
A estrutura touchcollection recuperada contém múltiplas informações de toque. Por exemplo, se você tocar com dois dedos, geralmente contém dois toques.
O número de informações de toque pode ser recuperado na propriedade TouchCollection.Count. As informações de toque são repetidamente exibidas na instrução para obter quantas vezes são obtidas. Originalmente, não há problema em loop com foreach, mas uma vez que usaremos o índice array (índice int) na explicação posterior, nós loop-lo com para.
// タッチ情報の数だけループする
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);
}
Agora, cada informação de toque é obtida como uma estrutura de "TouchLocation". Se estiver em looping com o for, ele pode ser obtido com "TouchCollection[índice]". (Você também pode obter a estrutura "TouchLocation" diretamente em foreach.)
Os quatro tipos seguintes de informações podem ser obtidos a partir da estrutura "TouchLocation", e cada informação é exibida na amostra.
Quando você realmente executá-lo, as informações de toque são exibidas como mostrado abaixo. Já que você está tocando com três dedos, você pode ver três toques. A propósito, se você tocar com cinco dedos, você só verá até quatro. (Como o número máximo de aquisições é de 4)
Figura 4: Tocando com três dedos
Programa - Coisas para ficar atento ao recuperar informações de toque 1 (índice e ID)
Mencionei acima que há coisas a ter em mente ao lidar com informações de toque, mas a primeira é "index" e "ID". Um índice simplesmente se refere a um índice de matriz.
Eu acho que é mais fácil de entender se você experimentá-lo em uma máquina real do que explicá-lo por escrito. Por exemplo, digamos que você opere com dois dedos, "dedo indicador" e "dedo médio", e toque com o dedo indicador primeiro.
Figura 5: Toque com dedo indicador
Como mostrado na tela, o índice será "0". Então toque com seu dedo médio.
Figura 6: Toque de dedo médio
Neste estado, você está tocando com dois dedos, então duas informações são exibidas. O índice tocado com o dedo médio é "1".
Vamos levantar o dedo indicador aqui. Em seguida, a informação de toque será como a seguinte.
Figura 7: Solte seu dedo indicador
Como você já deve ter notado, o índice das informações que você está tocando com seu dedo médio é "0". Se você gerenciar o caractere por índice ao movê-lo, a operação acima levará às seguintes ações.
◗ Mova o personagem "A" com seu dedo indicador
↓
◗ Mova o personagem "B" com o dedo médio nesse estado.
↓
◗ Solte o dedo indicador enquanto move o personagem com o dedo médio
↓
◗ O personagem controlado pelo dedo médio de repente muda para "A"
Outro fenômeno é que se você soltar ou tocar repetidamente em um dos dois dedos enquanto os toca, o texto de desenho da informação do primeiro toque pode piscar. Isso porque o segundo dedo interrompe o índice "0" no momento em que você o toca ou o libera.
Como mencionado acima, o índice e a ordem de informação de toque quando o multi-toque não correspondem à ordem em que são tocados. Portanto, se você quiser realizar qualquer operação, não as gerencie no índice TouchCollection.
O que deve ser gerenciado é que a estrutura "TouchLocation" tem uma propriedade "ID", e o ID é reescrito com um novo valor cada vez que é tocado, mas a relação entre o ponto de contato e o ID é garantida ao tocar, por isso vamos gerenciá-lo.
Claro, isso não significa que você tem que gerenciá-lo por ID, e em alguns casos, a posição de toque por si só é suficiente. Por exemplo, se você apenas tocar em um botão na tela, você pode determinar que você pressionou um botão verificando a posição de toque, independentemente do ID. No entanto, ao incluir o processamento de arrasto, a posição sempre muda, então eu acho que ainda deve ser determinado pelo ID.
Programa - Coisas a ter em mente ao adquirir informações de toque 2 (número de informações de toque adquiridas)
Embora não esteja incluído no programa do artigo, a amostra desenha a string "GetMaxTouchCount" na parte inferior da tela e "o número máximo de informações de toque adquiridas ao mesmo tempo". Isso mostrou o número máximo de informações de toque adquiridas pelo método "TouchPanel.GetState" no passado, mas nesta máquina de teste, a propriedade "TouchPanelCapabilities.MaximumTouchCount" é 4, então o valor máximo exibido aqui geralmente deve ser 4. Se você colocar cinco dedos sobre ele, ainda será 4.
Figura 8: Número de cinco dedos
Vamos fazer uma pequena experiência. Tente repetir o painel de toque com vários dedos em alta velocidade. Depende da máquina de teste, mas o número pode exceder 4 antes que você perceba.
Figura 9: GetMaxTouchCount é maior que 4
Na verdade, as informações de toque adquiridas pelo método "TouchPanel.GetState" não são as informações de toque no momento de chamar o método "TouchPanel.GetState", mas o momento em que você tocá-lo e no momento em que você liberá-lo a partir do tempo de última atualização são armazenados em cache. Portanto, mesmo que até quatro toques possam ser detectados ao mesmo tempo, tocar o mesmo dedo novamente é tratado como um toque separado, de modo que mais informações de toque podem ser obtidas do que TouchPanelCapabilities.MaximumTouchCount.
Portanto, mesmo que o TouchPanelCapabilities.MaximumTouchCount seja 4, se o número de elementos de matriz de dados relacionados ao toque for corrigido por 4, um erro de excesso de índice pode ocorrer dependendo do método de processamento.
A propósito, com a ajuda do XNA Game Studio, o valor máximo da propriedade TouchCollection.Count é descrito como "8", portanto, se você quiser corrigir o número de elementos na matriz, você deve definir o número de elementos para pelo menos 8. (Se você pensar em atualizações futuras de versão, você pode querer incluir uma cláusula de guarda para que o índice não ultrapasse.)
Resumo desta amostra
Desta vez, examinamos vários parâmetros para as informações obtidas a partir do multi-toque. Também confirmamos que existem alguns pontos a serem mente ao adquirir informações do painel de toque. Com base neste conhecimento, eu gostaria de explicar uma amostra que realmente usa multi-toque.