Berøringsinteraktioner i spiludvikling til Windows Phone 7 Del 2 Multitouch

Side opdateret :
Dato for oprettelse af side :

Programmering! - 2.Prøv multi-touch

Om denne prøve

Her vil jeg gerne forklare programmet til realisering af multi-touch input. I Windows Phone 7 er multi-touch-input via berøringspanel et af de vigtigste elementer til brugerinput. Dette skyldes, at i modsætning til Windows og Xbox 360 er hovedindgangsgrænsefladen "berøringspanelet". Der kan være Windows-telefoner med tastaturer, men selvfølgelig har de dem ikke altid. Så for at spillet skal fungere på enhver Windows Phone, skal det være berøringsdygtigt.

Hvis du begrænser berøringspanelet til kun "single touch", vil de typer spil, der kan laves, uundgåeligt være begrænsede, når det kommer til at lave spil. Tænk på en håndholdt spilkonsol (du kan lade den stå stille). De fleste spilkonsoller kræver, at du holder spilcontrolleren (eller den faktiske konsol) med begge hænder og trykker på flere knapper på samme tid.

Windows Phone 7 har ikke så mange knapper som spilcontrollere, og den har ikke nødvendigvis et tastatur. Derfor kan virtuelle taster og knapper placeres på skærmen, og når du trykker på dem, er det ubelejligt, fordi de ikke kan trykkes samtidigt med kun et enkelt tryk.

Ud over eksemplet med den virtuelle knap ovenfor er multi-touch naturligvis nødvendigt for spil, hvor flere personer betjener en skærm, såsom "klem og stræk (flyt to punkter tættere eller længere fra hinanden)", der er almindeligt i multi-touch.

Forresten er introduktionen lang, men i denne prøve vil jeg gerne erhverve multi-touch-information ved hjælp af en klasse dedikeret til berøringspaneler. Det er sjovt at lave en prøve, der pludselig kan spilles med multi-touch, men først vil jeg gerne finde ud af, hvilken slags information der kan opnås med multi-touch. Der er nogle vaner, så ved at kende dem først, kan du reducere den tid, der bruges på at undersøge årsagen, som når det ikke fungerer godt i programmering senere.

Mål for dette prøveprogram

Vis og bekræft oplysningerne, når multi-touch udføres.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Figur 1: Berøringsoplysninger vises som tekst, når der berøres

Program - Erklæring af felter

Felterne skal mærkes TouchPanelCapabilities Structure og TouchCollection Structure.

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

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

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

"TouchPanelCapabilities-strukturen" er en struktur, der kan have funktionerne i selve berøringspanelet som parametre. Det bruges til at kontrollere, om berøringspanelet kan bruges under opdatering.

TouchCollection-strukturen indeholder en liste over oplysninger om den aktuelt berørte tilstand. Hvis der registreres flere berøringer, kan flere "TouchLocation-strukturer" hentes. Mere om det senere.

Program - Indlæsning af skrifttyper

Før du tegner tekst på skærmen, skal du tilføje skrifttypedefinitionen til dit indholdsprojekt og indlæse den med Game.LoadContent-metoden. Dette er ikke direkte relateret til berøringspaneler, så jeg vil udelade en detaljeret forklaring.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Figur 2: Tilføj "Font.spritefont" til dit indholdsprojekt

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

Program - Få oplysninger om berøringspanelet

Få oplysninger om berøringspanelet i Game.Update-metoden.

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

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

Du kan ringe til metoden "TouchPanel.GetCapabilities" for at få funktionsoplysningerne for berøringspanelet. Der er to typer oplysninger, der kan erhverves: "Kan berøringspanelet bruges?" og "Maksimalt antal berøringspunkter, der kan erhverves af berøringspanelet." Ingen af dem ændres under spillet, så jeg tror, der ikke er noget problem, hvis du får det i henhold til Game.Initialize-metoden, men i fremtiden vises enheder, der kan fjerne berøringspanelet (berøringspanel, der kan tilsluttes USB eller faktiske enheder bortset fra Windows Phone), og det er beskrevet i opdateringsmetoden.

Der er heller ikke behov for at kontrollere, om berøringspanelet kan bruges, fordi det altid kan bruges på Windows Phone 7, men når du deler kode med Windows og Xbox 360, er denne hardware ikke påkrævet inputgrænseflader og skal kontrolleres.

Hvis du kan bekræfte, at berøringspanelet er tilgængeligt i egenskaben "TouchPanelCapabilities.IsConnected", får metoden "TouchPanel.GetState" den aktuelle berøringstilstand.

Oprindeligt udføres en vis operationsbehandling efter erhvervelse af berøringsoplysninger, men i dette eksempel vises oplysninger kun, så der udføres ingen yderligere behandling i Game.Update-metoden.

Program - Få det maksimale antal berøringspunkter, du kan få

Det maksimale antal berøringspunkter, der kan hentes, er nogenlunde fast, så det er ikke ofte nødvendigt at hente dem under spillet, men du kan få det maksimale antal berøringspunkter, der kan hentes fra egenskaben TouchPanelCapabilities.MaximumTouchCount. Hvis egenskaben MaximumTouchCount f.eks. er "4", kan du ikke få oplysninger om femte position ved at røre ved berøringspanelet med fem fingre.

Antallet af erhvervelser til smartphone "HTC 7 Trophy", der blev brugt i denne prøve, var "4". (Forresten er XNA Game Studio 4.0 defineret til altid at returnere 4.) Windows Phone 7-specifikationen siger, at den er mere end 4 point, så den returnerer ikke mindre end 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Figur 3: TouchPanelCapabilities.MaximumTouchCount Property Retrieval Count

Program - Få oplysninger om berøring

Den hentede TouchCollection-struktur indeholder flere berøringsoplysninger. For eksempel, hvis du rører med to fingre, indeholder den normalt to berøringer.

Antallet af berøringsoplysninger kan hentes i egenskaben TouchCollection.Count. Berøringsoplysninger vises gentagne gange i for-sætningen så mange gange, som de opnås. Oprindeligt er der ikke noget problem at loope med foreach, men da vi vil bruge array-indekset (int-indeks) i den senere forklaring, looper vi det med 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);
}

Nu opnås hver berøringsinformation som en "TouchLocation" -struktur. Hvis det looper med for, kan det fås med "TouchCollection[index]". (Du kan også få "TouchLocation" -strukturen direkte i foreach.)

Følgende fire typer oplysninger kan fås fra "TouchLocation" -strukturen, og hver information vises i prøven.

Når du rent faktisk kører det, vises berøringsoplysningerne som vist nedenfor. Da du rører med tre fingre, kan du se tre berøringer. Forresten, hvis du rører med fem fingre, vil du kun se op til fire. (Fordi det maksimale antal erhvervelser er 4)

図 4 :3 本の指でタッチしているところ
Figur 4: Berøring med tre fingre

Program - Ting, du skal være opmærksom på, når du henter berøringsoplysninger 1 (indeks og ID)

Jeg nævnte ovenfor, at der er ting at huske på, når man beskæftiger sig med berøringsoplysninger, men den første er "indeks" og "ID". Et indeks refererer simpelthen til et matrixindeks.

Jeg tror, det er lettere at forstå, hvis du prøver det på en faktisk maskine end at forklare det skriftligt. Lad os for eksempel sige, at du opererer med to fingre, "pegefinger" og "langfinger", og først rører ved pegefingeren.

図 5 :人差し指でタッチ
Figur 5: Tryk med pegefingeren

Som vist på skærmen vil indekset være "0". Rør derefter ved den med langfingeren.

図 6 :中指でタッチ
Figur 6: Berøring af langfinger

I denne tilstand rører du med to fingre, så to stykker information vises. Indekset rørt med langfingeren er "1".

Lad os løfte pegefingeren her. Derefter vil berøringsoplysningerne se ud som følgende.

図 7 :人差し指を放す
Figur 7: Slip pegefingeren

Som du måske har bemærket nu, er indekset for de oplysninger, du rører ved med din langfinger, "0". Hvis du administrerer tegnet efter indeks, når du flytter det, vil handlingen ovenfor føre til følgende handlinger.

・ Flyt tegnet "A" med pegefingeren

・ Flyt tegnet "B" med langfingeren i den tilstand.

・ Slip pegefingeren, mens du bevæger tegnet med langfingeren

・ Tegnet, der styres af langfingeren, skifter pludselig til "A"

Et andet fænomen er, at hvis du gentagne gange frigiver eller rører ved en af de to fingre, mens du rører ved dem, kan tegningsteksten til den første berøringsinformation flimre. Dette skyldes, at den anden finger afbryder indekset "0" i det øjeblik du rører ved eller slipper det.

Som nævnt ovenfor stemmer indekset og rækkefølgen af berøringsoplysninger, når multi-touch ikke stemmer overens med den rækkefølge, de berøres i. Derfor, hvis du vil udføre handlinger, skal du ikke administrere dem i TouchCollection-indekset.

Det, der skal administreres, er, at "TouchLocation" -strukturen har en "Id" -egenskab, og Id omskrives med en ny værdi, hver gang den berøres, men forholdet mellem berøringspunktet og ID'et garanteres under berøring, så vi administrerer det.

Det betyder selvfølgelig ikke, at du skal administrere det med ID, og i nogle tilfælde er berøringspositionen alene tilstrækkelig. Hvis du f.eks. bare trykker på en knap på skærmen, kan du bestemme, at du har trykket på en knap ved at kontrollere berøringspositionen uanset id. Men når du inkluderer trækbehandling, ændres positionen altid, så jeg synes, det stadig skal bestemmes af ID.

Program - Ting, du skal huske på, når du henter berøringsoplysninger 2 (antal erhvervede berøringsoplysninger)

Selvom det ikke er inkluderet i artiklens program, trækker prøven strengen "GetMaxTouchCount" nederst på skærmen og "det maksimale antal berøringsoplysninger, der er erhvervet på samme tid". Dette har tidligere vist det maksimale antal berøringsoplysninger, der er erhvervet ved hjælp af metoden "TouchPanel.GetState", men i denne testmaskine er egenskaben "TouchPanelCapabilities.MaximumTouchCount" 4, så den maksimale værdi, der vises her, skal normalt være 4. Hvis du lægger fem fingre på det, vil det stadig være 4.

図 8 :5 本の指を置いたときの数値
Figur 8: Femfingertal

Lad os lave et lille eksperiment. Prøv at gentage berøringspanelet med flere fingre ved høj hastighed. Det afhænger af testmaskinen, men antallet kan overstige 4, før du ved af det.

図 9 :GetMaxTouchCount が 4 を超えている
Figur 9: GetMaxTouchCount er større end 4

Faktisk er berøringsoplysningerne, der er erhvervet ved "TouchPanel.GetState" -metoden, ikke berøringsoplysningerne i det øjeblik, du kalder "TouchPanel.GetState" -metoden, men det øjeblik du rører ved den, og det øjeblik du frigiver den fra den sidste opdateringstid, cachelagres. Selvom der kan registreres op til fire berøringer på samme tid, behandles berøring af den samme finger igen som en separat berøring, så der kan opnås mere berøringsinformation end TouchPanelCapabilities.MaximumTouchCount.

Selvom TouchPanelCapabilities.MaximumTouchCount er 4, kan der derfor opstå en indeksoverforbrugsfejl, afhængigt af behandlingsmetoden, selvom TouchPanelCapabilities.MaximumTouchCount er 4, afhængigt af behandlingsmetoden.

Forresten, ved hjælp af XNA Game Studio beskrives den maksimale værdi af egenskaben TouchCollection.Count som "8", så hvis du vil rette antallet af elementer i arrayet, skal du indstille antallet af elementer til mindst 8. (Hvis du tænker på fremtidige versionsopgraderinger, kan du medtage en vagtklausul, så indekset ikke går over.)

Resumé af denne prøve

Denne gang undersøgte vi forskellige parametre for oplysningerne fra multi-touch. Vi bekræftede også, at der er nogle punkter at huske på, når du erhverver berøringspaneloplysninger. Baseret på denne viden vil jeg gerne forklare en prøve, der faktisk bruger multi-touch.