[XNA]Hướng dẫn thiết kế các sự kiện Touch trong Windows Phone 7

-Viêc đầu tiên:Bạn thử hình dung xem.Bạn có thể chạm vào màn hình với bao nhiêu kiêu nào.Mình sẽ liệt kê nhé:

  • Tap:Sư kiện này xảy ra khi chúng ta chạm và nhả tay khỏi màn hình ngay lập tức.
  • DoubleTap:Sư kiện này xảy ra khi chúng ta Tap 2 lần.Nó cũng giống như double click chuôt vậy ấy.
  • Hold:Xảy ra khi mình đè ngón tay mà giữ luôn trên màn hình.
  • HorizontalDrag:Khi chúng ta kéo ngang trên màn hình.
  • VerticalDrag:Khi chúng ta kéo dọc trên màn hình.
  • FreeDrag:Kéo tự do bất kì hướng nào trên màn hình.Không ngang mà cũng không dọc.
  • Flick:Xảy ra khi mình đang kéo bất kì hướng nào trên màn hình và thả tay ra trong khi mình vẫn còn đang kéo.
  • Pinch:Sư kiên này bạn cứ hình dung răng:Bạn đang ở trong trình xem ảnh của cái iPhone,bạn muốn phóng to hay thu nhỏ cái hình,thì bạn làm gì nào.Có phải là lấy ngón tay và thu lại gần nhau hông nè.Nó là Pinch đấy

-Trong Windows Phone,họ có hỗ trợ cho chúng ta tất cả các sư kiên này.Nó được gọi là các Gesture(Tiêng Viêt là cử chỉ ấy các bạn).Để sử dụng được nó,ta làm các bước sau đây:

  • đương nhiên là phải sử dụng thư viện rồi: using Microsoft.Xna.Framework.Input.Touch;
  • Tiêp theo phải khai báo cho màn hình các cử chỉ mà ta sẽ sử dụng:TouchPanel.EnabledGestures = GestureType.Tap | GestureType.DoubleTap | GestureType.HorizontalDrag | GestureType.DragComplete.Ở đây mình khai báo rằng:Mình sẽ sử dụng 3 cử chỉ:Tap,DoubleTap,HorizontalDrag,DragComplete;

-Khi chúng ta chạm vào màn hình,thì các cử chỉ đó,sẽ được lưu vào 1 hàng đợi.Để kiểm tra trong hàng đợi có còn cử chỉ nào không.Thì TouchPanel.IsGestureAvailable sẽ làm việc này.Nó trả vê true nếu còn.ngược lại là false.

-Để đọc cử chỉ tiếp theo trong hàng đợi đó.Câu lênh TouchPanel.ReadGesture() sẽ làm việc này.Nó sẽ trả về 1 GestureSample.1 phân tử thuôc lơp này sẽ có các thuộc tính

  • GestureType: dạng của cử chỉ.
  •  Position: Vector2 có chứa các vị trí trên màn hình mà tại đó các cử chỉ
    xảy ra.
  •  Position2: Đối với các cử chỉ Pinch, thuộc tính này bao gồm vị trí thứ haicảm ứng điểm.
  •  Delta: Một Vector2 có chứa khoảng cách các điểm tiếp xúc đã chuyển từ cáccử chỉ lần cuối .
  •  Delta2: Đối với các cử chỉ Pinch, thuộc tính này có chứa các khoảng cách của các liên lạc thứ hai điểm.

while(TouchPanel.IsGestureAvailable)
{
    // Read the next gesture
GestureSample gesture = TouchPanel.ReadGesture();
switch (gesture.GestureType)
{
case GestureType.Tap: Shoot(gesture.Position); break;
case GestureType.FreeDrag: Move(gesture.Position); break;
}
}

-Đây là đoạn code xử lý ứng với từng cư chỉ.

-Sau đây mình cung cấp 1 lớp Touch:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
using WindowsGame1;

namespace Test
{
    class Touch
    {
        Vector2 tempTouch;
        public Touch()
        {
            TouchPanel.EnabledGestures = GestureType.Tap | GestureType.DoubleTap | GestureType.HorizontalDrag | GestureType.DragComplete;
            tempTouch = new Vector2(-1, -1);
        }
        public string StateTouch(ref  Vector2 positionTouch)
        {
            while (TouchPanel.IsGestureAvailable)
            {
                GestureSample sample = TouchPanel.ReadGesture();
                switch (sample.GestureType)
                {
                    case GestureType.Tap:
                        {
                            positionTouch = sample.Position;
                            return “Tap”;
                        }
                    case GestureType.DoubleTap:
                        {
                            positionTouch = sample.Position;
                            return “DoubleTap”;
                        }
                    case GestureType.HorizontalDrag:
                        {
                            positionTouch = sample.Position;
                            if (tempTouch != new Vector2(-1, -1))
                            {
                                if (sample.Position.X > tempTouch.X)
                                {
                                    tempTouch = sample.Position;
                                    return “HorizontalDrag_LeftToRight”;
                                }
                                tempTouch = sample.Position;
                                return “HorizontalDrag_RightToLeft”;
                            }
                            tempTouch = sample.Position;
                            return “None”;
                        }
                    case GestureType.DragComplete:
                        {
                            tempTouch = new Vector2(-1, -1);
                            return “None”;
                        }
                }
            }
            return “None”;
        }
    }
}

-Nó chỉ đơn giản là lấy sự kiện và return ra trạng thái tên của sự kiên đó.ref  Vector2 positionTouch thông sô này nó sẽ cho chúng ta biết vị trị của điêm mà chúng ta đã chạm.

Bài này đã được đăng trong Uncategorized. Đánh dấu đường dẫn tĩnh.

Bình luận về bài viết này