Kosketusohjaukset Windows Phone 7:n pelikehityksessä, osa 3 Vetämistoiminnot

Sivu päivitetty :
Sivun luontipäivämäärä :

Ohjelmointi! - 3.Yritä siirtää kortti kosketukseen

Tietoja tästä näytteestä

Tällä kertaa haluaisin luoda progranin, joka asettaa neljä korttia näytölle ja paikoille ja vetää kortit paikkaan, jossa niitä kosketetaan. Tämä on ohjelman monikosketusversio, joka veti ensin spriten Hiiri-luokan kanssa. Tähän asti on ollut monia selityksiä, joten tällä kertaa haluaisin selittää pääasiassa ohjelmasta.

Tämän esimerkkiohjelman tavoitteet

Vedä useita kortteja samanaikaisesti, kun kosketat monikosketuksella.

図 1 :マルチタッチによるドラッグ操作
Kuva 1: Usean kosketuksen vetäminen

Ohjelma - Korttiluokat

Kun kyse on monikosketuksesta, on välttämätöntä, että sinulla on useita esineitä, joten tässä haluaisin luoda "Kortti" -luokan, jossa sprite siirretään "korttina".

/// <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; }
}

Jotta koodi ei olisi liian monimutkainen, korttiluokalla on kolme ominaisuutta: kosketustunnus, sijainti ja väri. Ei ole erityistä kohdetta, johon mennä yksityiskohtaisesti, mutta "Touch ID": tä käytetään tarkistamaan, mikä kosketuspiste on linkitetty.

Ohjelma - Kenttien ilmoittaminen

Siinä ei ole mitään muuta uutta kuin joukko korttiluokkia korttitietojen säilyttämiseen. Tällä kertaa se on kuin edellisten näytteiden sovellus. Tein neljä korttia, joista jokaisella oli eri väri, jotta näet eron piirtäessäsi.

/// <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, },
};

Ohjelmallinen - Hanki kosketustiedot

Game.Update-menetelmän sisällä. Tämä alue on kaavamainen, joten ei ole mitään erityisen uutta.

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

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

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

Ohjelma - Kosketustunnuksen linkittäminen korttiin, kun sitä kosketetaan.

Näyteohjelmassa järjestys on päinvastainen käsittelykustannusten näkökulmasta, mutta on helpompi ymmärtää, jos selität sen täältä, joten selitän tämän ensin.

Käy ensin läpi hankittu TouchCollection foreach saadaksesi jokaisen tiedon.

/// タッチ情報の処理を行う
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;
  }
}

Tarkista TouchLocation.State-ominaisuudesta, että "TouchLocationState.Pressed" on hetki, jolloin kosketit sitä.

Tässä esimerkissä, jos kortin tunnus on "0", se määritellään ei-käytetyksi, joten "kortit. Missä(c => c.Id == 0). FirstOrDefault()", jos haluat etsiä korttiluettelosta kortin, jonka tunnus on 0, ja hakea kortti, jos sellainen löytyy. Jos sitä ei löydy, palautetaan nolla. Täällä LINQ kutsuu laajennusmenetelmiä koodin yksinkertaistamiseksi, mutta jos olet huolissasi käsittelykustannuksista, voit etsiä niitä yksitellen for-silmukalla.

Kun löydät kortin, aseta kosketustunnus ja kosketussijainti kortissa.

Ohjelma - korttien käsittely kosketuksen aikana ja kun ne vapautetaan

Pidä kortti aina vetotilassa, kun kosketat sitä, ja kun vapautat sen, se irrotetaan kosketuspisteestä korttiin.

// 各カードの情報を調べる
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;
    }
  }
}

Silmukoi korttiluettelo foreachin kanssa ja käsittele jokainen kortti. Jos tunnus on jokin muu kuin 0, se linkitetään kosketuspisteeseen ja prosessi jatkuu.

TouchCollection-rakenne tarjoaa "FindById" -menetelmän, jonka avulla voit hakea määritetyn tunnuksen kosketustiedot, jos sellainen on olemassa. Jos Card.Id ominaisuus ei ole 0, voimme olettaa, että se liittyy johonkin kosketuspisteeseen, joten yritämme saada kosketustiedot FindById-menetelmällä.

Jos FindById-menetelmä palauttaa arvon tosi, se on edelleen kosketustilassa, joten hae kosketussijainti TouchLocation.Position-ominaisuudesta ja aseta se korttiluokkaan. Jos FindById-menetelmä palauttaa väärän, kosketus vapautetaan, joten aseta Card.ID arvoon 0 ja aseta se niin, että kukaan ei kosketa sitä.

Ohjelma - Korttien piirtäminen

Piirtämiseen tarvittavat parametrit tulisi jo asettaa Kortti-luokkaan, joten mitään uutta ei ole.

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

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

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

Yhteenveto tästä näytteestä

Tällä kertaa yritin luoda kuvaohjelman, joka käyttää monikosketusta esineiden siirtämiseen pelissä. Havaitsimme myös, että kun useita kortteja vedettiin samanaikaisesti kosketustietojen tunnuksella, korttien liike oli johdonmukaista, vaikka toinen sormi nostettiin tai kosketettiin uudelleen.

Tämä näyte on vain näyte ja suoritetaan vain yksinkertainen käsittely. Kosketuspaneelin monikosketustoiminnon perusosan tulisi kuitenkin kuulua varsinaiseen peliohjelmointiin, joten käytä sitä monikosketuskäsittelyyn, joka sopii peliisi tämän perusteella.