Puuteinteraktsioonid Windows Phone 7 3. osa lohistamistoimingute mänguarenduses

Lehekülg uuendatud :
Lehe loomise kuupäev :

Programmeerimine! - 3.Proovige kaarti puudutada

Selle proovi kohta

Seekord tahaksin luua prograni, mis asetab ekraanile neli kaarti ja asetab ning lohistab kaardid kohta, kus neid puudutatakse. See on programmi mitme puutega versioon, mis tõmbas kõigepealt hiireklassiga spraidi. Siiani on olnud palju selgitusi, nii et seekord tahaksin selgitada peamiselt programmi kohta.

Selle näidisprogrammi eesmärgid

Lohistage mitut kaarti korraga, kui puudutate mitmikpuutefunktsiooniga.

図 1 :マルチタッチによるドラッグ操作
Joonis 1: Mitmikpuute lohistamine

Programm - kaardiklassid

Kui tegemist on mitme puudutusega, on vaja mitut objekti, nii et siin tahaksin luua "Kaardi" klassi, mille sprait liigutatakse "kaardina".

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

Et koodi mitte liiga keeruliseks muuta, on kaardiklassil kolm omadust: puutetundlik ID, asukoht ja värv. Ei ole mingit konkreetset üksust, mida üksikasjalikult käsitleda, kuid "Touch ID" kasutatakse selleks, et kontrollida, milline puutepunkt on lingitud.

Programm - väljade deklareerimine

Selles pole midagi uut peale selle, et kaarditeabe hoidmiseks on olemas hulgaliselt kaardiklasse. Seekord on see nagu eelmiste proovide rakendus. Tegin neli kaarti, millest igaüks oli erinevat värvi, nii et joonistamisel näete erinevust.

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

Programmiline – puuteteabe hankimine

Game.Update meetodi sees. See valdkond on valemiline, seega pole midagi eriti uut.

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

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

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

Programm - puutetundliku ID linkimine kaardiga, kui seda puudutatakse

Näidisprogrammis on tellimus töötlemiskulude seisukohast vastupidine, kuid seda on lihtsam mõista, kui selgitate seda siit, nii et ma selgitan seda kõigepealt.

Esiteks loopige läbi omandatud TouchCollectioni, et saada iga teave.

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

Kontrollige atribuuti "TouchLocation.State" ja märkige, et "TouchLocationState.Pressed" on hetk, mil seda puudutasite.

Selles proovis, kui kaardi ID on "0", on see määratletud kui mittekasutatav, seega "kaardid. Kus(c => c.Id == 0). FirstOrDefault()), et otsida kaartide loendist ID-kaardiga 0 kaarti ja selle leidmisel see kaart alla laadida. Kui seda ei leita, tagastatakse null. Siin kutsub LINQ koodi lihtsustamiseks laiendusmeetodeid, kuid kui olete mures töötlemiskulude pärast, saate neid otsida ükshaaval silmusega.

Kui leiate kaardi, määrake kaardil puutetundlik ID ja puutekoht.

Programm - kaartide käsitsemine puudutamise ajal ja nende vabastamisel

Hoidke kaarti puudutamise ajal kogu aeg lohistamisolekus ja kui selle vabastate, katkestatakse see puutepunktist kaardiga.

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

Loopige kaartide loend foreachiga ja töödelge iga kaarti. Kui ID on midagi muud kui 0, on see lingitud puutepunktiga ja protsess jätkub.

TouchCollectioni struktuur pakub "FindById" meetodit, mis võimaldab teil määratud ID puuteteavet hankida, kui see on olemas. Kui Card.Id omadus ei ole 0, võime eeldada, et see on seotud mõne puutepunktiga, seega proovime puuteteavet saada FindById meetodiga.

Kui FindById-meetod tagastab väärtuse true, on see endiselt puuteolekus, nii et hankige puutekoht atribuudist TouchLocation.Position ja määrake see kaardiklassi. Kui FindById-meetod tagastab väärtuseks väär, siis puudutus vabastatakse, nii et seadke Card.ID väärtusele 0 ja seadke see nii, nagu keegi seda ei puudutaks.

Programm - kaartide joonistamine

Joonistamiseks vajalikud parameetrid peaksid olema juba seatud kaardiklassi, nii et pole midagi uut.

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

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

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

Valimi kokkuvõte

Seekord proovisin luua pildiprogrammi, mis kasutab mitmikpuutefunktsiooni, et mängus objekte tegelikult liigutada. Samuti täheldasime, et kui puutetundliku teabe ID-d kasutades lohistati korraga mitut kaarti, oli kaartide liikumine ühtlane isegi siis, kui teist sõrme tõsteti või puudutati uuesti.

See proov on vaid proov ja teostatakse ainult lihtne töötlemine. Puutepaneeli mitmikpuutetoimingu põhiosa peaks siiski olema kaetud tegeliku mänguprogrammeerimisega, nii et palun rakendage seda selle põhjal teie mängule sobivale mitmikpuutetöötlusele.