|
آموزش ساخت بازی سه بعدی به زبان Basic با دارک بیسیک Dark Basic تهیه و آموزش نرم افزار دارک بیسیک |
|||
|
دوشنبه 09 اردیبهشت 1392 :: 01:51 :: نويسنده : darkbasic
این دسته از دستورات وظیفه ی کنترل برخورد اشاء سه بعدی با یکدیگر را دارند . یعنی با بکارگیری این دستورات می توانیم کنترل کنیم که هنگام برخورد هر شیء با شیء دیگر ، چه کاری انجام شود . برای مثال دستورات زیر را اجرا می کنیم . sync on : sync rate 120 : hide mouse : color
Load Image "C:\Program Files\Dark Basic Software\Dark Basic Professional\Help\examples\basic3d\Marble.Bmp",1
Load Image "C:\Program Files\Dark Basic Software\Dark Basic Professional\Help\examples\basic3d\fur.Bmp",2
make object box 1,400,10,400 : position object 1,0,-5,0
make object box 2,400,100,10 : position object 2,0,50,-200
make object box 3,400,100,10 : position object 3,0,50,200
make object box 4,10,100,400 : position object 4,-200,50,0
make object box 5,10,100,400 : position object 5, 200,50,0
Adam=6
make Object box Adam,10,10,10 : position object Adam,50,20,50
for t=1 to 5
texture object t,1
next t
texture object Adam,2
Do
if upkey()=1 Then move object Adam,2
if downkey()=1 Then move object Adam,-2
if leftkey()=1
(yrotate object Adam,WrapValue(object angle y(Adam)-2
EndIf
if rightkey()=1
(yrotate object Adam,WrapValue(object angle y(Adam)+2
EndIf
(xCm#=object position x(Adam):yCm#=object position y(Adam
(zCm#=object position z(Adam):aCm#=object Angle y(Adam
hCm#=30:dCm#=50:sCm#=60
SET CAMERA TO FOLLOW xCm#,yCm#,zCm#,aCm#,dCm#,hCm#,sCm#,0
Sync
Loop
در این مثال با استفاده از چند جعبه ، فضایی ایجاد کردیم . با زدن دکمه های جهت بالا ، جهت پائین ، جهت راست و جهت پائین جعبه ی کوچک به جلو ، عقب ، راست و چپ حرکت خواهد کرد . ولی زمانی که به موانع برخورد می کند از آنها عبور می کند . اگر بخواهیم موانع را واقعی جلوه دهیم ( مثل دیوار سخت شوند تا نتوانیم از آن عبور کنیم ) باید برای هر شیء ( چه دیوار و چه شیء شخصیت محرک ) فضای برخورد تعریف کنیم . مانند دستور زیر :
دستور MAKE OBJECT COLLISION BOX
MAKE OBJECT COLLISION BOX ObjectNumber,X1,Y1,Z1,X2,Y2,Z2,CollisionFlag
طبق این دستورالعمل به جای ObjectNumber نام شییء سه بعدی و به جای (X1 و Y1 و Z1 ) و (X2 و Y2 و Z2 ) مختصات دو نقطه نسبت به مرکز شیء سه بعدی را قرار می دهیم و به جای CollisionFlag عدد صفر یا یک را قرار می دهیم . مانند مثال زیر :
Make Object Box 70 ,10,10,10
Make Object Collision Box 70,-5,-5,-5,5,5,5,1
Wait Key
در این مثال ابتدا یک جعبه با شماره ی 70 ایجاد کردیم و در خط بعدی با استفاده از دستور Make Object Collision Box مختصات دو نقطه نسب به مرکز شیء یعنی ، نقطه ی اول با مختصات X1=-5 ( فاصله ی نقطه ی اول تا محور X شیء سه بعدی ) و Y1=-5 ( فاصله ی نقطه ی اول تا محور Y شیء سه بعدی ) و Z1=-5 ( فاصله ی نقطه ی اول تا محور Z شیء سه بعدی ) ، و نقطه ی دوم با مختصات X2=5 ( فاصله ی نقطه ی دوم تا محور X شیء سه بعدی ) و Y2=5 ( فاصله ی نقطه ی دوم تا محور Y شیء سه بعدی ) و Z2=5 ( فاصله ی نقطه ی دوم تا محور Z شیء سه بعدی ) را قرار می دهیم . این دستور این دو نقطه را بعنوان ابتدا و انتهای قطر یک مستطیل در فضای شیء سه بعدی در نظر گرفته و فضای برخوردی به شکل جعبه ی سه بعدی در شیء سه بعدی ایجاد می کند و در عین حال این فضا را به شیء می چسباند . اگر به جای CollisionFlag عدد یک را قرار دهیم ، موقع دوران شیء سه بعدی فضای برخورد ایجاد شده هم چرخش خواهد کرد . در هر حالت با حرکت شیء سه بعدی فضای برخورد هم همراه با شیء حرکت خواهد کرد .
برای فهم بهتر فضای برخورد به شکل زیر دقت کنید .
![]() همانطور که در شکل می بینید ، هر شیء خود نیز دارای محور X و Y و Z می باشد . می توانیم نقاطی را نسبت به شیء تصور کنیم . دستور Make Object Collision Box دو نقطه در شیء ایجاد می کند . مانند شکل زیر :
![]() مختصات X و Y و Z دونقطه نسبت به مختصات شیء سه بعدی است . یعنی مختصات نقطه های فرضی ارتباط مستقیمی با مختصات فضای بازی ندارد . دستور فوق نقاط را ابتدا و انتهای قطر یک جعبه فرض می کند و جعبه ی فرضی را بعنوان فضای برخورد شیء سه بعدی در همان شیء ایجاد می کند . مانند شکل زیر :
![]() در مثال بالا جعبه ی کوچک بعنوان فضای برخورد جعبه ی بزرگ می باشد .
دستور DELETE OBJECT COLLISION BOX
با این دستور می توان فضای برخورد شیء سه بعدی را حذف کرد . مانند مثال زیر :
Make Object Box 70 ,50,10,30
Make Object Collision Box 70 ,-25,-5,-15,25,5,15,1
Delete Object Collision Box 70
Wait Key
تابع OBJECT COLLISION
این تابع به بررسی برخورد همراه با فررفتگی دو شیء سه بعدی می پردازد . اگر دو شیء با هم برخورد همراه با فرو رفتگی داشته باشند ، تابع مقدار یک و اگر برخورد همراه با فرورفتگی در هم نداشته باشند ، عدد صفر را برمی گرداند . مانند مثال زیر :
Make Object Box 20,10,10,10 : Position Object 20,0,25,30
Make Object Collision Box 20,-5,-5,-5,5,5,5,1
Make Object Sphere 16,10
Make Object Collision Box 16,-8,-8,-8,8,8,8,1
Position Camera 0,30,-60
Sync On : Sync Rate 30
Do
For MyAngle = 0 To 359 Step 3
Position Object 16,Sin(MyAngle)*30,25,Cos(MyAngle)*30
"If Object Collision(16,20)=1 Then Text 10,10,"Collision
Sync
Next MyAngle
Loop
با اجرای این مثال زمانی که کره با جعبه برخورد همراه با فرورفتگی داشته باشد ، تابع مقدار یک را برمی گرداند و عبارت Collision چاپ خواهد شد .
تابع OBJECT HIT
این تابع تنها به بررسی برخورد دو شیء سه بعدی با یکدیگر خواهد پرداخت . اگر دو شیء با هم برخورد داشته باشند ، تابع مقدار یک و اگر برخورد نداشته باشند ، عدد صفر برگردانده می شود . مانند مثال زیر :
Make Object Box 20,10,10,10 : Position Object 20,0,25,30
Make Object Collision Box 20,-5,-5,-5,5,5,5,1
Make Object Sphere 16,10
Make Object Collision Box 16,-8,-8,-8,8,8,8,1
Position Camera 0,30,-60
Sync On : Sync Rate 30
Do
For MyAngle = 0 To 359 Step 3
Position Object 16,Sin(MyAngle)*30,25,Cos(MyAngle)*30
"If Object HIT(16,20)=1 Then Text 10,10,"Hit
Sync
Next MyAngle
Loop
با اجرای این مثال زمانی که کره با جعبه برخورد می کند ، تابع مقدار یک را برمی گرداند و عبارت Hit چاپ خواهد شد .
دستور SET OBJECT COLLISION OFF و دستور SET OBJECT COLLISION ON
دستور SET OBJECT COLLISION OFF فضای برخورد شیء سه بعدی را غیرفعال
و دستور SET OBJECT COLLISION ON فضای برخورد شیء سه بعدی را دوباره فعال می کند . مانند مثال زیر :
Make Object Box 20,10,10,10 : Position Object 20,0,25,30
Make Object Collision Box 20,-5,-5,-5,5,5,5,1
Make Object Sphere 16,10
Make Object Collision Box 16,-8,-8,-8,8,8,8,1
Position Camera 0,30,-60
Sync On : Sync Rate 30
Do
For MyAngle = 0 To 359 Step 3
Position Object 16,Sin(MyAngle)*30,25,Cos(MyAngle)*30
"If Object Collision(16,20)=1 Then Text 10,10,"Collision
"If Inkey$()="F" Or Inkey$()="f
Set Object Collision Off 20
EndIf
"If Inkey$()="N" Or Inkey$()="n
Set Object Collision On 20
EndIf
Sync
Next MyAngle
Loop
با اجرای این مثال با زدن دکمه ی F فضای برخورد کره غیرفعال شده و عبارت Collision چاپ نخواهد شد و اگر دکمه ی N را بزنیم فضای برخورد شیء کره فعال شده و موقع برخورد کره با جعبه ، عبارت Collision چاپ خواهد شد .
تابع GET OBJECT COLLISION X و تابع GET OBJECT COLLISION Y و
تابع GET OBJECT COLLISION Z
تابع ()GET OBJECT COLLISION X مقدار حرکت شیء ( سه بعدی ) تا برخورد با شیء ( سه بعدی ) دیگر در راستای محور X ها و تابع ()GET OBJECT COLLISION Y مقدار حرکت شیء ( سه بعدی ) تا برخورد با شیء ( سه بعدی ) دیگر در راستای محور Y ها و تابع ()GET OBJECT COLLISION Z مقدار حرکت شیء ( سه بعدی ) تا برخورد با شیء ( سه بعدی ) دیگر در راستای محور Z ها را برمی گرداند . یعنی هر بار این توابع خوانده شود ، مقدار حرکتی که شیء ( سه بعدی ) با برخورد با شیء دیگر داشته را برمی گرداند . مانند مثال زیر :
Make Object Box 200,10,10,10 : Position Object 200,0,0,0
Make Object Collision Box 200,-5,-5,-5,5,5,5,1
(Make Object Sphere 1,10 : Color Object 1,Rgb(255,0,0
(Make Object Sphere 2,10 : Color Object 2,Rgb(0,255,0
(Make Object Sphere 3,10 : Color Object 3,Rgb(0,0,255
Make Object Collision Box 1,-5,-5,-5,5,5,5,1
Make Object Collision Box 2,-5,-5,-5,5,5,5,1
Make Object Collision Box 3,-5,-5,-5,5,5,5,1
Position Camera -10,10,-60 : Point Camera 0,0,0
Sync On : Sync Rate 30
Do
For MyAngle# = 0 To 359 Step 0.5
Position Object 1 , Sin(WrapValue(MyAngle#))*30,0,0
If Object Collision(1,200)=1
"Text 10,10,"Collision Red Sphere
(()Text 10,30,"GET OBJECT COLLISION X="+Str$(GET OBJECT COLLISION X
(()Text 10,50,"GET OBJECT COLLISION Y="+Str$(GET OBJECT COLLISION Y
(()Text 10,70,"GET OBJECT COLLISION Z="+Str$(GET OBJECT COLLISION Z
EndIf
Position Object 2 , 0,Sin(WrapValue(MyAngle#+45))*30,0
If Object Collision(2,200)=1
"Text 210,10,"Collision Green Sphere
(()Text 210,30,"GET OBJECT COLLISION X="+Str$(GET OBJECT COLLISION X
(()Text 210,50,"GET OBJECT COLLISION Y="+Str$(GET OBJECT COLLISION Y
(()Text 210,70,"GET OBJECT COLLISION Z="+Str$(GET OBJECT COLLISION Z
EndIf
Position Object 3 , 0,0,Sin(WrapValue(MyAngle#+90))*30
If Object Collision(3,200)=1
"Text 410,10,"Collision Blue Sphere
(()Text 410,30,"GET OBJECT COLLISION X="+Str$(GET OBJECT COLLISION X
(()Text 410,50,"GET OBJECT COLLISION Y="+Str$(GET OBJECT COLLISION Y
(()Text 410,70,"GET OBJECT COLLISION Z="+Str$(GET OBJECT COLLISION Z
EndIf
Sync
Next MyAngle
Loop
نکته : با توجه به مثال بالا برای استفاده از این توابع ، باید حتما برای هر برخورد یک IF تعریف کنیم ، تا مقدار برگشتی تابع مطابق با شرط مورد نظرمان باشد .
دستور SET OBJECT COLLISION TO SPHERES
این دستور فضای برخوردی به شکل کره در اطراف شیء ایجاد می کند . مانند دستورالعمل زیر :
SET OBJECT COLLISION TO SPHERES ObjectNumber
طبق این دستورالعمل به جای ObjectNumber شماره ی شیء مورد نظر را قرار می دهیم . مانند مثال زیر :
Make Object Box 10,100,10,100
SET OBJECT COLLISION TO SPHERES 10
Do
Loop
دستور AUTOMATIC OBJECT COLLISION
این دستور فضایی با شعاع مشخص به دور شیء سه بعدی ایجاد می کند . مانند دستورالعمل زیر :
AUTOMATIC OBJECT COLLISION ObjectNumber,Radius,Response
طبق این دستورالعمل به جای ObjectNumber شماره ی شیء مورد نظر و به جای Radius شعاع برخورد دور شیء را قرار می دهیم . اگر Response صفر باشد ، وقتی شیء به مانع متحرک برخورد کرد ، خودش به کنار کشیده میشود و اگر به مانع ثابت برخورد کرد ، نمی تواند از آن مانع عبور کند ( موانعی مثل دیوار یا تانک ) ، یا آن را کنار بزند . ولی اگر Response برابر یک باشد ، زمانی که به مانع برخورد می کند ، یا از داخل آن عبور می کند و اگر مانع متحرک باشد ( خود مانع از دستور بالا استفاده کرده باشد ) ، مانع را کنار خواهد زد . مانند مثال زیر :
imgAsfalt = 1
Load Image "C:\Program Files\Dark Basic Software\Dark Basic Professional\Help\examples\basic3d\Marble.Bmp",imgAsfalt
Set Ambient Light 50
Make Object Box 1,400,10,400 : Position Object 1,0,-5,0
Make Object Box 2,400,100,10 : Position Object 2,0,50,-200
Make Object Box 3,400,100,10 : Position Object 3,0,50,200
Make Object Box 4,10,100,400 : Position Object 4,-200,50,0
Make Object Box 5,10,100,400 : Position Object 5,200,50,0
make object collision box 1,-200,-5,-200,200,5,200,0
make object collision box 2,-200,-50,-5,200,50,5,0
make object collision box 3,-200,-50,-5,200,50,5,0
make object collision box 4,-5,-50,-200,5,50,200,0
make object collision box 5,-5,-50,-200,5,50,200,0
For intTexture = 1 To 5
Texture Object intTexture,imgAsfalt
Next intTexture
objMain = 10
Make Object Box objMain,10,10,10
Position Object objMain,0,970,0
(Color Object objMain,Rgb(255,0,0
objNone = 11
Make Object Box objNone,10,10,10
Position Object objNone,50,70,0
(Color Object objNone,Rgb(0,0,255
make object collision box objMain,-5,-5,-5,5,5,5,0
Set Object Collision To Spheres objMain
Automatic Object Collision objMain,5.5,0
make object collision box objNone,-5,-5,-5,5,5,5,0
Set Object Collision To Spheres objNone
Automatic Object Collision objNone,5.5,0
intAngle# = 0
Do
(#Inc intAngle#,0.1 : intAngle# = WrapValue(intAngle
If upkey()=1 Then move object objMain,0.2
If downkey()=1 Then move object objMain,-0.2
If leftkey()=1
(yrotate object objMain,WrapValue(object angle y(objMain)-0.5
EndIf
If rightkey()=1
(yrotate object objMain,WrapValue(object angle y(objMain)+0.5
EndIf
(opx=Object Position X(objMain
(opy=Object Position y(objMain
(opz=Object Position z(objMain
Position Object objMain,OPX,OPY-1,OPZ
Position Object objNone,Sin(intAngle#)*70,10,Cos(intAngle#)*70
(xCm#=object position x(objMain
(yCm#=object position y(objMain
(zCm#=object position z(objMain
aCm#=object Angle y(objMain):hCm#=30:dCm#=50:sCm#=60
SET CAMERA TO FOLLOW xCm#,yCm#,zCm#,aCm#,dCm#,hCm#,sCm#,0
Loop
در این مثال زمانی که مکعب قرمز به موانع متحرک و یا ثابت برخورد می کند ( با کنترل ما توسط دکمه های جهت ) ، خود مکعب قرمز به کنار می رود . چون طبق دستورالعمل Response برابر صفر است . ولی در مثال زیر Response برابر یک شده ؛ خواهد دید موانع مقاومتی در برابر مکعب قرمز نخواهند داشت .
imgAsfalt = 1
Load Image "C:\Program Files\Dark Basic Software\Dark Basic Professional\Help\examples\basic3d\Marble.Bmp",imgAsfalt
Set Ambient Light 50
Make Object Box 1,400,10,400 : Position Object 1,0,-5,0
Make Object Box 2,400,100,10 : Position Object 2,0,50,-200
Make Object Box 3,400,100,10 : Position Object 3,0,50,200
Make Object Box 4,10,100,400 : Position Object 4,-200,50,0
Make Object Box 5,10,100,400 : Position Object 5,200,50,0
make object collision box 1,-200,-5,-200,200,5,200,0
make object collision box 2,-200,-50,-5,200,50,5,0
make object collision box 3,-200,-50,-5,200,50,5,0
make object collision box 4,-5,-50,-200,5,50,200,0
make object collision box 5,-5,-50,-200,5,50,200,0
For intTexture = 1 To 5
Texture Object intTexture,imgAsfalt
Next intTexture
objMain = 10
Make Object Box objMain,10,10,10
Position Object objMain,0,970,0
(Color Object objMain,Rgb(255,0,0
objNone = 11
Make Object Box objNone,10,10,10
Position Object objNone,50,70,0
(Color Object objNone,Rgb(0,0,255
make object collision box objMain,-5,-5,-5,5,5,5,0
Set Object Collision To Spheres objMain
Automatic Object Collision objMain,5.5,1
make object collision box objNone,-5,-5,-5,5,5,5,0
Set Object Collision To Spheres objNone
Automatic Object Collision objNone,5.5,0
intAngle#=0
Do
(#Inc intAngle#,0.1 : intAngle# = WrapValue(intAngle
If upkey()=1 Then move object objMain,0.2
If downkey()=1 Then move object objMain,-0.2
If leftkey()=1
(yrotate object objMain,WrapValue(object angle y(objMain)-0.5
EndIf
If rightkey()=1
(yrotate object objMain,WrapValue(object angle y(objMain)+0.5
EndIf
(opx=Object Position X(objMain
(opy=Object Position y(objMain
(opz=Object Position z(objMain
Position Object objMain,OPX,OPY-1,OPZ
Position Object objNone,Sin(intAngle#)*70,10,Cos(intAngle#)*70
(xCm#=object position x(objMain
(yCm#=object position y(objMain
(zCm#=object position z(objMain
aCm#=object Angle y(objMain):hCm#=30:dCm#=50:sCm#=60
SET CAMERA TO FOLLOW xCm#,yCm#,zCm#,aCm#,dCm#,hCm#,sCm#,0
Loop
درباره وبلاگ به وبلاگ من خوش آمدید موضوعات آرشيو وبلاگ پيوندها نويسندگان |
|||
|
|
نام کاربری یا ایمیل خود را وارد کنید
کد ۶ رقمی ارسالشده به ایمیل و رمز عبور جدید را وارد کنید.
در چند ثانیه حساب کاربری خود را بسازید
دیدگاه خود را با ما در میان بگذارید
ورود کاربران
خوش آمدید! لطفا وارد حساب خود شوید