PRG of RPG
03-12-2002, 08:22 AM
بسم الله الرحمن الرحيم....
نبدأ الموضوع الثاني من برمجة الالعاب : التصادم(Collision) بالبرمجة وليست crash :) ....
ملاحظة / لن تستفيد شي من الدروس اذا لم تتعلم لغة البيسك ....خذها مني...اذا تبي تتعلم اللغة فيه كتاب في السوق اسمه "فيجوال بيسك 6 للمبتدأيين" اصدار مكتبة جرير ... انا قرأت الكتاب في 3 ايام وسويت برامج ماكنت اتوقعها :)
قبل ذلك .... يجب دراسة الدرس السابق(التحريك) للأننا سوف نكمل من اخر درس فيه....
ماهو التصادم :
بإختصار عند مرور الشخصية أمام الجدار هل تريدها ان تخترق هذا الجدار ام تقف ؟
كيف يعرف الكمبيوتر أن هنالك جدار ولا يجب أن تخترقه ؟
المثال الاخير في التحريك كان يتحدث عن تحريك شخصية ماريو كما في الشكل التالي :
http://www.arab3.com/upload/images/Dec02/game_maker_1.jpg
وعند التصادم سنضع جدارين لذلك وسيكون الشكل كالتالي :
http://www.arab3.com/upload/images/Dec02/game_maker_2.jpg
نلاحظ وجود جدارين الاول wall1 على اليسار والاخر wall2 على اليمين .
اولا : الجدار wall1
الان كيف اعرف أن الشخصية تصادمت مع هذا الجدار ...
اولا الجدار ثابت والشخصية متحركة . واذا كان اخر نقطة في الجدار احداثيها السيني اكبر من اول نقطة في الشخصية اذن حدث تصادم.
بصيغة اخرى : اذا كان يمين الجدار احداثيه السيني اكبر من يسار الصورة ...هنالك تصادم.
ولاكن كيف اعرف يمين الصورة ففجوال بيسك لا يقدم سوى اليسار(left) ...وذلك بإستخدام :
picture2.left + picture2.width
اليس عرض الصورة + left = اليمين :)
اذن
If (Picture2.Left + Picture2.Width) >= Picture1.Left Then .....there is Collision
---------
وبنفس الطريقه wall2 ... ولكن wall2 يقع يميناً ... فنقول :
If (Picture1.Left + Picture1.Width) >= Picture3.Left Then .....there is Collision
__________________________________
والان نكمل مثال التحريك لكي يشمل التصادم :
افتح مثال تحريك 1-7 :
الكود الذي لديك شكله كالتالي :
Private Sub Form_Load()
Call Init
Picture1.Picture = LoadPicture(c)
End Sub
Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer)
Static step As Integer
Select Case KeyCode
Case 39
Picture1.Left = Picture1.Left + 50
If step = 0 Then
step = 1
Picture1.Picture = LoadPicture(c)
ElseIf step = 1 Then
step = 0
Picture1.Picture = LoadPicture(d)
End If
Case 37
Picture1.Left = Picture1.Left - 50
If step = 0 Then
step = 1
Picture1.Picture = LoadPicture(a)
ElseIf step = 1 Then
step = 0
Picture1.Picture = LoadPicture(b)
End If
End Select
Text1.Text = step
End Sub
سنعرف الان متغيرين من نوع Boolean في مكان المتغيرات العامة General ...وذلك لاننا سنستخدمهما في فروع البرنامج المختلفة....الاول اسمه wall1 والاخر wall2 كالتالي :
Dim wall1 As Boolean
Dim wall2 As Boolean
نضيف دالة اسمها Collision ونضع فيها :
Private Sub Collision()
If (Picture2.Left + Picture2.Width) >= Picture1.Left Then wall1 = True Else wall1 = False
If (Picture1.Left + Picture1.Width) >= Picture3.Left Then wall2 = True Else wall2 = False
End Sub
فإذا كان هنالك تصادم في الجدار الاول فليس هنالك تصادم في الجدار الاخر والعكس صحيح ... ايعقل ان ماريو يتصادم مع الجدارين معاً .... لماذا نفعل ذلك ؟ ... لان ماريو عندما يصطدم مع الجدار الايسر (wall1) سيكون wall1 = true ... وعندما يذهب يميناً سيستمر wall1 =true ولن تستطيع التحرك يساراً... اذا لمم تتضح الفكره حاول انشاء تصادم بنفسك وهنا الفائدة الحقيقية من الدرس .
نحن لم نضع حتى الان شرط يوقف تحرك الشخصية :
فنضع اذا كان wall1 = false ... تتحرك الشخصية يساراً واذا كان wall1 =true فلا تتحرك الشخصية ... نف الشي مع wall2
Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer)
Static step As Integer
Call Collision
Select Case KeyCode
Case 39
If wall2 = False Then
Picture1.Left = Picture1.Left + 50
If step = 0 Then
step = 1
Picture1.Picture = LoadPicture(c)
ElseIf step = 1 Then
step = 0
Picture1.Picture = LoadPicture(d)
End If
End If
Case 37
If wall1 = False Then
Picture1.Left = Picture1.Left - 50
If step = 0 Then
step = 1
Picture1.Picture = LoadPicture(a)
ElseIf step = 1 Then
step = 0
Picture1.Picture = LoadPicture(b)
End If
End If
End Select
Text1.Text = step
End Sub
هذا هو مبدأ التصادم ...
تخيل ان تصمم تصادم لصخره غير منتظمة الشكل للعبة ثلاثية الابعاد ... ستواجهك مشااااااااكل كبيرة وانا اعني (كبيره) لتلك الحالات .....
سأرفق ملف به جميع الدروس حتى هذه اللحظة .
من يريد أن يسأل عن التصادم فلقد انتهينا منه تقريباً ... يضعه هنا ... والموضوع القادم سيتحدث عن "اشكال جميلة" .......
تحياتي :)
نبدأ الموضوع الثاني من برمجة الالعاب : التصادم(Collision) بالبرمجة وليست crash :) ....
ملاحظة / لن تستفيد شي من الدروس اذا لم تتعلم لغة البيسك ....خذها مني...اذا تبي تتعلم اللغة فيه كتاب في السوق اسمه "فيجوال بيسك 6 للمبتدأيين" اصدار مكتبة جرير ... انا قرأت الكتاب في 3 ايام وسويت برامج ماكنت اتوقعها :)
قبل ذلك .... يجب دراسة الدرس السابق(التحريك) للأننا سوف نكمل من اخر درس فيه....
ماهو التصادم :
بإختصار عند مرور الشخصية أمام الجدار هل تريدها ان تخترق هذا الجدار ام تقف ؟
كيف يعرف الكمبيوتر أن هنالك جدار ولا يجب أن تخترقه ؟
المثال الاخير في التحريك كان يتحدث عن تحريك شخصية ماريو كما في الشكل التالي :
http://www.arab3.com/upload/images/Dec02/game_maker_1.jpg
وعند التصادم سنضع جدارين لذلك وسيكون الشكل كالتالي :
http://www.arab3.com/upload/images/Dec02/game_maker_2.jpg
نلاحظ وجود جدارين الاول wall1 على اليسار والاخر wall2 على اليمين .
اولا : الجدار wall1
الان كيف اعرف أن الشخصية تصادمت مع هذا الجدار ...
اولا الجدار ثابت والشخصية متحركة . واذا كان اخر نقطة في الجدار احداثيها السيني اكبر من اول نقطة في الشخصية اذن حدث تصادم.
بصيغة اخرى : اذا كان يمين الجدار احداثيه السيني اكبر من يسار الصورة ...هنالك تصادم.
ولاكن كيف اعرف يمين الصورة ففجوال بيسك لا يقدم سوى اليسار(left) ...وذلك بإستخدام :
picture2.left + picture2.width
اليس عرض الصورة + left = اليمين :)
اذن
If (Picture2.Left + Picture2.Width) >= Picture1.Left Then .....there is Collision
---------
وبنفس الطريقه wall2 ... ولكن wall2 يقع يميناً ... فنقول :
If (Picture1.Left + Picture1.Width) >= Picture3.Left Then .....there is Collision
__________________________________
والان نكمل مثال التحريك لكي يشمل التصادم :
افتح مثال تحريك 1-7 :
الكود الذي لديك شكله كالتالي :
Private Sub Form_Load()
Call Init
Picture1.Picture = LoadPicture(c)
End Sub
Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer)
Static step As Integer
Select Case KeyCode
Case 39
Picture1.Left = Picture1.Left + 50
If step = 0 Then
step = 1
Picture1.Picture = LoadPicture(c)
ElseIf step = 1 Then
step = 0
Picture1.Picture = LoadPicture(d)
End If
Case 37
Picture1.Left = Picture1.Left - 50
If step = 0 Then
step = 1
Picture1.Picture = LoadPicture(a)
ElseIf step = 1 Then
step = 0
Picture1.Picture = LoadPicture(b)
End If
End Select
Text1.Text = step
End Sub
سنعرف الان متغيرين من نوع Boolean في مكان المتغيرات العامة General ...وذلك لاننا سنستخدمهما في فروع البرنامج المختلفة....الاول اسمه wall1 والاخر wall2 كالتالي :
Dim wall1 As Boolean
Dim wall2 As Boolean
نضيف دالة اسمها Collision ونضع فيها :
Private Sub Collision()
If (Picture2.Left + Picture2.Width) >= Picture1.Left Then wall1 = True Else wall1 = False
If (Picture1.Left + Picture1.Width) >= Picture3.Left Then wall2 = True Else wall2 = False
End Sub
فإذا كان هنالك تصادم في الجدار الاول فليس هنالك تصادم في الجدار الاخر والعكس صحيح ... ايعقل ان ماريو يتصادم مع الجدارين معاً .... لماذا نفعل ذلك ؟ ... لان ماريو عندما يصطدم مع الجدار الايسر (wall1) سيكون wall1 = true ... وعندما يذهب يميناً سيستمر wall1 =true ولن تستطيع التحرك يساراً... اذا لمم تتضح الفكره حاول انشاء تصادم بنفسك وهنا الفائدة الحقيقية من الدرس .
نحن لم نضع حتى الان شرط يوقف تحرك الشخصية :
فنضع اذا كان wall1 = false ... تتحرك الشخصية يساراً واذا كان wall1 =true فلا تتحرك الشخصية ... نف الشي مع wall2
Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer)
Static step As Integer
Call Collision
Select Case KeyCode
Case 39
If wall2 = False Then
Picture1.Left = Picture1.Left + 50
If step = 0 Then
step = 1
Picture1.Picture = LoadPicture(c)
ElseIf step = 1 Then
step = 0
Picture1.Picture = LoadPicture(d)
End If
End If
Case 37
If wall1 = False Then
Picture1.Left = Picture1.Left - 50
If step = 0 Then
step = 1
Picture1.Picture = LoadPicture(a)
ElseIf step = 1 Then
step = 0
Picture1.Picture = LoadPicture(b)
End If
End If
End Select
Text1.Text = step
End Sub
هذا هو مبدأ التصادم ...
تخيل ان تصمم تصادم لصخره غير منتظمة الشكل للعبة ثلاثية الابعاد ... ستواجهك مشااااااااكل كبيرة وانا اعني (كبيره) لتلك الحالات .....
سأرفق ملف به جميع الدروس حتى هذه اللحظة .
من يريد أن يسأل عن التصادم فلقد انتهينا منه تقريباً ... يضعه هنا ... والموضوع القادم سيتحدث عن "اشكال جميلة" .......
تحياتي :)