الشهاب الحارق
25 Feb 2002, 10:57 PM
السلام عليكم
Action Script Fundamentals part 9
الجزء الثالث و الأخير من شرح الوظيفة
يقال أن افضل مكان يتم فيه إنشاء الوظيفة هو المشهد الرئيسي للفلم
وذلك لشيئين مهمين أولهما ما يسمى بمحيط الوظيفة حيث المشهد الرئيسي
معني بكل الأفلام سواءً كانت على نفس المشهد أو دخل أفلام أخرى
أي يعني بشكل أصح وظيفة عالمية Global Function
والشيء الثاني هو التنسيق فلو فرضنا أننا عرفنا وظيفة
في فلم فرعي في مشروعنا فإننا سنضطر كلما أردنا مناداة الوظيفة
بكتابة المسار الذي يؤدي بنا إلى تلك الوظيفة مثال _root.myclip.myfunction();
وهذا ليس منطق المبرمجين ولا مذهب المحترفين والمنظمين لأعمالهم على حدٍ سواء .
وعلى الرغم من ذلك فلا مانع لدينا أن نذكر وبشكل مختصر عن محيط الوظائف function scope
وقد ذكرنا للتو أن إذا ما تم تعريف الوظيفة في فلم غير المشهد الرئيسي فإنه لابد أن نقوم بكتابة
مسارها إذا ما أردنا الاستفادة منها وإلا سيكون وجودها دون أدنى فائدة
وقد ضربنا مثالً على ذلك في الأعلى .
المتغير المحلى ومكانتهُ الحساسة في الوظائف
قد تعلم عزيزي القارئ أن المتغيرات في الوظائف تموت بعد ما يصل مترجم فلاش flash compiler
إلى منطقة ال block النهاية بالنسبة للوظيفة ونعني بمنطقة النهاية هو القوس المنحني الذي يقفل الوظيفة }
إلا في حالة واحدة وهذه الحالة تكون في معظم الأحيان خطأ فادح يسبب الكثير من المتاعب وخاصة
المبتدأين الذين لا يفرقون بين المتغير المحلى والعالمي local Variable and Global Variable
الفرق بين المتغير المحلي والمتغير العالمي
المتغير المحلي هو var x = 5; على سبيل المثال لا الحصر وكلمة var هي التي تخبر مترجم فلاش
أن هذا المتغير متغير محلي يموت أو ينتهي بعد انتهاء المترجم من قراءة الوظيفة
الفائدة منه أنه بعد انتهائه أو موته يترك مساحة في الذاكرة مما يوفر أداءً أفضل للجهاز
أما المتغير العالمية فيكون بالشكل التالي x = 5; وما دام أنا لم نكتب قبلهُ الكلمة var فتدل
على أنهُ متغير عالمي Global Variable لا يموت بعد القراءة بل يكون عالة علينا إلى انتهاء البرنامج .
السبب الذي يكون هذا المتغير عالةً علينا
لربما كان لدينا متغير يحمل نفس الاسم في المشهد الرئيسي فسيكون تأثير هذا على
حسب المتغير في الوظيفة وستدخل في دوامة من الاضطراب وذلك لغموض المشكلة
والله في غنى عنها ونحن كذلك .
المنطق يقول
إذا كانت الحاجة إلى متغير يبقى إلى أخر المشروع أو العمل يكون الأفضل استخدام متغير عالمي
مثل حفظ اسم الشخص عند بدء الامتحان أو لعبة والعكس بالعكس
أي متغير يكون فقط لعمل عشوائية ثم ننتهي منه فالمحلي هو الانسب
في هذه الحالة وتذكر أن هذا بالنسبة للوظائف فقط .
أخيراً وظائف كالعناصر Function as Objects
او ما يسمى تمرير وظيفة إلى وظيفة Passing Function to function
حمل الملف تمرير وظيفة إلى وظيفة (http://shihaab.topcities.com/passingfunctiontofunction.fla)
أعطيك مثال صغير والباقي عليك يا عزيزي
مثال ذلك قد تعلم أن الأمر stop() وهو وظيفة و play() وظيفة و ذلك إذا أردت المعرفة كيف؟
الجواب بسيط لقد تعلمنا أن إذا ما أردنا مناداة الوظيفة نناديها بالشكل التالي myfunction();
فالأمر سيان بالنسبة لمناداة وظيفة مدرجة مسبقاً مثل play(); فإننا نستخدم القوسين بعد كتابة
أسم الوظيفة هذا الذي يفسر لنا أن play() ما هي إلا وظيفة مدرجة مسبقاً
نعود إلى ما نحنُ بصددِ وهو تمرير وظيفة إلى وظيفة
التركيبة النصية myfunction(mysecondfunction);
وكعمل حقيقي مثلاً myfunction(Play());
حمل المثال التالي
المشروع الأخير هو كما تعلمون ال jukebox
حمل المشروع الأخير (http://mypage.ayna.com/highspy/ActionScript/jukbox/colorandjukbox.zip)
الذي تم استخدامه في مختبر العرب الثاني
سنقوم الآن بوضع اللمسات الأخيرة علية واستخدام الوظيفة في ذلك
ستكون الوظيفة بالشكل التالي
function playthesong(songNum){
// stop the previous song. if any
song.stop();
// play the song
song = new Sound();
song.attachSound("song"+ songNum);
song.start(0,9999);
}
stop();
اسم الوظيفة playthesong القيمة التي ستمرر في الوظيفة songNum
السطر الأول للوظيفة يقوم بإيقاف أي صوت في حالة تشغيل song.stop();
ما ترى بجانبه خطين مائلين فهو تعليق //
ثم التعريف الأساسي لكل عنصر song = new Sound();
ثم ما يسمى التخاطب المكتبي أي إلصاق الأصوات من المكتبة إلى المشروع
Song.attachSound(“song”+songNum);
وهو يعبر عن الثمانية أصوات الموجودة في المكتبة وهي تبدأ بالشكل هذا
Song1 ,song2 and etc
وبما أن الأصوات يتم تعريفها في هذا العنصر على أنها string identifier
فلابد أن تكون بين علامتي تنصيص يعني المترجم يتعرف على اسم الصوت كأنه نص وليس تعبيري
أو رقمي أو غير ذلك فلا خيار في هذا بالنسبةِ لتعريف الصوت في العنصر
ثم نقول له بعد تعريف الاسم وهو song نستخدم أداة الزيادة أي مع ذلك الصوت أرفق هذا
التعبير وذلك انه لا توجد حوله علامتي تنصيص songNum
وهي تعبر عن رقم الصوت
في الأخير نقول له في هذا الأمر song.start(0,9999);
بأن يقوم بتشغيل الصوت هذا من البداية كونه 0 وإلى 9999 لفه
أي إعادة كلما انتهى يعيد حتى يصل إلى هذا الرقم .
سيكون في الأزرار مناداة الوظيفة بالشكل التالي بالنسبة للزر الأول
on(press) {
playthesong(1);
}
تلاحظ أننا في مناداة الوظيفة فقط كتبت الرقم واحد
أي يعني الأغنية الأولى
والسبب أنه كما ذكرنا في المكتبة لابد أن تكون ملفات الأصوات معنونة بالشكل التالي
الملف الصوتي الأولى song1 الملف الصوتي الثاني song2
قد تعلم أن الصوت لا بد أن يعرف في المكتبة بالضغط عليه بالزر الأيمن
واختيار Linkage ثم نختار Export this symbol ثم نكتب اسم للصوت
لنفترض انك أسميت الملف الصوتي في المكتبة بهذا الاسم during
سيكون طبعاً كتابته في الخانة Identifier ثم OK
في الفريم الأول في المشهد الرئيسي تكتب هذا النص البرمجي
myduring = new Sound();
myduring.attachSound("during");
حيث يتم كل الشغل على المتغير myduring تعلم أن new Sound
هو عنصر الإنشاء الذي لابد أن يبتدأ بكل عنصر بهذه الطريقة المهم
لا أريد أن أخوض في الأمر بشكل اكثر لأنني ادخر ذلك للدرس المخصص بهذا
إنشاء الله طيب . كون الصوت في المكتبة لابد أن نستخدم هذا الكود
myduring.attachSound("during") وكون الصوت string فلابد أن
يكون بين علامتين تنصيص
ثم لتشغيل الصوت عن طريق الضغط على الزر كما ذكرت حفظك الله
ضع هذا الأمر
on(press) {
myduring.start("0",9999);
}
إذا كنت ترغب أن يعمل الصوت مرة واحد فقط امسح الذي بداخل القوسين من
الصفر إلى 9999 .
تعني الصفر 0 بداية الصوت أي من البداية بالنسبة لتشغيل الصوت
والأربع تسعات9999 تعني سيعاد تكرار حلقات الصوت كل ما ينتهي
بهذا الرقم أي تسعة آلاف وتسعمائة وتسعه وتسعون مرة
المهم المطلوب منك هو إدراج أصوات في المكتبة وتعريفها كما ذكرنا
لتتفق مع الوظيفة ولم ارفق الأصوات مع العمل كون المشروع بحجم 10MB
هذا ولله الحمد والمنة انتهينا من الوظيفة لن يكون هنالك امتحان رئفتنً بكم
من جراء هذه الدروس الطويلة
هذا والله تعالى اعلم
Action Script Fundamentals part 9
الجزء الثالث و الأخير من شرح الوظيفة
يقال أن افضل مكان يتم فيه إنشاء الوظيفة هو المشهد الرئيسي للفلم
وذلك لشيئين مهمين أولهما ما يسمى بمحيط الوظيفة حيث المشهد الرئيسي
معني بكل الأفلام سواءً كانت على نفس المشهد أو دخل أفلام أخرى
أي يعني بشكل أصح وظيفة عالمية Global Function
والشيء الثاني هو التنسيق فلو فرضنا أننا عرفنا وظيفة
في فلم فرعي في مشروعنا فإننا سنضطر كلما أردنا مناداة الوظيفة
بكتابة المسار الذي يؤدي بنا إلى تلك الوظيفة مثال _root.myclip.myfunction();
وهذا ليس منطق المبرمجين ولا مذهب المحترفين والمنظمين لأعمالهم على حدٍ سواء .
وعلى الرغم من ذلك فلا مانع لدينا أن نذكر وبشكل مختصر عن محيط الوظائف function scope
وقد ذكرنا للتو أن إذا ما تم تعريف الوظيفة في فلم غير المشهد الرئيسي فإنه لابد أن نقوم بكتابة
مسارها إذا ما أردنا الاستفادة منها وإلا سيكون وجودها دون أدنى فائدة
وقد ضربنا مثالً على ذلك في الأعلى .
المتغير المحلى ومكانتهُ الحساسة في الوظائف
قد تعلم عزيزي القارئ أن المتغيرات في الوظائف تموت بعد ما يصل مترجم فلاش flash compiler
إلى منطقة ال block النهاية بالنسبة للوظيفة ونعني بمنطقة النهاية هو القوس المنحني الذي يقفل الوظيفة }
إلا في حالة واحدة وهذه الحالة تكون في معظم الأحيان خطأ فادح يسبب الكثير من المتاعب وخاصة
المبتدأين الذين لا يفرقون بين المتغير المحلى والعالمي local Variable and Global Variable
الفرق بين المتغير المحلي والمتغير العالمي
المتغير المحلي هو var x = 5; على سبيل المثال لا الحصر وكلمة var هي التي تخبر مترجم فلاش
أن هذا المتغير متغير محلي يموت أو ينتهي بعد انتهاء المترجم من قراءة الوظيفة
الفائدة منه أنه بعد انتهائه أو موته يترك مساحة في الذاكرة مما يوفر أداءً أفضل للجهاز
أما المتغير العالمية فيكون بالشكل التالي x = 5; وما دام أنا لم نكتب قبلهُ الكلمة var فتدل
على أنهُ متغير عالمي Global Variable لا يموت بعد القراءة بل يكون عالة علينا إلى انتهاء البرنامج .
السبب الذي يكون هذا المتغير عالةً علينا
لربما كان لدينا متغير يحمل نفس الاسم في المشهد الرئيسي فسيكون تأثير هذا على
حسب المتغير في الوظيفة وستدخل في دوامة من الاضطراب وذلك لغموض المشكلة
والله في غنى عنها ونحن كذلك .
المنطق يقول
إذا كانت الحاجة إلى متغير يبقى إلى أخر المشروع أو العمل يكون الأفضل استخدام متغير عالمي
مثل حفظ اسم الشخص عند بدء الامتحان أو لعبة والعكس بالعكس
أي متغير يكون فقط لعمل عشوائية ثم ننتهي منه فالمحلي هو الانسب
في هذه الحالة وتذكر أن هذا بالنسبة للوظائف فقط .
أخيراً وظائف كالعناصر Function as Objects
او ما يسمى تمرير وظيفة إلى وظيفة Passing Function to function
حمل الملف تمرير وظيفة إلى وظيفة (http://shihaab.topcities.com/passingfunctiontofunction.fla)
أعطيك مثال صغير والباقي عليك يا عزيزي
مثال ذلك قد تعلم أن الأمر stop() وهو وظيفة و play() وظيفة و ذلك إذا أردت المعرفة كيف؟
الجواب بسيط لقد تعلمنا أن إذا ما أردنا مناداة الوظيفة نناديها بالشكل التالي myfunction();
فالأمر سيان بالنسبة لمناداة وظيفة مدرجة مسبقاً مثل play(); فإننا نستخدم القوسين بعد كتابة
أسم الوظيفة هذا الذي يفسر لنا أن play() ما هي إلا وظيفة مدرجة مسبقاً
نعود إلى ما نحنُ بصددِ وهو تمرير وظيفة إلى وظيفة
التركيبة النصية myfunction(mysecondfunction);
وكعمل حقيقي مثلاً myfunction(Play());
حمل المثال التالي
المشروع الأخير هو كما تعلمون ال jukebox
حمل المشروع الأخير (http://mypage.ayna.com/highspy/ActionScript/jukbox/colorandjukbox.zip)
الذي تم استخدامه في مختبر العرب الثاني
سنقوم الآن بوضع اللمسات الأخيرة علية واستخدام الوظيفة في ذلك
ستكون الوظيفة بالشكل التالي
function playthesong(songNum){
// stop the previous song. if any
song.stop();
// play the song
song = new Sound();
song.attachSound("song"+ songNum);
song.start(0,9999);
}
stop();
اسم الوظيفة playthesong القيمة التي ستمرر في الوظيفة songNum
السطر الأول للوظيفة يقوم بإيقاف أي صوت في حالة تشغيل song.stop();
ما ترى بجانبه خطين مائلين فهو تعليق //
ثم التعريف الأساسي لكل عنصر song = new Sound();
ثم ما يسمى التخاطب المكتبي أي إلصاق الأصوات من المكتبة إلى المشروع
Song.attachSound(“song”+songNum);
وهو يعبر عن الثمانية أصوات الموجودة في المكتبة وهي تبدأ بالشكل هذا
Song1 ,song2 and etc
وبما أن الأصوات يتم تعريفها في هذا العنصر على أنها string identifier
فلابد أن تكون بين علامتي تنصيص يعني المترجم يتعرف على اسم الصوت كأنه نص وليس تعبيري
أو رقمي أو غير ذلك فلا خيار في هذا بالنسبةِ لتعريف الصوت في العنصر
ثم نقول له بعد تعريف الاسم وهو song نستخدم أداة الزيادة أي مع ذلك الصوت أرفق هذا
التعبير وذلك انه لا توجد حوله علامتي تنصيص songNum
وهي تعبر عن رقم الصوت
في الأخير نقول له في هذا الأمر song.start(0,9999);
بأن يقوم بتشغيل الصوت هذا من البداية كونه 0 وإلى 9999 لفه
أي إعادة كلما انتهى يعيد حتى يصل إلى هذا الرقم .
سيكون في الأزرار مناداة الوظيفة بالشكل التالي بالنسبة للزر الأول
on(press) {
playthesong(1);
}
تلاحظ أننا في مناداة الوظيفة فقط كتبت الرقم واحد
أي يعني الأغنية الأولى
والسبب أنه كما ذكرنا في المكتبة لابد أن تكون ملفات الأصوات معنونة بالشكل التالي
الملف الصوتي الأولى song1 الملف الصوتي الثاني song2
قد تعلم أن الصوت لا بد أن يعرف في المكتبة بالضغط عليه بالزر الأيمن
واختيار Linkage ثم نختار Export this symbol ثم نكتب اسم للصوت
لنفترض انك أسميت الملف الصوتي في المكتبة بهذا الاسم during
سيكون طبعاً كتابته في الخانة Identifier ثم OK
في الفريم الأول في المشهد الرئيسي تكتب هذا النص البرمجي
myduring = new Sound();
myduring.attachSound("during");
حيث يتم كل الشغل على المتغير myduring تعلم أن new Sound
هو عنصر الإنشاء الذي لابد أن يبتدأ بكل عنصر بهذه الطريقة المهم
لا أريد أن أخوض في الأمر بشكل اكثر لأنني ادخر ذلك للدرس المخصص بهذا
إنشاء الله طيب . كون الصوت في المكتبة لابد أن نستخدم هذا الكود
myduring.attachSound("during") وكون الصوت string فلابد أن
يكون بين علامتين تنصيص
ثم لتشغيل الصوت عن طريق الضغط على الزر كما ذكرت حفظك الله
ضع هذا الأمر
on(press) {
myduring.start("0",9999);
}
إذا كنت ترغب أن يعمل الصوت مرة واحد فقط امسح الذي بداخل القوسين من
الصفر إلى 9999 .
تعني الصفر 0 بداية الصوت أي من البداية بالنسبة لتشغيل الصوت
والأربع تسعات9999 تعني سيعاد تكرار حلقات الصوت كل ما ينتهي
بهذا الرقم أي تسعة آلاف وتسعمائة وتسعه وتسعون مرة
المهم المطلوب منك هو إدراج أصوات في المكتبة وتعريفها كما ذكرنا
لتتفق مع الوظيفة ولم ارفق الأصوات مع العمل كون المشروع بحجم 10MB
هذا ولله الحمد والمنة انتهينا من الوظيفة لن يكون هنالك امتحان رئفتنً بكم
من جراء هذه الدروس الطويلة
هذا والله تعالى اعلم