Tương tác cảm ứng trong phát triển trò chơi cho Windows Phone 7 Phần 2 Cảm ứng đa điểm

Trang Cập Nhật :
Ngày tạo trang :

Chương trình! - 2.Thử cảm ứng đa điểm

Về mẫu này

Ở đây, tôi muốn giải thích chương trình để hiện thực hóa đầu vào đa chạm. Trong Windows Phone 7, đầu vào cảm ứng đa điểm thông qua bảng điều khiển cảm ứng là một trong những mục quan trọng nhất để nhập liệu của người dùng. Điều này là do, không giống như Windows và Xbox 360, giao diện đầu vào chính là "bảng điều khiển cảm ứng". Có thể có điện thoại Windows có bàn phím, nhưng tất nhiên không phải lúc nào chúng cũng có chúng. Vì vậy, để trò chơi hoạt động trên bất kỳ Windows Phone nào, nó cần phải có khả năng cảm ứng.

Nếu bạn giới hạn bảng điều khiển cảm ứng chỉ ở mức "chạm một lần", các loại trò chơi có thể được thực hiện chắc chắn sẽ bị hạn chế khi tạo trò chơi. Hãy nghĩ về một bảng điều khiển trò chơi cầm tay (bạn có thể để nó đứng yên). Hầu hết các bảng điều khiển trò chơi yêu cầu bạn giữ bộ điều khiển trò chơi (hoặc bảng điều khiển thực tế) bằng cả hai tay và nhấn nhiều nút cùng một lúc.

Windows Phone 7 không có nhiều nút như bộ điều khiển trò chơi và nó không nhất thiết phải có bàn phím. Do đó, các phím và nút ảo có thể được đặt trên màn hình và khi nhấn chúng, điều đó thật bất tiện vì chúng không thể được nhấn đồng thời chỉ với một lần chạm.

Tất nhiên, ngoài ví dụ về nút ảo ở trên, cảm ứng đa điểm là cần thiết cho các trò chơi mà nhiều người vận hành một màn hình, chẳng hạn như "chụm và kéo dài (di chuyển hai điểm gần hơn hoặc xa nhau hơn)" thường thấy trong cảm ứng đa điểm.

Nhân tiện, phần giới thiệu dài, nhưng trong mẫu này, tôi muốn có được thông tin cảm ứng đa điểm bằng cách sử dụng một lớp dành riêng cho bảng cảm ứng. Thật thú vị khi tạo ra một mẫu có thể được phát bằng cảm ứng đa điểm đột ngột, nhưng trước tiên tôi muốn tìm hiểu loại thông tin nào có thể thu được bằng cảm ứng đa điểm. Có một số thói quen, vì vậy bằng cách biết chúng trước, bạn có thể giảm thời gian điều tra nguyên nhân, chẳng hạn như khi nó không hoạt động tốt trong lập trình sau này.

Mục tiêu của chương trình mẫu này

Hiển thị và xác nhận thông tin khi thực hiện cảm ứng đa điểm.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Hình 1: Thông tin cảm ứng được hiển thị dưới dạng văn bản khi chạm vào

Chương trình - Khai báo các trường

Các trường phải được gắn nhãn Cấu trúc TouchPanelCapabilities và Cấu trúc TouchCollection.

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

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

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

"Cấu trúc TouchPanelCapabilities" là một cấu trúc có thể có các chức năng của chính bảng điều khiển cảm ứng dưới dạng tham số. Nó được sử dụng để kiểm tra xem bảng điều khiển cảm ứng có thể được sử dụng trong quá trình cập nhật hay không.

Cấu trúc TouchCollection chứa một danh sách thông tin về trạng thái hiện đang được chạm vào. Nếu phát hiện nhiều lần chạm, nhiều "cấu trúc TouchLocation" có thể được truy xuất. Thêm về điều đó sau.

Chương trình - Đang tải phông chữ

Trước khi vẽ văn bản trên màn hình, hãy thêm định nghĩa phông chữ vào dự án nội dung của bạn và tải nó bằng phương thức Game.LoadContent. Điều này không liên quan trực tiếp đến bảng cảm ứng, vì vậy tôi sẽ bỏ qua một lời giải thích chi tiết.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Hình 2: Thêm "Font.spritefont" vào dự án nội dung của bạn

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

Chương trình - Nhận thông tin bảng điều khiển cảm ứng

Nhận thông tin bảng điều khiển cảm ứng bên trong phương thức Game.Update.

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

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

Bạn có thể gọi phương thức "TouchPanel.GetCapabilities" để lấy thông tin chức năng của bảng cảm ứng. Có hai loại thông tin có thể thu được: "Có thể sử dụng bảng điều khiển cảm ứng không?" và "Số điểm tiếp xúc tối đa mà bảng điều khiển cảm ứng có thể có được". Cả hai đều không thay đổi trong trò chơi, vì vậy tôi nghĩ sẽ không có vấn đề gì nếu bạn tải nó theo phương thức Game.Initialize, nhưng trong tương lai, các thiết bị có thể xóa bảng cảm ứng (bảng cảm ứng có thể được kết nối với USB hoặc các thiết bị thực tế không phải Windows Phone) xuất hiện và nó được mô tả trong phương pháp Cập nhật.

Ngoài ra, không cần kiểm tra xem bảng điều khiển cảm ứng có thể được sử dụng hay không vì nó luôn có thể được sử dụng trên Windows Phone 7, nhưng khi chia sẻ mã với Windows và Xbox 360, phần cứng này không bắt buộc phải có giao diện đầu vào và cần được kiểm tra.

Nếu bạn có thể xác nhận rằng bảng điều khiển cảm ứng có sẵn trong thuộc tính "TouchPanelCapabilities.IsConnected", phương pháp "TouchPanel.GetState" sẽ có trạng thái cảm ứng hiện tại.

Ban đầu, một số thao tác xử lý được thực hiện sau khi có được thông tin cảm ứng, nhưng trong mẫu này, thông tin chỉ được hiển thị, do đó không có quá trình xử lý nào được thực hiện thêm trong phương thức Game.Update.

Chương trình - Nhận số lượng điểm tiếp xúc tối đa bạn có thể nhận được

Số lượng điểm tiếp xúc tối đa có thể được truy xuất gần như cố định, vì vậy thường không cần thiết phải truy xuất chúng trong trò chơi, nhưng bạn có thể nhận được số điểm tiếp xúc tối đa có thể được truy xuất từ thuộc tính TouchPanelCapabilities.MaximumTouchCount. Ví dụ: nếu thuộc tính MaximumTouchCount là "4", bạn không thể lấy thông tin vị trí thứ năm bằng cách chạm vào bảng cảm ứng bằng năm ngón tay.

Số lượng mua lại cho điện thoại thông minh "HTC 7 Trophy" được sử dụng trong mẫu này là "4". (Nhân tiện, XNA Game Studio 4.0 được định nghĩa là luôn trả về 4.) Đặc điểm kỹ thuật của Windows Phone 7 cho biết nó nhiều hơn 4 điểm, vì vậy nó không trả về ít hơn 4.)

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

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

Chương trình - Nhận thông tin cảm ứng

Cấu trúc TouchCollection được truy xuất chứa nhiều thông tin cảm ứng. Ví dụ, nếu bạn chạm bằng hai ngón tay, nó thường chứa hai lần chạm.

Số lượng thông tin cảm ứng có thể được truy xuất trong thuộc tính TouchCollection.Count. Thông tin cảm ứng được hiển thị nhiều lần trong tuyên bố for nhiều lần nếu nó thu được. Ban đầu, không có vấn đề gì để lặp lại với foreach, nhưng vì chúng ta sẽ sử dụng chỉ mục mảng (int index) trong phần giải thích sau, chúng ta lặp lại nó với 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);
}

Bây giờ, mỗi thông tin cảm ứng được lấy dưới dạng cấu trúc "TouchLocation". Nếu nó được lặp lại với, nó có thể được lấy bằng "TouchCollection[index]". (Bạn cũng có thể lấy cấu trúc "TouchLocation" trực tiếp trong foreach.)

Bốn loại thông tin sau đây có thể được lấy từ cấu trúc "TouchLocation" và mỗi thông tin được hiển thị trong mẫu.

Khi bạn thực sự chạy nó, thông tin cảm ứng được hiển thị như hình dưới đây. Vì bạn đang chạm bằng ba ngón tay, bạn có thể thấy ba lần chạm. Nhân tiện, nếu bạn chạm bằng năm ngón tay, bạn sẽ chỉ thấy tối đa bốn. (Vì số lượng mua lại tối đa là 4)

図 4 :3 本の指でタッチしているところ
Hình 4: Chạm bằng ba ngón tay

Chương trình - Những điều cần chú ý khi truy xuất thông tin cảm ứng 1 (chỉ mục và ID)

Tôi đã đề cập ở trên rằng có những điều cần lưu ý khi xử lý thông tin cảm ứng, nhưng đầu tiên là "chỉ mục" và "ID". Chỉ mục chỉ đơn giản đề cập đến một chỉ mục mảng.

Tôi nghĩ sẽ dễ hiểu hơn nếu bạn thử nó trên một chiếc máy thực tế hơn là giải thích nó bằng văn bản. Ví dụ: giả sử bạn thao tác bằng hai ngón tay, "ngón trỏ" và "ngón giữa" và chạm bằng ngón trỏ trước.

図 5 :人差し指でタッチ
Hình 5: Chạm bằng ngón trỏ

Như hiển thị trên màn hình, chỉ số sẽ là "0". Sau đó chạm vào nó bằng ngón tay giữa của bạn.

図 6 :中指でタッチ
Hình 6: Chạm ngón giữa

Ở trạng thái này, bạn đang chạm bằng hai ngón tay, vì vậy hai phần thông tin được hiển thị. Con trỏ chạm vào ngón giữa là "1".

Hãy nhấc ngón trỏ của chúng ta lên đây. Sau đó, thông tin cảm ứng sẽ trông như sau.

図 7 :人差し指を放す
Hình 7: Thả ngón trỏ ra

Như bạn có thể nhận thấy bây giờ, chỉ số của thông tin bạn đang chạm vào bằng ngón giữa là "0". Nếu bạn quản lý ký tự bằng index khi di chuyển nó, thao tác trên sẽ dẫn đến các hành động sau.

・ Di chuyển ký tự "A" bằng ngón trỏ của bạn

・ Di chuyển ký tự "B" bằng ngón giữa ở trạng thái đó.

Nhả ngón trỏ trong khi di chuyển nhân vật bằng ngón giữa

・ Nhân vật được điều khiển bằng ngón giữa đột nhiên chuyển sang "A"

Một hiện tượng khác là nếu bạn liên tục nhả hoặc chạm vào một trong hai ngón tay trong khi chạm vào chúng, văn bản vẽ của thông tin cảm ứng đầu tiên có thể nhấp nháy. Điều này là do ngón tay thứ hai làm gián đoạn ngón trỏ "0" ngay khi bạn chạm hoặc thả nó ra.

Như đã đề cập ở trên, chỉ mục và thứ tự thông tin cảm ứng khi cảm ứng đa điểm không khớp với thứ tự mà chúng được chạm vào. Do đó, nếu bạn muốn thực hiện bất kỳ thao tác nào, không quản lý chúng trong chỉ mục TouchCollection.

Điều cần được quản lý là cấu trúc "TouchLocation" có thuộc tính "Id" và Id được viết lại với một giá trị mới mỗi khi nó được chạm vào, nhưng mối quan hệ giữa điểm tiếp xúc và ID được đảm bảo trong khi chạm vào, vì vậy chúng tôi sẽ quản lý nó.

Tất nhiên, điều này không có nghĩa là bạn phải quản lý nó bằng ID và trong một số trường hợp, chỉ riêng vị trí cảm ứng là đủ. Ví dụ: nếu bạn chỉ chạm vào một nút trên màn hình, bạn có thể xác định rằng bạn đã nhấn nút bằng cách kiểm tra vị trí cảm ứng bất kể ID là gì. Tuy nhiên, khi bao gồm cả xử lý kéo, vị trí luôn thay đổi, vì vậy tôi nghĩ nó vẫn nên được xác định bằng ID.

Chương trình - Những điều cần lưu ý khi có được thông tin cảm ứng 2 (số lượng thông tin cảm ứng thu được)

Mặc dù nó không được bao gồm trong chương trình của bài viết, mẫu vẽ chuỗi "GetMaxTouchCount" ở cuối màn hình và "số lượng thông tin cảm ứng tối đa thu được cùng một lúc". Điều này đã hiển thị số lượng thông tin cảm ứng tối đa có được bằng phương pháp "TouchPanel.GetState" trong quá khứ, nhưng trong máy thử nghiệm này, thuộc tính "TouchPanelCapabilities.MaximumTouchCount" là 4, vì vậy giá trị tối đa được hiển thị ở đây thường phải là 4. Nếu bạn đặt năm ngón tay lên nó, nó vẫn sẽ là 4.

図 8 :5 本の指を置いたときの数値
Hình 8: Số năm ngón tay

Hãy làm một thí nghiệm nhỏ. Hãy thử lặp lại bảng điều khiển cảm ứng bằng nhiều ngón tay ở tốc độ cao. Nó phụ thuộc vào máy thử nghiệm, nhưng số lượng có thể vượt quá 4 trước khi bạn biết điều đó.

図 9 :GetMaxTouchCount が 4 を超えている
Hình 9: GetMaxTouchCount lớn hơn 4

Trên thực tế, thông tin cảm ứng thu được bằng phương pháp "TouchPanel.GetState" không phải là thông tin cảm ứng tại thời điểm gọi phương thức "TouchPanel.GetState", nhưng thời điểm bạn chạm vào nó và thời điểm bạn thả nó ra khỏi thời gian cập nhật cuối cùng được lưu vào bộ nhớ cache. Do đó, mặc dù có thể phát hiện tối đa bốn lần chạm cùng một lúc, nhưng chạm lại vào cùng một ngón tay được coi là một lần chạm riêng biệt, do đó, có thể thu được nhiều thông tin cảm ứng hơn TouchPanelCapabilities.MaximumTouchCount.

Do đó, ngay cả khi TouchPanelCapabilities.MaximumTouchCount là 4, nếu số lượng phần tử mảng của dữ liệu liên quan đến cảm ứng được cố định bằng 4, lỗi vượt mức chỉ mục có thể xảy ra tùy thuộc vào phương pháp xử lý.

Nhân tiện, với sự trợ giúp của XNA Game Studio, giá trị tối đa của thuộc tính TouchCollection.Count được mô tả là "8", vì vậy nếu bạn muốn sửa số lượng phần tử trong mảng, bạn nên đặt số phần tử thành ít nhất 8. (Nếu bạn nghĩ về việc nâng cấp phiên bản trong tương lai, bạn có thể muốn bao gồm một điều khoản bảo vệ để chỉ mục không bị vượt quá.)

Tóm tắt mẫu này

Lần này, chúng tôi đã kiểm tra các thông số khác nhau cho thông tin thu được từ cảm ứng đa điểm. Chúng tôi cũng xác nhận rằng có một số điểm cần lưu ý khi thu thập thông tin bảng điều khiển cảm ứng. Dựa trên kiến thức này, tôi muốn giải thích một mẫu thực sự sử dụng cảm ứng đa điểm.