بسم الله الرحمن الرحيم....
نبدأ الموضوع الثاني من برمجة الالعاب : التصادم(Collision) بالبرمجة وليست crash....
ملاحظة / لن تستفيد شي من الدروس اذا لم تتعلم لغة البيسك ....خذها مني...اذا تبي تتعلم اللغة فيه كتاب في السوق اسمه "فيجوال بيسك 6 للمبتدأيين" اصدار مكتبة جرير ... انا قرأت الكتاب في 3 ايام وسويت برامج ماكنت اتوقعها
قبل ذلك .... يجب دراسة الدرس السابق(التحريك) للأننا سوف نكمل من اخر درس فيه....
ماهو التصادم :
بإختصار عند مرور الشخصية أمام الجدار هل تريدها ان تخترق هذا الجدار ام تقف ؟
كيف يعرف الكمبيوتر أن هنالك جدار ولا يجب أن تخترقه ؟
المثال الاخير في التحريك كان يتحدث عن تحريك شخصية ماريو كما في الشكل التالي :
![]()
وعند التصادم سنضع جدارين لذلك وسيكون الشكل كالتالي :
![]()
نلاحظ وجود جدارين الاول wall1 على اليسار والاخر wall2 على اليمين .
اولا : الجدار wall1
الان كيف اعرف أن الشخصية تصادمت مع هذا الجدار ...
اولا الجدار ثابت والشخصية متحركة . واذا كان اخر نقطة في الجدار احداثيها السيني اكبر من اول نقطة في الشخصية اذن حدث تصادم.
بصيغة اخرى : اذا كان يمين الجدار احداثيه السيني اكبر من يسار الصورة ...هنالك تصادم.
ولاكن كيف اعرف يمين الصورة ففجوال بيسك لا يقدم سوى اليسار(left) ...وذلك بإستخدام :
اليس عرض الصورة + left = اليمينكود:picture2.left + picture2.width
اذن
---------كود: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 :
الكود الذي لديك شكله كالتالي :
سنعرف الان متغيرين من نوع Boolean في مكان المتغيرات العامة General ...وذلك لاننا سنستخدمهما في فروع البرنامج المختلفة....الاول اسمه wall1 والاخر wall2 كالتالي :كود: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
نضيف دالة اسمها Collision ونضع فيها :كود:Dim wall1 As Boolean Dim wall2 As Boolean
فإذا كان هنالك تصادم في الجدار الاول فليس هنالك تصادم في الجدار الاخر والعكس صحيح ... ايعقل ان ماريو يتصادم مع الجدارين معاً .... لماذا نفعل ذلك ؟ ... لان ماريو عندما يصطدم مع الجدار الايسر (wall1) سيكون wall1 = true ... وعندما يذهب يميناً سيستمر wall1 =true ولن تستطيع التحرك يساراً... اذا لمم تتضح الفكره حاول انشاء تصادم بنفسك وهنا الفائدة الحقيقية من الدرس .كود: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 = 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
تخيل ان تصمم تصادم لصخره غير منتظمة الشكل للعبة ثلاثية الابعاد ... ستواجهك مشااااااااكل كبيرة وانا اعني (كبيره) لتلك الحالات .....
سأرفق ملف به جميع الدروس حتى هذه اللحظة .
من يريد أن يسأل عن التصادم فلقد انتهينا منه تقريباً ... يضعه هنا ... والموضوع القادم سيتحدث عن "اشكال جميلة" .......
تحياتي![]()






























....