السلام عليكم .. هذا مثال فيزيائي من اعداد F1 magazine .. المتميزة . http://www.f1-mag.com/ المثال تقريبا من الاعداد الاولى من المجلة . المثال على الفيجوال بيسك . الشرح وهو كله من اعداد المجلة .. : تصميم الألعاب و مراعاة الفيزياء في تصميم الألعاب تعتبر مراعاة القوانين الفيزيائية حجر الأساس للحكم على مصداقية اللعبة ومطابقتها للواقع . لاشك أن ألعاباً ضخمة كـ Splinter Cell أو Half Life 2 قد طورت بشكل كبير لجعلها تحاكي الواقع (الفيزياء) بشكل كبير لتؤثر في نفوس اللاعبين إلى درجة يقول فيها أحدهم "عندما أطلقت النار على الأعداء كان سقوطهم على الأرض حقيقاً جداً "، أما الآخر فيقول "أنا أيضاً عندما أطلقت النار على المصباح انطفئ الضوء وتغير ضوء الغرفة بشكل كلي .... رائع !!!" بالطبع يتطلب هذا طاقماً من المبرمجين المتمرسين ، ومشورة عدد من دارسي الفيزياء لكي ينجحوا هكذا عمل. ما الذي سنقوم به الآن ؟ حسناً .. المثال الذي سنشرحه هو برنامج يبين لنا تأثير الفيزياء على ألعاب ككرة القدم أو المغامرات ، حيث يتأثر عناصر اللعبة ببعضها البعض عبر الاصطدام أو تغير سرعة الرياح. ستقوم أنت بركل الكرة عن طريق تحريك زر الفأرة الأيسر ، في المنطقة المخصصة ، ثم ستلاحظ أثناء حركة الكرة حوادث فيزيائية كثيرة و بحركة واقعيّة (صدم – جاذبية – ارتداد .... الخ) . شرح الكود البرمجي الخاص بلعبتنا الفيزيائيّة : في قسم التصريحات العام General نقوم بتعريف بعض المتغيّرات التي سوف نتعامل معها .
Dim Force As IntegerDim Wind As IntegerDim Bounc As IntegerDim Bounce As StringDim PiC As IntegerDim bForce As IntegerDim bWind As Integer
MsgBox "لتحريك الكرة قم بالنقر باستمرار ضمن المربّع جانباً", 64, "F1 Magazine"lnWind.X1 = Picture5.Width / 2lnWind.Y1 = Picture5.Height / 2lnWind.X2 = lnWind.X1 + 1000lnWind.Y2 = lnWind.Y1Bounce = 0.3Wind = (lnWind.X1 - lnWind.X2) / 15Force = (lnWind.Y1 - lnWind.Y2) / 15
Private Sub Picture5_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)lnWind.X2 = XlnWind.Y2 = YEnd SubPrivate Sub Picture5_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)If Button <> 0 ThenlnWind.X2 = XlnWind.Y2 = YEnd IfEnd Sub
Private Sub Picture5_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)lnWind.X2 = XlnWind.Y2 = YWind = (lnWind.X1 - lnWind.X2) / 15Force = (lnWind.Y2 - lnWind.Y1) / 15End Sub
Private Sub Timer2_Timer()If PiC = 1 ThenPiC = 2Ball.Picture = Picture3.PictureExit SubEnd IfIf PiC = 2 ThenPiC = 3Ball.Picture = Picture4.PictureExit SubEnd IfIf PiC = 3 ThenPiC = 0Ball.Picture = Picture1.PictureExit SubEnd IfIf PiC = 0 ThenPiC = 1Ball.Picture = Picture2.PictureEnd IfEnd Sub
Timer2.Interval = Abs(Wind) * 5
If Box.Left + Box.Width > Me.Width ThenbWind = -(bWind * Bounce)Box.Left = Me.Width - Box.WidthEnd IfIf Box.Left < 0 ThenbWind = -(bWind * Bounce)Box.Left = 0End If
If Ball.Left + Ball.Width > Box.Left And Ball.Left < Box.Left + Box.Width And Ball.Top + Ball.Height > Box.Top And Ball.Top < Box.Top + Box.Height ThenIf Box.Top + Box.Height < Ball.Top + Box.Height / 8 ThenbForce = -(bForce * Bounce)Box.Top = Ball.Top - Box.Height - 1Exit SubEnd IfIf Ball.Top + Ball.Height < Box.Top + Box.Height / 3 ThenForce = -(Force * Bounce)If Wind > 0 ThenWind = Wind - 1End IfIf Wind < 0 ThenWind = Wind + 1End IfBall.Top = Box.Top - Ball.Height - 1Exit SubEnd If
'للطرف الأيسرIf Abs(Ball.Left + Ball.Width - Box.Left) < Abs(Ball.Left - Box.Left - Box.Width) ThenBall.Left = Box.Left - Ball.Width - 2Wind = -(Wind * Bounce) / 2bWind = bWind + Wind * 3If Force > 0 ThenbForce = (bForce + Force) * 2ElsebForce = (bForce - Force) / 2End IfExit SubEnd If'للطرف الأيمنIf Ball.Left < Box.Left + Box.Width ThenBall.Left = Box.Left + Box.Width + 2Wind = -(Wind * Bounce)bWind = bWind + Wind * 3bForce = -((bForce + Force) * 0.2)If Force > 0 ThenbForce = (bForce + Force) * 2ElsebForce = (bForce - Force) / 2End IfExit SubEnd IfEnd IfIf Box.Top + Box.Height >= Line1.Y1 ThenbForce = -(bForce * Bounce)Box.Top = Line1.Y1 - Box.HeightElsebForce = bForce + 1End IfBox.Top = Box.Top + bForceBox.Left = Box.Left + bWindIf bWind > 0 ThenbWind = bWind - 1End IfIf bWind < 0 ThenbWind = bWind + 1End IfIf Slider1.Value = 10 Then Slider1.Value = 9If Slider1.Value < 10 ThenBounce = "0." & Slider1.ValueElseBounce = Slider1.ValueBounce = Right(Bounce, Len(Bounce) - 1)End IfIf Ball.Left + Ball.Width > Me.Width ThenBall.Left = Me.Width - Ball.WidthWind = -(Wind * Bounce)End IfIf Ball.Left < 0 ThenBall.Left = 0Wind = -(Wind * Bounce)End IfForce = Force + 1Ball.Left = Ball.Left - WindBall.Top = Ball.Top + ForceIf Ball.Top + Ball.Height >= Line1.Y1 ThenIf Force <= 1 ThenForce = 0If Wind > 0 ThenWind = Wind - 1End IfIf Wind < 0 ThenWind = Wind + 1End IfBall.Top = Line1.Y1 - Ball.HeightExit SubEnd IfBall.Top = Line1.Y1 - Ball.HeightForce = -(Force * Bounce)End If