الفصل الثالث: قراءة مدخلات الفأرة

بعد أن تعرفنا على كيفية قراءة واستخدام مدخلات لوحة المفاتيح، لننتقل إلى أداة الإدخال الرئيسية الثانية في الحواسيب الشخصية وهي الفأرة. لا يكاد يغفل أي متابع لألعاب الكمبيوتر عن أهمية هذه الأداة في الألعاب، فلها الدور الأكبر في ألعاب التصويب، كما أنها تستخدم لإعطاء الكثير من الأوامر في الألعاب الاستراتيجية وكذلك في واجهة المستخدم كانتقاء الأدوات والتفاعل مع الحوارات.

ما يهمنا في هذا الفصل هو التعرف على كيفية قراءة حركة الفأرة على المحورين الأفقي والعمودي، إضافة إلى قراءة حركات النقر على الأزرار الثلاث و تدوير عجلة الفأرة. لنبدأ بمشهد جديد يحتوي على كائن واحد عبارة عن كرة تتوسط المشهد، تماما كما فعلنا في الفصل الأول من هذه الوحدة. سنقوم بإضافة بريمج لهذه الكرة بحيث يعمل على تحريكها أفقيا وعموديا حسب حركة الفأرة، كما تقوم بتغيير لونها عند النقر على أزرار الفأرة الثلاث، وأخيرا سنقوم بتغيير حجم الكرة حسب استدارة عجلة الفأرة (ملاحظة: من الأفضل أن تقوم بإبعاد الكاميرا نحو الخلف حتى لا تخرج الكرة خارج مدى الرؤية بسهولة، ولتكن في الموقع (70- ,0 ,0) مثلا). السرد 8 يوضح الكود الخاص بقراءة مدخلات الفأرة وترجمتها للسلوك المطلوب.

1. using UnityEngine;
2. using System.Collections;
3. 
4. public class MouseMovement : MonoBehaviour {
5.  
6.  //سرعة حركة الكائن
7.  public float movementSpeed = 5;
8.  
9.  // الألوان الخاصة بالأزرار
10.     public Color left = Color.red;
11.     public Color right = Color.green;
12.     public Color middle = Color.blue;
13.     
14.     //معامل الزيادة أو النقصان في الحجم عند تدوير العجلة
15.     public float scaleFactor = 1;
16.     
17.     //موقع مؤشر الفأرة في الإطار السابق
18.     //نحتاجه لقياس قيمة الإزاحة
19.     Vector3 lastMousePosition;
20.     
21.     void Start () {
22.         //لجعل الإزاحة تساوي صفراً عند البداية
23.         lastMousePosition = Input.mousePosition;
24.     }
25.     
26.     void Update () {
27.         
28.         if(Input.GetMouseButton(0)){
29.             //الزر الأيسر
30.             renderer.material.color = left;
31.         } else if(Input.GetMouseButton(1)){
32.             //الزر الأيمن
33.             renderer.material.color = right;
34.         } else if(Input.GetMouseButton(2)){
35.             //الزر الأوسط
36.             renderer.material.color = middle;
37.         }
38.         
39.         //حساب قيمة إزاحة المؤشر
40.         Vector3 mouseDelta = Input.mousePosition - lastMousePosition;
41.         transform.Translate(
42.             movementSpeed * Time.deltaTime * mouseDelta.x,
43.             movementSpeed * Time.deltaTime * mouseDelta.y, 0);
44.         
45.         //تحديث الموقع الأخير استعدادا للإطار القادم
46.         lastMousePosition = Input.mousePosition;
47.         //قراءة استدارة العجلة
48.         float wheel = Input.GetAxis("Mouse ScrollWheel");
49.         if(wheel > 0){
50.             //استدارة العجلة نحو الأعلى
51.             transform.localScale += Vector3.one * scaleFactor;
52.         } else if(wheel < 0){
53.             //استدارة العجلة نحو الأسفل
54.             transform.localScale -= Vector3.one * scaleFactor;
55.         }
56.     }
57. }

السرد 8: قراءة مدخلات الفأرة

لنناقش أهم ما يحتويه هذا البريمج، لدينا - كما رأينا سابقا - سرعة الحركة في السطر 7 بالإضافة إلى ثلاث متغيرات من نوع Color في الأسطر 10 إلى 12 والتي تقوم بتخزين قيمة لون معين يمكن اختيارها من لوح الألوان الذي يظهر في شاشة الخصائص أو إعطائها قيمة ثابتة كما فعلنا. في السطر 15 قمنا بتعريف المتغير lastMousePosition بهدف تخزين آخر موقع للمؤشر حتى نستخدمه في حساب الإزاحة عند تصيير كل إطار. عند بداية التشغيل (السطر 23) نستعمل lastMousePosition لتخزين قيمة الموقع الحالي للمؤشر والتي نحصل عليها عن طريق Input.mousePosition وذلك حتى تكون الإزاحة صفراً عند تصيير الإطار الأول.

بعد ذلك ندخل في دورة التحديث ونقوم بقراءة المدخلات بشكل متتابع. البداية مع الأسطر من 28 إلى 37 والتي نفحص من خلالها ما إذا كان اللاعب يضغط حاليا على أحد الأزرار الثلاثة. الدّالّة ()Input.GetMouseButton تقوم بهذه المهمة وما علينا سوى تزويدها برقم الزر الذي نريد فحص حالته: 0 للزر الأيسر و1 للأيمن و2 للأوسط. ما نفعله في هذه الأسطر ببساطة هو تغيير لون الخامّة الحالية للكائن بناء على الزر الذي ضغطه اللاعب.

في الأسطر 40 إلى 43 نقوم بحساب المسافة التي تحركها المؤشر، وذلك بطرح موقعه خلال الدورة السابقة من موقعه الحالي، ثم نقوم بتحريك الكائن على المحورين x و y بمقدار المسافة المحسوبة مضروبة بسرعة الحركة. بما أننا نتحدث عن مؤشر الفأرة فإن موقعه بطبيعة الحال ثنائي الأبعاد، لذا فالقيمة z لموقعه تكون دائما صفراً ولا داعي لأن ندخلها في حساباتنا. بعد ذلك وفي السطر 46 نقوم بتحديث آخر موقع للمؤشر ليصبح مساويا لموقعه الحالي، بالتالي نصبح جاهزين لحساب الإزاحة الجديدة في الدورة القادمة.

الخطوة الأخيرة هي قراءة حركة عجلة الفأرة نحو الأعلى أو الأسفل، وذلك عن طريق الدّالّة ()GetAxisInput. والتي نعطيها اسم المحور المطلوب قراءته. يتم إعداد المحاور في نافذة خاصة بالمدخلات قد نتطرق لها لاحقا. لكننا على الأقل نمتلك المحور الافتراضي المسمى Mouse ScrollWheel والمزود تلقائيا من قبل Unity وما علينا سوى استدعاء اسمه. إن لم تتحرك العجلة فإن القيمة المرجعة تساوي صفراً. أما إذا أدار اللاعب العجلة نحو الأسفل فإن القيمة تساوي 1-، وإذا أدارها نحو الأعلى فإن القيمة تساوي 1. بناء على هذه القيمة نقوم بإضافة أو طرح متجه بقيمة 1 مضروبا في قيمة معامل تغيير الحجم ونخزن القيمة في transform.localScale لتطبيقها على حجم الكائن. يمكنك الاطّلاع على هذا المثال في المشهد scene4 في المشروع المرفق.

السابقالتالي

تعليقات واستفسارات