PDA

View Full Version : آموزش ساخت یک بازی ساده توسط KGE



kochol
یک شنبه 08 آبان 1384, 14:53 عصر
سلام
بیایید با هم یه بازی ساده توسط Kochol Game Engine بسازیم تا ببینیم کار با این موتور تازه به اومده چه طوری هستش. این بازی که می خواهم بسازم یک بازی ساده هست که بر روی یک جاده صاف ماشینی حرکت می کند و باید از اشیایی که جلوی راهش سبز می شوند جاخالی بده و امتیاز بگیره و هر چه قدر که از زمان بازی می گذره سرعت حرکت ماشین تندتر می شه.

بیایید یک دفعه به سراغ کد نویسی بریم.
1. ابتدا یک پروژه جدید با VB.Net بازکنید اسمشو هر چی دوست دارید بذارید.
2. بعد در پنجره solution Explorer بر روی Add Reference کلیک کنید و فایل KGE.dll را به آن اظافه کنید.
3. در خط اول کدهای مربوط به فرمتون کد زیر را بنویسید تا به ویرایش گر بگویید که می خواهید از KGE استفاده کنید.
Imports KGE
4. با تعریف متغییرهای مربوط به موتور در فضای دید عمومی شروع کنیم.
Dim KgeX As KgeX
Dim Kge3D As Kge3D
این متغییرهای بالا در تعریف موتور بازی باید هر دفعه باشند هر وقت که شما بخواهید از موتور استفاده کنید باید یک متغییر از نوع کلاس اصلی موتور یعنی KgeX تعریف کنید و اگر هم بخواهید از گرافیک 3 بعدی استفاده کنید باید یه متغییر هم از نوع کلاس Kge3D تعریف کنید.

حالا می تونیم کار را شروع کنیم.
ما می خواهیم که جاده زیر ماشین حرکت کند نه ماشین را روی جاده حرکت بدیم این کار دو دلیل داره 1. اگر ماشین را جابجا کنیم باید دوربین هم جابجا کنیم که باعث محاسبات بشتری می شه که در ساخت این بازی احتیاج نیست. 2. اگر بازیکن بازیش خوب باشه و همین طور جلو بره می تونه خیلی از مرکز فضای 3بعدی ما دور بشه که این هم خوب نیست.

5. ما جاده ای که داریم اندازه هاش دقیقا 100*10 واحد هست که یه متغییر تعریف می کنیم تا با اون بتونیم فایلی که مربوط به جاده هست را لود کنیم و نمایش بدیم.
Dim Road as KgeMesh

6. چون که ما می خواهیم در هر ثانیه جاده مان 30 واحد حرکت کند پس به یه تایمر نیاز داریم که بفهمیم که چه قدر از زمان گذشته و برحسب همون جاده را حرکت بدیم.
Dim t As New KgeTimer

7.محل اولیه جاده ها بر روی محور زدها را تعریف می کنیم و همینطور هم سرعت اولیه را
Private RoadDepth0 As Single = 0.0F
Private RoadDepth1 As Single = -100.0F
Private RoadSpeed As Single = 30.0F

8. شروع به لود کردن مقادیر اولیه مان می کنیم.
دقت کرده باشید شما یک بار که دوربین را تعریف کنید دیگر جای ان در رم ذخیره می شه مگر انکه شما بگویید که نمی خواهم فعال باشد. فایل جاده هم باید در شاخه ای باشد که سورس برنامه قرار دارد. دستور آخر هم به برنامه می گویید که تمام ترسیم های مربوط به فرم در روال paint انجام می شه و فرم هم شفاف نیست.
Private Sub dodger_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
KgeX = New KgeX
Kge3D = New Kge3D(KgeX, Me)
Dim Cam As New KgeCamera(Kge3D, New KgeVector3(0.0F, 9.3F, 17.0F), New KgeVector3)
Road = New KgeMesh(Kge3D)
Road.LoadFromFile("..\road.x")
Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque, True)
End Sub

9. هر بار که فریم جدید نمایش داده می شه باید مکان جاده ها محاسبه شود پس از این روال قبل از ترسیم هیچ چیزی در صفحه استفاده می کنیم.
کاربرد تایمر را در اینجا به وضوح ببینید.
Private Sub OnFrameUpdate()
Dim elapsedTime As Single
' First, get the elapsed time
elapsedTime = CSng(t.MillisecondsPassed) / 1000
Me.Text = elapsedTime
RoadDepth0 += (RoadSpeed * elapsedTime)
RoadDepth1 += (RoadSpeed * elapsedTime)

' Check to see if we need to cycle the road
If RoadDepth0 > 75.0F Then
RoadDepth0 = RoadDepth1 - 100.0F
End If

If (RoadDepth1 > 75.0F) Then
RoadDepth1 = RoadDepth0 - 100.0F
End If
End Sub
10. نوبت به رسم تصاویر می رسه.
پس در روال Form_Paint کدهای ترسیم را قرار بدید.
OnFrameUpdate()
Kge3D.ColorFill(Color.Black)
Road.Draw(0, 0, RoadDepth0)
Road.Draw(0, 0, RoadDepth1)
Kge3D.Flip()
Me.Invalidate()
خط اول که مکان جاده ها را تغییر می دهد چرا ما این کار را توسط تایمر انجام دادیم چون اگر ما دستی این کار را می کردیم وقتی بازیمان روی یه کامپیوتر کندتر می رفت بازی ما هم بسیار کند می شد و برعکس برای همین از تایمر استفاده کردیم تا بر حسب میلی ثانیه هایی که گذشته اون رو حرکت بدیم تا در یک ثانیه دقیا 30 واحد جابجا شود.
خط دوم هم که صفحه قبلی را پاک می کنه و با رنگ سیاه ضمینه را پر می کنه.
دو خط بعدی هم که جاده را در دو مختصات متفاوت می کشن.

امیدوارم که کار با این موتور ساده باشه.