Aanraakinteracties in gameontwikkeling voor Windows Phone 7, deel 3 Sleepbewerkingen

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Programmeren! - 3.Probeer de kaart aan te raken

Over dit voorbeeld

Deze keer wil ik een progran maken die vier kaarten op het scherm plaatst en de kaarten plaatst en sleept naar de plaats waar ze worden aangeraakt. Dit is een multi-touch versie van het programma dat eerst een sprite sleepte met de klasse Mouse. Tot nu toe zijn er veel verklaringen geweest, dus deze keer wil ik vooral iets uitleggen over het programma.

Doelen van dit voorbeeldprogramma

Sleep meerdere kaarten tegelijk met multi-touch.

図 1 :マルチタッチによるドラッグ操作
Figuur 1: Multi-touch sleepbewerking

Programma - Kaartlessen

Als het gaat om multi-touch, wordt het noodzakelijk om meerdere objecten te hebben, dus hier zou ik een "Card" -klasse willen maken met de sprite die als een "kaart" moet worden verplaatst.

/// <summary>
/// ドラッグできるカード
/// </summary>
public class Card
{
  /// <summary>
  /// タッチ ID
  /// </summary>
  public int Id { get; set; }

  /// <summary>
  /// カードの位置
  /// </summary>
  public Vector2 Position { get; set; }

  /// <summary>
  /// カードの色
  /// </summary>
  public Color Color { get; set; }
}

Om de code niet te ingewikkeld te maken, heeft de kaartklasse drie eigenschappen: touch ID, positie en kleur. Er is geen specifiek item om in detail te treden, maar "Touch ID" wordt gebruikt om te controleren welk touchpoint is gekoppeld.

Programma - Velden declareren

Er is niets nieuws aan, behalve het hebben van een reeks kaartklassen om kaartinformatie te bewaren. Deze keer is het als een toepassing van de vorige monsters. Ik heb vier kaarten gemaakt, elk met een andere kleur zodat je het verschil kunt zien bij het tekenen.

/// <summary>
/// テクスチャー
/// </summary>
Texture2D texture;

/// <summary>
/// カードの一覧(4 枚分)
/// </summary>
Card[] cards = new Card[]
{
  new Card { Color = Color.White, },
  new Card { Color = Color.Yellow, },
  new Card { Color = Color.Fuchsia, },
  new Card { Color = Color.Aqua, },
};

Programmatic - Touch-informatie opvragen

In de methode Game.Update. Dit gebied is formulair, dus er is niets bijzonder nieuws.

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

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

  //   :
  // ここに処理
  //   :
}

Programma - Een aanraak-ID aan een kaart koppelen wanneer deze wordt aangeraakt

In het voorbeeldprogramma wordt de volgorde omgekeerd vanuit het oogpunt van verwerkingskosten, maar het is gemakkelijker te begrijpen als u het vanaf hier uitlegt, dus ik zal dit eerst uitleggen.

Loop eerst door de verworven TouchCollection-voorvernieuwing om elk stukje informatie te krijgen.

/// タッチ情報の処理を行う
foreach (TouchLocation tl in touches)
{
  // タッチ状態を調べる
  switch (tl.State)
  {
    case TouchLocationState.Pressed:
      // タッチされた瞬間は空いているカードを検索して紐づける
      Card card = cards.Where(c => c.Id == 0).FirstOrDefault();
      if (card != null)
      {
          card.Id = tl.Id;
          card.Position = tl.Position;
      }
      break;
  }
}

Vink de eigenschap "TouchLocation.State" aan om aan te geven dat "TouchLocationState.Pressed" het moment is waarop u het hebt aangeraakt.

In dit voorbeeld, als de ID van de kaart "0" is, wordt deze gedefinieerd als niet gebruikt, dus "kaarten. Waar(c => c.Id == 0). FirstOrDefault()" om te zoeken naar een kaart met ID 0 uit de lijst met kaarten en die kaart op te halen als deze wordt gevonden. Als deze niet wordt gevonden, wordt null geretourneerd. Hier worden extensiemethoden door LINQ aangeroepen om de code te vereenvoudigen, maar als u zich zorgen maakt over verwerkingskosten, kunt u ze één voor één zoeken met een for-lus.

Wanneer u de kaart hebt gevonden, stelt u de touch ID en aanraakpositie op de kaart in.

Programma - omgaan met kaarten tijdens het aanraken en wanneer ze worden vrijgegeven

Houd de kaart te allen tijde in een sleepstatus terwijl u deze aanraakt en wanneer u deze loslaat, wordt deze losgekoppeld van het aanraakpunt naar de kaart.

// 各カードの情報を調べる
foreach (Card card in cards)
{
  if (card.Id != 0)
  {
    // 紐づくタッチ情報がまだ存在するか ID で検索
    TouchLocation tl;
    if (touches.FindById(card.Id, out tl) == true)
    {
      // まだタッチされている場合は位置情報取得
      card.Position = tl.Position;
    }
    else
    {
      // すでにタッチ情報がなかったら紐付を外す
      card.Id = 0;
    }
  }
}

Loop de kaartlijst met foreach en verwerk elke kaart. Als de ID iets anders is dan 0, wordt deze gekoppeld aan het contactpunt en gaat het proces verder.

De TouchCollection-structuur biedt een "FindById"-methode waarmee u de aanraakinformatie voor de opgegeven ID kunt ophalen, als die bestaat. Als de eigenschap Card.Id niet 0 is, kunnen we aannemen dat deze is gekoppeld aan een contactpunt, dus we zullen proberen de aanraakinformatie te verkrijgen met de methode FindById.

Als de methode FindById true retourneert, bevindt deze zich nog steeds in de aanraakstatus, dus haal de aanraakpositie op bij de eigenschap TouchLocation.Position en stel deze in de klasse card in. Als de methode FindById false retourneert, wordt de aanraking vrijgegeven, dus stel Card.ID in op 0 en stel deze in omdat niemand deze aanraakt.

Programma - Trekkingskaarten

De parameters die nodig zijn voor het tekenen moeten al zijn ingesteld op de klasse Card, dus er is niets nieuws.

// スプライトの描画準備
spriteBatch.Begin();

// 各カードを描画
foreach (Card card in cards)
{
  spriteBatch.Draw(texture, card.Position, card.Color);
}

// スプライトの一括描画
spriteBatch.End();

Samenvatting van deze steekproef

Deze keer probeerde ik een beeldprogramma te maken dat multi-touch gebruikt om objecten in het spel daadwerkelijk te verplaatsen. We hebben ook waargenomen dat wanneer meerdere kaarten tegelijkertijd werden gesleept met behulp van de ID van de aanraakinformatie, de beweging van de kaarten consistent was, zelfs als de andere vinger werd opgeheven of opnieuw werd aangeraakt.

Dit monster is slechts een voorbeeld en er wordt alleen een eenvoudige verwerking uitgevoerd. Het basisgedeelte van de multi-touch-bediening door het aanraakpaneel moet echter worden gedekt door daadwerkelijke spelprogrammering, dus pas het toe op multi-touch-verwerking die op basis hiervan bij uw spel past.