Skārienu mijiedarbība spēļu izstrādē operētājsistēmai Windows Phone 7, 3. daļa Vilkšanas operācijas

Lapa atjaunota :
Lapas izveides datums :

Programmēšanas! - 3.Mēģiniet pārvietot karti uz tausti

Par šo paraugu

Šoreiz es gribētu izveidot progran, kas uz ekrāna un novieto četras kārtis un velk kārtis uz vietu, kur tām pieskaras. Šī ir programmas daudzskārienu versija, kas vispirms vilka sprite ar peles klasi. Līdz šim ir bijuši daudzi skaidrojumi, tāpēc šoreiz es gribētu paskaidrot galvenokārt par programmu.

Šīs izlases programmas mērķi

Velciet vairākas kartes vienlaikus ar skārieniem, izmantojot daudzskārienu.

図 1 :マルチタッチによるドラッグ操作
1. attēls: Daudzskārienu vilkšanas darbība

Programma - Karšu nodarbības

Runājot par multi-touch, ir nepieciešami vairāki objekti, tāpēc šeit es vēlētos izveidot "Card" klasi ar sprite, kas jāpārvieto kā "karte".

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

Lai kods nebūtu pārāk sarežģīts, kartes klasei ir trīs īpašības: pieskāriena ID, pozīcija un krāsa. Nav konkrēta vienuma, kas iedziļinātos detaļās, bet "Touch ID" tiek izmantots, lai pārbaudītu, kurš saziņas punkts ir saistīts.

Programma — lauku deklarēšana

Tajā nav nekā jauna, izņemot to, ka tajā ir virkne karšu klašu, kurās tiek glabāta kartes informācija. Šoreiz tas ir kā iepriekšējo paraugu pieteikums. Es uztaisīju četras kartītes, katra ar atšķirīgu krāsu, lai zīmējot varētu redzēt atšķirību.

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

Programmatisks - iegūstiet skārienjutīgu informāciju

Game.Update metodes iekšpusē. Šī joma ir formāla, tāpēc nav nekā īpaši jauna.

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

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

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

Programma — pieskāriena ID saistīšana ar karti, kad tai pieskaras

Parauga programmā pasūtījums tiek mainīts no apstrādes izmaksu viedokļa, bet ir vieglāk saprast, ja jūs to izskaidrojat no šejienes, tāpēc es to vispirms paskaidrošu.

Pirmkārt, cilpojiet caur iegūto TouchCollection, lai iegūtu katru informācijas daļu.

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

Pārbaudiet rekvizītu "TouchLocation.State", lai norādītu, ka "TouchLocationState.Pressed" ir brīdis, kad tam pieskārāties.

Šajā paraugā, ja kartes ID ir "0", tas tiek definēts kā neizmantots, tātad "kartes. Kur(c => c.Id == 0). FirstOrDefault()", lai no karšu saraksta meklētu karti ar ID 0 un izgūtu šo karti, ja tā ir atrasta. Ja tas nav atrasts, tiek atgriezts null. Šeit LINQ sauc par paplašināšanas metodēm, lai vienkāršotu kodu, bet, ja jūs uztraucaties par apstrādes izmaksām, varat tos meklēt pa vienam ar cilpu.

Kad esat atradis karti, iestatiet kartē touch ID un touch pozīciju.

Programma - karšu apstrāde pieskāriena laikā un pēc to izlaišanas

Aizveriet karti vilkšanas stāvoklī visu laiku, kamēr tai pieskaraties, un, atlaižot karti, tā tiks atvienota no skārienpunkta uz karti.

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

Cilpojiet karšu sarakstu ar foreach un apstrādājiet katru karti. Ja ID ir kaut kas cits, nevis 0, tas ir saistīts ar saskares punktu un process turpinās.

TouchCollection struktūra nodrošina "FindById" metodi, kas ļauj izgūt skārieninformāciju norādītajam ID, ja tāds ir. Ja Card.Id rekvizīts nav 0, mēs varam pieņemt, ka tas ir saistīts ar kādu saskares punktu, tāpēc mēs centīsimies iegūt skārienjutīgu informāciju, izmantojot FindById metodi.

Ja metode FindById atgriež true, tā joprojām ir skāriena stāvoklī, tāpēc iegūstiet skārienpozīciju no rekvizīta TouchLocation.Position un iestatiet to kartes klasē. Ja metode FindById atgriež false, pieskāriens tiek atbrīvots, tāpēc iestatiet Card.ID uz 0 un iestatiet to tā, it kā neviens tam nepieskartos.

Programma - zīmēšanas kartes

Zīmēšanai nepieciešamie parametri jau ir jāiestata uz Kartes klasi, tāpēc nekas jauns nav.

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

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

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

Šī parauga kopsavilkums

Šoreiz es mēģināju izveidot attēlu programmu, kas izmanto multi-touch, lai faktiski pārvietotu spēles objektus. Mēs arī novērojām, ka tad, kad vairākas kārtis tika vilktas vienlaikus, izmantojot skārienjutīgās informācijas ID, karšu kustība bija konsekventa pat tad, ja otrs pirksts tika pacelts vai atkal pieskarties.

Šis paraugs ir tikai paraugs, un tiek veikta tikai vienkārša apstrāde. Tomēr skārienjutīgā paneļa daudzskārienu darbības pamatdaļai jābūt ietvertai faktiskajā spēļu programmēšanā, tāpēc, lūdzu, izmantojiet to daudzskārienu apstrādei, kas ir piemērota jūsu spēlei, pamatojoties uz to.