الشهاب الحارق
13 Feb 2002, 05:08 AM
السلام عليكم ورحمة الله وبركاته
part 7 Action Script Fundamental
الدرس السابع الوظيفة Function القسم الأول
حمل الأمثلة كلها (http://mypage.ayna.com/highspy/ActionScript/function/functions.zip)
كثيرا ما نسمع عن الوظائف في لغات البرمجة و كانت بمثابة الحلم الذي يراود كل مبرمج مبتدأ
آنذاك ولكن قليلٌ فقط من المبرمجين الذين تمرسُ في هذا المنعطف البرمجي وبقي الأخر ون
يعكفون على الطريقة الكلاسيكية القديمة حيث الكتابة المتكررة والمملة ومن هذا المنطلق
أردنا توضيح الغموض فيها والوقوف على قوانينها .
قبل أن ابدأ في الشرح أريد فقط أن أبين متى نحتاج إلى الوظيفة وما مدى الاستفادة منها ؟
جواب السؤال الأول هو : نفس النصوص البرمجية أن تتكرر على عدة عناصر
جواب السؤال الثاني الفائدة عظيمة وغير محصورة حيث نستطيع أن نتبادل الوظائف بيننا
فيما بعد يوم إنشاء الله تكون قد بلغتم مبلغكم في ألا كشن أسكر بت بحول الله سبحانه وتعالى .
التركيبة النصية للوظيفة
function
Syntax
function functionname ([argument0, argument1,...argumentN]){
statement(s)
}
function ([argument0, argument1,...argumentN]){
statement(s)
}
حتى لا تكترث من هذه التركيبة الشبه معقدة فقط تذكر أننا وضعنا تركيبتها الآن كافتراض
على أي شارح أن يبدأ بهذا الأسلوب ثم سنفصل إنشاء الله حسبما نراهُ اسهل وأيسر .
الطريقة في التركيبة النصية الأولى اعتماد على أنها وظيفة عالمية أو بالأصح ذات الوضع الاعتيادي
أما الطريقة الثانية فهي استخدام الوظيفة على أنها نص برمجي وليست وظيفة مستقلة بذاتها .
وحتى لا تتوه في هذه الدوامة يفضل أن تنسى هذا قليلً حتى نعود إليه فيما بعد .
يقول الكاتب أن هنالك أمور لابد أن تحفظها عن ظهر قلب حتى يسهل عليك تركيب الوظيفة بالشكل المطلوب
1- تعريف الوظيفة Function declaration
2- مناداة الوظيفة Function invocation
3- عناصر الوظيفة Function arguments and parameters
4- إنهاء الوظيفة Function termination
5- محيط الوظيفة Function scope
إنشاء الوظيفة .
أولاً لابد من كتابة النص البرمجي للوظيفة وهو function
ثم بعد ذلك اسم الوظيفة function name
ثم القوسين بعد الاسم ()
ثم نفتح قوس منحني {
وننهي الوظيفة بالقوس المنحني المقابل }
وتكون بهذا الطريقة
Function nassir() {
}
نريد الآن أن نعرض رسالة ترحيب عن طريق الوظيفة
أولاً لابد أن نقوم بإنشاء الوظيفة
function greeting() {
trace(“hello this message comes from greeting function “)
}
الآن بعد ما انتهينا من إنشاء الوظيفة سنقوم بمناداة الوظيفة عن طريق الأمر trace()
trace(greeting());
حاول مناداة الوظيفة في الدرس المرفق ستجد أن الوظيفة من الأصل موجودة فقط حاول مناداتها عن
طريق الأمر trace()
اسم الدرس examfunction1
ثم بعد ذلك تابع بقية الشرح .
تمرير القيم إلى الوظائف
وهي مقسمة إلى عدة أقسام وسنسوقها لك من اليسير إلى الاحتراف .
التمرين الأول في تمرير القيم إلى الوظيفة
width = 550 height = 400
function growball () {
ball._x +=10;
ball._y +=10;
}
هذا الوظيفة ستكون في الفريم الأول للمشهد الرئيسي
ثم نصنع فلم نسميه في الاسم التعريفي instance name و يكون أسمه ball
ثم نصنع زر button نضع فيه هذا النص البرمجي الذي ينادي هذه الوظيفة
هذا النص البرمجي الذي يحتويه الزر.
on (press) {
growball();
}
الشرح : -
عرفنا كيف ننشئ الوظيفة عن طريق النص البرمجي ثم نكتب اسم الوظيفة ثم القوسين ثم القوس المنحني ثم إغلاق الوظيفة
الزيادة في هذا المثال هو وضع قيمة متزايدة لعرض الكرة ولطولها كلما تم الضغط على الزر
نستنتج من ذلك أن الوظيفة لا تعمل إلا إذا ما تم مناداتها عن طريق هذا الزر .
كذلك نستنتج أن الوظيفة لا تعمل إلا على الفلم الذي أسمه ball
حاول اكتشاف الأخطاء في هذا التركيبة النصية
Functions random () {
Ball._x +=110;
Ball.y+=111;
{
الزر الذي ينادي هذه الوظيفة فيه هذا النص البرمجي
On (press) {
Rand();
}
حاول أن تبني نفس التركيبة النصية ولكن بالشكل الصحيح .
إنشاء وظيفة مع عناصرها .
في هذا القسم سوف نقوم بعمل متقدم وهو وضع عناصر الوظيفة لتأدية مهام معينة
نتذكر الآن التركيبة النصية للوظيفة التي ذكرناها في بادئ الدرس وهي
Syntax
function functionname ([argument0, argument1,...argumentN]){
statement(s)
ترى العناصر argument مرتبة بالأرقام من صفر إلى مالا نهاية وهي تلك القيم التي تنفذ المهام الملقى على
عاتقها في محيط الوظيفة التي تكمن بداخلها
تعالى الآن نطور العمل السابق عن الكرة ball بشكل افضل
أضف في القوسين هذه العناصر parameters وهم كالآتي theclip,xscalevalue,yscalevalue
ثم استبدل النص البرمجي الذي يشير الى الكرة ball بالعنصر theclip
وبدل القيم بعد عملية Assignment Operators وهي += بالعنصر xscalevalue
للخاصية _xscale والعنصر yscalevalue للخاصية _yscale
الشكل النهائي لهذه النصوص البرمجية كالتالي
function growball (theclip,xscalevalue,yscalevalue) {
theclip._xscale +=xscalevalue;
theclip._yscale +=yscalevalue;
}
ثم ضع هذا النص البرمجي في الزر
on (press) {
growball(ball,10,10);
}
width = 550 height = 400
الشرح الجديد في هذا الدرس لاشيء إطلاقاً و إنما فقط تغير تركيبة النصوص البرمجية إذا صح التعبير
لكن الهدف منشود فيها وهو تعريف تمرير القيم إلى الوظائف وإخبارها عن القيم التي ستمرر إلى
الكرة بالخاصية الطولية والعرضية للكرة xscale yscale
ترى في بداية الوظيفة قمنا بوضع العناصر و هي أي اسم نكتبها إلا كما ذكرنا في دروسنا السابقة
أننا نتجنب الكلمات المحجوزة في فلاش يمكن الاطلاع على الدروس السابقة لهذا الشأن
ثم بعد تعريف العناصر لابد أن تكون في محيط الوظيفة تؤدي عملاً ما وإلا ستكون عديمة الفائدة
لو افترضنا أننا زدنا في العناصر عنصرً اسمه zscale شاهد هذا المثال
function growball (theclip,xscalevalue,yscalevalue,zscale) {
theclip._xscale +=xscalevalue;
theclip._yscale +=yscalevalue;
}
ثم وضعنا نفس الأمر الذي في الزر ترى في محيط الوظيفة استخدمنا فقط الأمرين السابقين وتجاهلنا العنصر
الثالث لذا نستنتج من ذلك أن العنصر الثالث عديم الفائدة كونه ليس له دور يؤديه في محيط هذه الوظيفة
وكذلك من الأشياء الهامة أن نكتب اسم العناصر بالشكل التوافقي مع الوظيفة التي ستؤديها في أل function
وذلك من البديهي أن الاسم يعطينا تعريف عن المهمة التي سيقوم بها
فمثلاً theclip يشير إلى انه سيأخذ الاسم التعريفي للفلم instance name of movie clip
و xscalevalue يعبر عن قيمة الخاصية العرضية التي سيعتمد عليها theclip و هلم جرى .
المهم أننا بعد أن وضعنا عناصر للوظيفة نريدها أن تؤدي عملاً ما لتكون ذات فائدة
فقمنا بوضعها في محيط هذه الوظيفة واسندنا لها مهام ذكرناها للتو
جاء الآن الدور السحري لهذه الوظيفة وهي تأدية المهام عند مناداتها invoking or calling function
وهي في مثالنا هذا طبعً عبر الزر الذي سيخاطب هذه الوظيفة ويعطيها قيم لعناصرها فتقوم هي معتمدةً على
هذه القيم وتمررها إلى تلك العناصر
كيف يكون ذلك ؟
on (press) {
growball(ball,10,10);
}
تلاحظ أن إذا ما أردنا مناداة الوظيفة ذكرنا اسمها في بادئ الأمر growball()
ثم بعد ذلك قمنا بوضع قيم للعناصر التي بالطبع نحن نعلم لما وضعت
فالقيمة الأولى ستكون بالطبع للعنصر الأول للوظيفة
Theclip ==ball
Xscalevalue == 10
Yscalevalue == 10
حيث اسم التعريفي للفلم سيكون القيمة للعنصر theclip
وتكون القيمة 10 للعنصر xscalevalue
والثالث للثالث
الآن تعالى نتخيل كيف ستقوم الوظيفة بالعمل بشكل تخيلي صرف
سيكون شكلها كالتالي عندما تضغط على الزر.
Function growball(ball,10,10) {
Ball._xscale += 10;
Ball._yscale += 10;
}
وهذا فقط يحدث حينما تقوم يا عزيزي بالضغط على الزر وينتهي عندما يتحرر الزر من الضغط عليه
بل تموت كل القيم و لا عزاء لها وتعود التركيبة النصية الأولى إلى نشأتها الأولى فقط ريثما يتحرر الزر
من القيم التي أرسلها إلى هذه الوظيفة وستكون كسابقِ عهدها في طورها الأول .
function growball (theclip,xscalevalue,yscalevalue) {
theclip._xscale +=xscalevalue;
theclip._yscale +=yscalevalue;
}
تطوير عمل الوظيفة عن طريق نصوص الإدخال input boxes
width = 550 height = 400
تذكر فقط أن كلما كثفنا التمارين كلما كانت الاستفادة اكثر .
function controllmc(theclip,xscale,yscale,rotateit,width,he ight,alpha,x,y) {
theclip._xscale = xs;
theclip._yscale = ys;
theclip._rotation = rotateit;
theclip._width = width;
theclip._height = height;
theclip._alpha = alpha;
theclip._x = x;
theclip._y = y;
}
ماذا سنزيدُ على عملنا السابق سوى أننا نضع نصوص الإدخال ونجعل كل واحد خاص لخاصية الكرة
يوافقها من حيث الاسم كمدلول على العمل المكلف به
وكما تلاحظ غيرنا اسم المتغير تماشياً مع مهام العناصر بداخلة حيث كان في السابق عنصرين فقط لتحريك الكرة لكن صار
الآن له اكثر من ستة عناصر ومهام لذلك أعطيناه اسم المتحكم controllmc
وهذا ما سيحويه الزر .
on(press) {
controllmc(ball,xs,ys,r,w,h,a,x,y);
}
وصلنا إلى نهاية القسم الاول وسيكون لنا انشاء الله تكمله لاحقاً
هذا والله اعلى واعلم السلام عليكم
part 7 Action Script Fundamental
الدرس السابع الوظيفة Function القسم الأول
حمل الأمثلة كلها (http://mypage.ayna.com/highspy/ActionScript/function/functions.zip)
كثيرا ما نسمع عن الوظائف في لغات البرمجة و كانت بمثابة الحلم الذي يراود كل مبرمج مبتدأ
آنذاك ولكن قليلٌ فقط من المبرمجين الذين تمرسُ في هذا المنعطف البرمجي وبقي الأخر ون
يعكفون على الطريقة الكلاسيكية القديمة حيث الكتابة المتكررة والمملة ومن هذا المنطلق
أردنا توضيح الغموض فيها والوقوف على قوانينها .
قبل أن ابدأ في الشرح أريد فقط أن أبين متى نحتاج إلى الوظيفة وما مدى الاستفادة منها ؟
جواب السؤال الأول هو : نفس النصوص البرمجية أن تتكرر على عدة عناصر
جواب السؤال الثاني الفائدة عظيمة وغير محصورة حيث نستطيع أن نتبادل الوظائف بيننا
فيما بعد يوم إنشاء الله تكون قد بلغتم مبلغكم في ألا كشن أسكر بت بحول الله سبحانه وتعالى .
التركيبة النصية للوظيفة
function
Syntax
function functionname ([argument0, argument1,...argumentN]){
statement(s)
}
function ([argument0, argument1,...argumentN]){
statement(s)
}
حتى لا تكترث من هذه التركيبة الشبه معقدة فقط تذكر أننا وضعنا تركيبتها الآن كافتراض
على أي شارح أن يبدأ بهذا الأسلوب ثم سنفصل إنشاء الله حسبما نراهُ اسهل وأيسر .
الطريقة في التركيبة النصية الأولى اعتماد على أنها وظيفة عالمية أو بالأصح ذات الوضع الاعتيادي
أما الطريقة الثانية فهي استخدام الوظيفة على أنها نص برمجي وليست وظيفة مستقلة بذاتها .
وحتى لا تتوه في هذه الدوامة يفضل أن تنسى هذا قليلً حتى نعود إليه فيما بعد .
يقول الكاتب أن هنالك أمور لابد أن تحفظها عن ظهر قلب حتى يسهل عليك تركيب الوظيفة بالشكل المطلوب
1- تعريف الوظيفة Function declaration
2- مناداة الوظيفة Function invocation
3- عناصر الوظيفة Function arguments and parameters
4- إنهاء الوظيفة Function termination
5- محيط الوظيفة Function scope
إنشاء الوظيفة .
أولاً لابد من كتابة النص البرمجي للوظيفة وهو function
ثم بعد ذلك اسم الوظيفة function name
ثم القوسين بعد الاسم ()
ثم نفتح قوس منحني {
وننهي الوظيفة بالقوس المنحني المقابل }
وتكون بهذا الطريقة
Function nassir() {
}
نريد الآن أن نعرض رسالة ترحيب عن طريق الوظيفة
أولاً لابد أن نقوم بإنشاء الوظيفة
function greeting() {
trace(“hello this message comes from greeting function “)
}
الآن بعد ما انتهينا من إنشاء الوظيفة سنقوم بمناداة الوظيفة عن طريق الأمر trace()
trace(greeting());
حاول مناداة الوظيفة في الدرس المرفق ستجد أن الوظيفة من الأصل موجودة فقط حاول مناداتها عن
طريق الأمر trace()
اسم الدرس examfunction1
ثم بعد ذلك تابع بقية الشرح .
تمرير القيم إلى الوظائف
وهي مقسمة إلى عدة أقسام وسنسوقها لك من اليسير إلى الاحتراف .
التمرين الأول في تمرير القيم إلى الوظيفة
width = 550 height = 400
function growball () {
ball._x +=10;
ball._y +=10;
}
هذا الوظيفة ستكون في الفريم الأول للمشهد الرئيسي
ثم نصنع فلم نسميه في الاسم التعريفي instance name و يكون أسمه ball
ثم نصنع زر button نضع فيه هذا النص البرمجي الذي ينادي هذه الوظيفة
هذا النص البرمجي الذي يحتويه الزر.
on (press) {
growball();
}
الشرح : -
عرفنا كيف ننشئ الوظيفة عن طريق النص البرمجي ثم نكتب اسم الوظيفة ثم القوسين ثم القوس المنحني ثم إغلاق الوظيفة
الزيادة في هذا المثال هو وضع قيمة متزايدة لعرض الكرة ولطولها كلما تم الضغط على الزر
نستنتج من ذلك أن الوظيفة لا تعمل إلا إذا ما تم مناداتها عن طريق هذا الزر .
كذلك نستنتج أن الوظيفة لا تعمل إلا على الفلم الذي أسمه ball
حاول اكتشاف الأخطاء في هذا التركيبة النصية
Functions random () {
Ball._x +=110;
Ball.y+=111;
{
الزر الذي ينادي هذه الوظيفة فيه هذا النص البرمجي
On (press) {
Rand();
}
حاول أن تبني نفس التركيبة النصية ولكن بالشكل الصحيح .
إنشاء وظيفة مع عناصرها .
في هذا القسم سوف نقوم بعمل متقدم وهو وضع عناصر الوظيفة لتأدية مهام معينة
نتذكر الآن التركيبة النصية للوظيفة التي ذكرناها في بادئ الدرس وهي
Syntax
function functionname ([argument0, argument1,...argumentN]){
statement(s)
ترى العناصر argument مرتبة بالأرقام من صفر إلى مالا نهاية وهي تلك القيم التي تنفذ المهام الملقى على
عاتقها في محيط الوظيفة التي تكمن بداخلها
تعالى الآن نطور العمل السابق عن الكرة ball بشكل افضل
أضف في القوسين هذه العناصر parameters وهم كالآتي theclip,xscalevalue,yscalevalue
ثم استبدل النص البرمجي الذي يشير الى الكرة ball بالعنصر theclip
وبدل القيم بعد عملية Assignment Operators وهي += بالعنصر xscalevalue
للخاصية _xscale والعنصر yscalevalue للخاصية _yscale
الشكل النهائي لهذه النصوص البرمجية كالتالي
function growball (theclip,xscalevalue,yscalevalue) {
theclip._xscale +=xscalevalue;
theclip._yscale +=yscalevalue;
}
ثم ضع هذا النص البرمجي في الزر
on (press) {
growball(ball,10,10);
}
width = 550 height = 400
الشرح الجديد في هذا الدرس لاشيء إطلاقاً و إنما فقط تغير تركيبة النصوص البرمجية إذا صح التعبير
لكن الهدف منشود فيها وهو تعريف تمرير القيم إلى الوظائف وإخبارها عن القيم التي ستمرر إلى
الكرة بالخاصية الطولية والعرضية للكرة xscale yscale
ترى في بداية الوظيفة قمنا بوضع العناصر و هي أي اسم نكتبها إلا كما ذكرنا في دروسنا السابقة
أننا نتجنب الكلمات المحجوزة في فلاش يمكن الاطلاع على الدروس السابقة لهذا الشأن
ثم بعد تعريف العناصر لابد أن تكون في محيط الوظيفة تؤدي عملاً ما وإلا ستكون عديمة الفائدة
لو افترضنا أننا زدنا في العناصر عنصرً اسمه zscale شاهد هذا المثال
function growball (theclip,xscalevalue,yscalevalue,zscale) {
theclip._xscale +=xscalevalue;
theclip._yscale +=yscalevalue;
}
ثم وضعنا نفس الأمر الذي في الزر ترى في محيط الوظيفة استخدمنا فقط الأمرين السابقين وتجاهلنا العنصر
الثالث لذا نستنتج من ذلك أن العنصر الثالث عديم الفائدة كونه ليس له دور يؤديه في محيط هذه الوظيفة
وكذلك من الأشياء الهامة أن نكتب اسم العناصر بالشكل التوافقي مع الوظيفة التي ستؤديها في أل function
وذلك من البديهي أن الاسم يعطينا تعريف عن المهمة التي سيقوم بها
فمثلاً theclip يشير إلى انه سيأخذ الاسم التعريفي للفلم instance name of movie clip
و xscalevalue يعبر عن قيمة الخاصية العرضية التي سيعتمد عليها theclip و هلم جرى .
المهم أننا بعد أن وضعنا عناصر للوظيفة نريدها أن تؤدي عملاً ما لتكون ذات فائدة
فقمنا بوضعها في محيط هذه الوظيفة واسندنا لها مهام ذكرناها للتو
جاء الآن الدور السحري لهذه الوظيفة وهي تأدية المهام عند مناداتها invoking or calling function
وهي في مثالنا هذا طبعً عبر الزر الذي سيخاطب هذه الوظيفة ويعطيها قيم لعناصرها فتقوم هي معتمدةً على
هذه القيم وتمررها إلى تلك العناصر
كيف يكون ذلك ؟
on (press) {
growball(ball,10,10);
}
تلاحظ أن إذا ما أردنا مناداة الوظيفة ذكرنا اسمها في بادئ الأمر growball()
ثم بعد ذلك قمنا بوضع قيم للعناصر التي بالطبع نحن نعلم لما وضعت
فالقيمة الأولى ستكون بالطبع للعنصر الأول للوظيفة
Theclip ==ball
Xscalevalue == 10
Yscalevalue == 10
حيث اسم التعريفي للفلم سيكون القيمة للعنصر theclip
وتكون القيمة 10 للعنصر xscalevalue
والثالث للثالث
الآن تعالى نتخيل كيف ستقوم الوظيفة بالعمل بشكل تخيلي صرف
سيكون شكلها كالتالي عندما تضغط على الزر.
Function growball(ball,10,10) {
Ball._xscale += 10;
Ball._yscale += 10;
}
وهذا فقط يحدث حينما تقوم يا عزيزي بالضغط على الزر وينتهي عندما يتحرر الزر من الضغط عليه
بل تموت كل القيم و لا عزاء لها وتعود التركيبة النصية الأولى إلى نشأتها الأولى فقط ريثما يتحرر الزر
من القيم التي أرسلها إلى هذه الوظيفة وستكون كسابقِ عهدها في طورها الأول .
function growball (theclip,xscalevalue,yscalevalue) {
theclip._xscale +=xscalevalue;
theclip._yscale +=yscalevalue;
}
تطوير عمل الوظيفة عن طريق نصوص الإدخال input boxes
width = 550 height = 400
تذكر فقط أن كلما كثفنا التمارين كلما كانت الاستفادة اكثر .
function controllmc(theclip,xscale,yscale,rotateit,width,he ight,alpha,x,y) {
theclip._xscale = xs;
theclip._yscale = ys;
theclip._rotation = rotateit;
theclip._width = width;
theclip._height = height;
theclip._alpha = alpha;
theclip._x = x;
theclip._y = y;
}
ماذا سنزيدُ على عملنا السابق سوى أننا نضع نصوص الإدخال ونجعل كل واحد خاص لخاصية الكرة
يوافقها من حيث الاسم كمدلول على العمل المكلف به
وكما تلاحظ غيرنا اسم المتغير تماشياً مع مهام العناصر بداخلة حيث كان في السابق عنصرين فقط لتحريك الكرة لكن صار
الآن له اكثر من ستة عناصر ومهام لذلك أعطيناه اسم المتحكم controllmc
وهذا ما سيحويه الزر .
on(press) {
controllmc(ball,xs,ys,r,w,h,a,x,y);
}
وصلنا إلى نهاية القسم الاول وسيكون لنا انشاء الله تكمله لاحقاً
هذا والله اعلى واعلم السلام عليكم