الأربعاء، 10 سبتمبر 2014

تعلم AS3 - جزء2 [ OOP ] - الدرس 2.2 [الكلاسات و الكائنات]



السلام عليكم و رحمة الله
مرحبا بكم في درس جديد من دورة تعلم الاكشن سكربت3

في الدرس السابق  قمنا بانشاء أول كلاس لنا اسمها player
في هذا الدرس سنقوم بتطويرها و سنشرح طريقة استعمالها و كيفية تغيير قيم attributes الخاصة بها
و استدعاء ال methods التي تملكها



_________________________________________________________
سنقوم بصنع لعبة بسيطة جدا
و هي انشاء لاعبين
حيث أن كل لاعب لديه اسم و  نقاط خبرة و حياة 
و كل لاعب بامكانه مهاجمة لاعب اخر و في كل هجمة تتضاعف نقاط خبرته الى الضعف اذا لم تكن معدومة  و الا سيتحصل على نقطة واحدة
و كل لاعب يتلقى هجمة من الاعب الاخر و تنقص قيمة حياته نفس قيمة الخبرة التي يملكها الاعب المتعدي
اذا وصلت نقاط الحياة الى  0 او اقل يموت الاعب
مثلا:
الاعب 1 يملك 0 نقاط خبرة
الاعب 2 يملك  0 نقاط خبرة
كلاهما يملكان حياة قيمتها 100
سيناريو :
الاعب 1 يهاجم الاعب 2 
اذن نقاط خبرة الاعب واحد ستصبح نقطة واحدة لانها حاليا معدومة
الاعب 2 يتلقي الضربة و تنقص حياته نفس قيمة خبرة الاعب1 يعني ستصبح 99
-الاعب 1 يهاجم الاعب 2 مجددا
اذن نقاط خبرة الاعب1 ستتضاعف لانها ليست معدومة و ستصبح 1*2 يعني 2
الاعب2 يتلقى الهجمة و تنقص قيمته ب 2 و تصبح 97
...
و هكذا الى ان تصل قيمة حياة واحد منهما الى 0 أو أقل 
__________________________________
حسنا ما هي ال attributes و methods الازمة التي يمكن استنتاجها من الفقرة السابقة؟
كل لاعب لديه اسم اذن هناك attribute من نوع String
كل لاعب لديه نقاط خبرة و حياة اذن هناك attribute للخبرة فليكن xp و الاخر للحياة life
كلاهما من نوع int
كل لاعب يهاجم و يتلقى ضربات اذن هناك method للمهاجمة ()attack و الاخر لتلقي الضربات ()receive
و كل لاعب يموت ()die 
_______________________________________

الكود
نفتح نفس الكلاس السابق و نقوم بتعديله
package
{
      public  class player
     {
          //attributes
         var playerName:String;
         var xp:int;
         var life:int;
        //methods

         public function player(playerName :String= "player_anonyme")
         {
                  //constructor
                 /* 
هذه أول method يتم تنفيذها اوتوماتكيا مع انشاء الكائن (()new player)
                    */
               this.playerName = playerName;
               xp = 0;
               life = 100;
         }
        public function attack( p2:player):void
        {
               if( xp == 0)
                  xp = 1;
              else
                 xp = xp * 2;

              p2.receive(xp);
         }
       public function receive(xp:int):void
      {
             life = life - xp;
            if(life <= 0)
               die(); 
       }
       public function die():void
      {
           trace(this.playerName + " is died!");
      }
   }
}


ملاحظات مهمة بخصوص ال constructor :
فيه يتم عمل initialisation لكل المتغيرات و نقصد بها القيمة الابتدائية لكل attributes
1. 
نلاحظ اننا نملك attribute اسمه playerName
و لدينا مدخل اسمه playerName أي نفس الاسم
كيف نفرق بينهما؟
الحل هو this الذي يعني اننا سنتعمل attribute موجود داخل الكلاس 
و هو اجباري فهذا النوع من المواقف لكي نفرق بين المتغيرين 
هل playerName هو ذلك الخاص بالمدخل ام attribute
الكلمة this ليست اجبارية في مواقف اخرى يمكن وضعها و يمكن الاستغناء عنها
لكن من الافضل كتابها
2.
نلاحظ ان المدخل اختياري مثلما رأينا في درس الدوال 
و هنا عند انشاء instance لل player يمكننا اعطاء مدخل و سيأخذ playerName نفس قيمته
و في حالة عدم اعطاء مدخل سيكون اسمه player_anonyme

الدالة attack نضع فيها الاعب الثاني في المدخل (نوع player)
لان بعد مهاجته سيكون (الاعب الثاني) باستدعاء الدالة receive لكي تنقص قيمة حياته 
________________________________
سنقوم بانشاء  زوجين من instance ل player 
حيث يقوم الاعب 1 بمهاجمة الاعب 2
الاعب 2 يلزمه 7 ضربات لكي يموت
(الضربة الاولى تنقص له نقطة لتصبح نقاط حياته 99
الثانية 97 
الثالثة 93
..الخ)

نعود الى timeline لانشاء لاعبين

var p1 : player = new player("player 1 ");
var p2 : player = new player("player2");
for(vari:int = 0 ; i<7; i++)
     p1.attack(p2);
في الاخير سيكتب لنا 
player2 is died
____________________________________________________________________________
كيفية الدخول الى attributes و methods الخاصة بالكائن من كلاس اخر : 

نقصد بهذا كيف نقوم بتنفيذ method  
أو قراءة أو تغيير قيمة attribute

كما رأينا في الكود السابق
p1.attack(p2);
قمنا باستدعاء الدالة attack الخاصة بالكائن p1 و ذلك بفصل اسم الكائن و اسم الدالة بنقطة
طبعا مع احترام ترتيب و عدد المداخل الخاص ب method مثلما كنا نرى سابقا

اظن أننا متعودون على هذا فلقد سبق و أن استعملناها في درس الجداول عندما كنا نستدعي الدوال push , pop, shift, splice..
اذن تلك الدوال تخص الكلاس Array التي تم برمجتها من طرف مطوري الاكشن سكربت!
 ____________________
نفس الشئ اذا اردنا الدخول الى attributes خاصة بالكائن
الفرق بين استدعاء attribute و method:
ال method تمتلك مداخل (و قد لا تملك) 
عموما تنتهي بقوسين
object.method();
لكن ال attribut لا نضع فيه اقواس
مثلما كنا نرى في درس الجداول مع المتغير length
 myArray.length
كنا ندخل الى attribute اسمه length و الذي يحتوي على عدد الخانات (طول الجدول)
____________________________________________________________________

الان سأطرح عليكم هذا الكود و قوموا بتجريبه قبل الدخول الى الدرس القادم 
أطلب منكم تغيير كود timeline لاظهار قيمة life  الخاصة بالاعب p1
يعني

 var  p1 : player = new player("player 1");
trace(p1.life);



ليست هناك تعليقات:

إرسال تعليق


جميع الحقوق محفوظة لمدونة 2014-2015 as3arabic |