السلام عليكم و رحمة الله
مرحبا بكم في درس جديد من دورة تعلم الاكشن سكربت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:
الفرق بين استدعاء attribute و method:
ال method تمتلك مداخل (و قد لا تملك) 
عموما تنتهي بقوسين
object.method();
لكن ال attribut لا نضع فيه اقواس
مثلما كنا نرى في درس الجداول مع المتغير length
 myArray.length
كنا ندخل الى attribute اسمه length و الذي يحتوي على عدد الخانات (طول الجدول)
____________________________________________________________________
الان سأطرح عليكم هذا الكود و قوموا بتجريبه قبل الدخول الى الدرس القادم 
أطلب منكم تغيير كود timeline لاظهار قيمة life  الخاصة بالاعب p1
يعني
 var  p1 : player = new player("player 1");
trace(p1.life);


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