viewport والنوافذ في vb6 & directx8
صفحة 1 من اصل 1 • شاطر
viewport والنوافذ في vb6 & directx8
السلام عليكم ورحمه الله تعالى وبركاته
هنا مثال للتنقل بين العرض في نافذه وشاشه كامله. ......لكن ربما سيعطيك فكره ويساعدك ..
https://www.zeta-uploader.com/1893603292
هنا مثال اخر عن فتح viewport في شاشه العرض
https://www.zeta-uploader.com/211135065
كما ترى في الصوره الفرق بين viewport و render target
حيث render target هو الفورم او الاداه التي تمثل حدود نافذه ثري دي....في حاله العرض في شاشه كامله فانه يكون فورم وليس اداه
اما viewport عباره عن مرااه داخل render target ولاكن بكامرا اخرى ..
مثال 1 ........ في لعبتك سباق السيارات تحتاج الى نافذه للمنضر خلف السياره تمثل المراه الخلفيه.....او اتصال هاتفي مع احد شخصيات اللعبه تحتاج لاضهار صوره المتصل في زاويه النافذه...........هذه امثله لاستعمالات viewport
مثال 2......... في محرك العابك تحتاج الى نافذه ثري دي منفصله تمثل الفضاء الثلاثي الابعاد..ونافذه ثري دي اخرى على فورم اخر وكانها فضاء ثلاثي اخر تتعمل لعرض المجسمات او المتريل للمستخدم ...هذه من امثله استعمال render target
هنا موضوع يشرح ما قلناه سابقا للاضافه http://directx4vb.vbgamer.com/Tutorials/DirectX8/GR_Lesson17.asp
امثله
مثال 1 فتح النافذه الرئيسه
هذه الداله استعملها لفتح نافذه فضاء الثلاثي الرئيسه....تذكر النافذه الريسيه هي التي يمكن التنقل فيها بين العرض في نافذه او شاشه كامله....باقي النوافذ الفرعيه يكون العرض في ناغذه وليس fullscreen
Public Function openworldwindow(ByVal Adapter As Long, ByVal devtype As CONST_D3DDEVTYPE, hwnd As Long, ByVal CREATEFLAGS As CONST_D3DCREATEFLAGS, PARAMETERS As D3DPRESENT_PARAMETERS) As Boolean
Set kDirect3DDevice8 = kDirect3D8.CreateDevice(Adapter, devtype, hwnd, CREATEFLAGS, PARAMETERS)
openworldwindow = True
ReDim kD3DPRESENT_PARAMETERSENG(0) As D3DPRESENT_PARAMETERS
kD3DPRESENT_PARAMETERSENG(0) = PARAMETERS
ReDim kDirect3DSwapChain8(0) As Direct3DSwapChain8
ReDim RenderTarget(0) As Direct3DSurface8
Set RenderTarget(0) = kDirect3DDevice8.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
Set DepthBufferSurf = kDirect3DDevice8.GetDepthStencilSurface()
End Function
Adapter ........تمثل كرت الشاشه لديك اذا كنت تملك اثنين وارت استعمال كرت الشاشه الثانيه فان القيمه =1 واذا اردت استعمال كرت الشاشه الاولى =0
devtype .......تساوي 1 تعني استعمال D3DDEVTYPE_HAL تساوي 2 تعني استعمال D3DDEVTYPE_REF
hwnd .......يجب ان يكون فورم ..حتى تستطيع الانتقال العرض في شاشه كامله.. اذا لم يكن فورم عند الانتقال للعرض في شاشه كامله يحدث خطا ..اما الرجوع الى العرض في نافذه يمكن ان يكون ال hwnd السابق او اداه ..معينه في D3DPRESENT_PARAMETERSENG.hDeviceWindow
مثال 2 فتح النافذه فرعيه اخرى
هذه الداله استعملها في اضافه نوافذ اخرى...كما ترى كل نافذه جديده تنشئ لها RenderTarget خاص بها...اما الهاوند D3DPRESENT_PARAMETERSENG.hDeviceWindow يمكن ان يكون اداه او فورم ليس الذين استعملتهم في النافذه الرئيسيه لان العرض في نافذه
Function addwindow (PARAMETERS As D3DPRESENT_PARAMETERS) As Long
ReDim kD3DPRESENT_PARAMETERSENG(UBound(kD3DPRESENT_PARAMETERSENG) + 1) As D3DPRESENT_PARAMETERS
kD3DPRESENT_PARAMETERSENG(UBound(kD3DPRESENT_PARAMETERSENG)) = PARAMETERS
ReDim kDirect3DSwapChain8(UBound(kDirect3DSwapChain8) + 1) As Direct3DSwapChain8
Set kDirect3DSwapChain8(UBound(kDirect3DSwapChain8)) = kDirect3DDevice8.CreateAdditionalSwapChain(kD3DPRESENT_PARAMETERSENG(UBound(kD3DPRESENT_PARAMETERSENG)))
ReDim RenderTarget(UBound(RenderTarget) + 1) As Direct3DSurface8
Set RenderTarget(UBound(RenderTarget)) = kDirect3DSwapChain8(UBound(kDirect3DSwapChain8)).GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
End Function
مثال 3 انشانا النافذه الريسيه على فورم معين نريد تغيير الفورم....او نريد تغيير الاعدادات...او نريد الانتقال للعرض ف شاشه كامله هنا الفايده والغموض والتفاصيل والتركيز.............................. ......
الخطوه 1
قبل الانتقال بين العرض في نافذه او شاشه كامله او تغيير الاعدادات اول داله نستعملها هي
Direct3DDevice8.TestCooperativeLevel
الداله السابقه اذا كانت تساوي D3D_OK فانه يمكننا تغيير الاعدادات
الداله السابقه اذا كانت تساوي D3DERR_DEVICELOST فانه لا يمكننا تغيير الاعدادات....كمثال لهذه الحاله عندما نكون نلعب في لعبه في شاشه كامله ثم نضغط على ALT+TAB فان اللعبه يتم تسغيرها الى شريط المهام السفلي هذا ما يعنيه D3DERR_DEVICELOST.......اضغط مره اخرى على العبه وهي مصغره في شريط المهام السفلي.....الداله ترجع لنا D3DERR_DEVICENOTRESET تعني انه خسرنا الاعدادات وعاد التركيز يمكننا ضبط الاعدادات مره اخرى...
الخطوه 2
فان داله الرندر ترجع لنا خطا في هذه الحاله.... لذالك نحسر عملها فقط في حاله D3D_OK هكذا...
If kDirect3DDevice8.TestCooperativeLevel = D3D_OK Then
kDirect3DDevice8.Present ByVal 0, ByVal 0, 0, ByVal 0
End If
اذا كانت الداله Direct3DDevice8.TestCooperativeLevel اذا كانت الداله ترجع D3D_OK او D3DERR_DEVICENOTRESET يعني يمكننا تغيير الاعدادات
اي شيئ تم انشاؤه وتخزينه في هذه الذالكره D3DPOOL_DEFAULT يجب تدميره قبل ضبط الاعدادات مره اخرى .. والى لا تنجح العمليه ويحدث خطا..من الاشياء التي تخزن في D3DPOOL_DEFAULT
النوافذ الفرعيه التي انشاناها لذالك ندمرها .. Set kDirect3DSwapChain8 = Nothing
الرند تارقت لذالك ندمره ... Set RenderTarget= Nothing
الدابث بفور ندمره ....Set DepthBufferSurf = Nothing
التكست لا تحتاج الى تدميره لاننا يمكن ان نخزنه في ذاكره اخرى غير D3DPOOL_DEFAULT
المجسمات ايضا لا تنحاج الى تدميرها لاننا يمكن ان نخزنها في ذاكره اخرى غير D3DPOOL_DEFAULT
الخطوه 3
الان نستعمل الداله لتغيير الاعدادات..او الانتقال من العرض في نافذه الى العرض في شاشه كامله هكذا....
kDirect3DDevice8.Reset kD3DPRESENT_PARAMETERS
حيث kD3DPRESENT_PARAMETERS تركيب من نوع D3DPRESENT_PARAMETERS عناصره عباره عن اعداداتنا
الخطوه 4
بعد ان قمنا بعمليه ال reset ننشئ الاشياء المخزنه في D3DPOOL_DEFAULT التي دمرناها سابقا مثل الرندر تارقت او الدابث بفور
تذكر اذا كان اخر reset او تغيير عملناه هو العرض في شاشه كامله لايمكنها انشاء النوافذ الفرعيه مره اخرى حتى يكون العرض في النافذه الرئيسه عباره عن عرض في نافذه والى يحدث خطا..........
................بعد اي تغيير تفقد الكامرا التي انت ضابها ويضبط المحرك اوتوماتيكيا كمره موقعها (0.0.0)...لذالك قم بضبط الكامرا مره اخرى
هنا مثال للتنقل بين العرض في نافذه وشاشه كامله. ......لكن ربما سيعطيك فكره ويساعدك ..
https://www.zeta-uploader.com/1893603292
هنا مثال اخر عن فتح viewport في شاشه العرض
https://www.zeta-uploader.com/211135065
كما ترى في الصوره الفرق بين viewport و render target
حيث render target هو الفورم او الاداه التي تمثل حدود نافذه ثري دي....في حاله العرض في شاشه كامله فانه يكون فورم وليس اداه
اما viewport عباره عن مرااه داخل render target ولاكن بكامرا اخرى ..
مثال 1 ........ في لعبتك سباق السيارات تحتاج الى نافذه للمنضر خلف السياره تمثل المراه الخلفيه.....او اتصال هاتفي مع احد شخصيات اللعبه تحتاج لاضهار صوره المتصل في زاويه النافذه...........هذه امثله لاستعمالات viewport
مثال 2......... في محرك العابك تحتاج الى نافذه ثري دي منفصله تمثل الفضاء الثلاثي الابعاد..ونافذه ثري دي اخرى على فورم اخر وكانها فضاء ثلاثي اخر تتعمل لعرض المجسمات او المتريل للمستخدم ...هذه من امثله استعمال render target
هنا موضوع يشرح ما قلناه سابقا للاضافه http://directx4vb.vbgamer.com/Tutorials/DirectX8/GR_Lesson17.asp
امثله
مثال 1 فتح النافذه الرئيسه
هذه الداله استعملها لفتح نافذه فضاء الثلاثي الرئيسه....تذكر النافذه الريسيه هي التي يمكن التنقل فيها بين العرض في نافذه او شاشه كامله....باقي النوافذ الفرعيه يكون العرض في ناغذه وليس fullscreen
Public Function openworldwindow(ByVal Adapter As Long, ByVal devtype As CONST_D3DDEVTYPE, hwnd As Long, ByVal CREATEFLAGS As CONST_D3DCREATEFLAGS, PARAMETERS As D3DPRESENT_PARAMETERS) As Boolean
Set kDirect3DDevice8 = kDirect3D8.CreateDevice(Adapter, devtype, hwnd, CREATEFLAGS, PARAMETERS)
openworldwindow = True
ReDim kD3DPRESENT_PARAMETERSENG(0) As D3DPRESENT_PARAMETERS
kD3DPRESENT_PARAMETERSENG(0) = PARAMETERS
ReDim kDirect3DSwapChain8(0) As Direct3DSwapChain8
ReDim RenderTarget(0) As Direct3DSurface8
Set RenderTarget(0) = kDirect3DDevice8.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
Set DepthBufferSurf = kDirect3DDevice8.GetDepthStencilSurface()
End Function
Adapter ........تمثل كرت الشاشه لديك اذا كنت تملك اثنين وارت استعمال كرت الشاشه الثانيه فان القيمه =1 واذا اردت استعمال كرت الشاشه الاولى =0
devtype .......تساوي 1 تعني استعمال D3DDEVTYPE_HAL تساوي 2 تعني استعمال D3DDEVTYPE_REF
hwnd .......يجب ان يكون فورم ..حتى تستطيع الانتقال العرض في شاشه كامله.. اذا لم يكن فورم عند الانتقال للعرض في شاشه كامله يحدث خطا ..اما الرجوع الى العرض في نافذه يمكن ان يكون ال hwnd السابق او اداه ..معينه في D3DPRESENT_PARAMETERSENG.hDeviceWindow
مثال 2 فتح النافذه فرعيه اخرى
هذه الداله استعملها في اضافه نوافذ اخرى...كما ترى كل نافذه جديده تنشئ لها RenderTarget خاص بها...اما الهاوند D3DPRESENT_PARAMETERSENG.hDeviceWindow يمكن ان يكون اداه او فورم ليس الذين استعملتهم في النافذه الرئيسيه لان العرض في نافذه
Function addwindow (PARAMETERS As D3DPRESENT_PARAMETERS) As Long
ReDim kD3DPRESENT_PARAMETERSENG(UBound(kD3DPRESENT_PARAMETERSENG) + 1) As D3DPRESENT_PARAMETERS
kD3DPRESENT_PARAMETERSENG(UBound(kD3DPRESENT_PARAMETERSENG)) = PARAMETERS
ReDim kDirect3DSwapChain8(UBound(kDirect3DSwapChain8) + 1) As Direct3DSwapChain8
Set kDirect3DSwapChain8(UBound(kDirect3DSwapChain8)) = kDirect3DDevice8.CreateAdditionalSwapChain(kD3DPRESENT_PARAMETERSENG(UBound(kD3DPRESENT_PARAMETERSENG)))
ReDim RenderTarget(UBound(RenderTarget) + 1) As Direct3DSurface8
Set RenderTarget(UBound(RenderTarget)) = kDirect3DSwapChain8(UBound(kDirect3DSwapChain8)).GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
End Function
مثال 3 انشانا النافذه الريسيه على فورم معين نريد تغيير الفورم....او نريد تغيير الاعدادات...او نريد الانتقال للعرض ف شاشه كامله هنا الفايده والغموض والتفاصيل والتركيز.............................. ......
الخطوه 1
قبل الانتقال بين العرض في نافذه او شاشه كامله او تغيير الاعدادات اول داله نستعملها هي
Direct3DDevice8.TestCooperativeLevel
الداله السابقه اذا كانت تساوي D3D_OK فانه يمكننا تغيير الاعدادات
الداله السابقه اذا كانت تساوي D3DERR_DEVICELOST فانه لا يمكننا تغيير الاعدادات....كمثال لهذه الحاله عندما نكون نلعب في لعبه في شاشه كامله ثم نضغط على ALT+TAB فان اللعبه يتم تسغيرها الى شريط المهام السفلي هذا ما يعنيه D3DERR_DEVICELOST.......اضغط مره اخرى على العبه وهي مصغره في شريط المهام السفلي.....الداله ترجع لنا D3DERR_DEVICENOTRESET تعني انه خسرنا الاعدادات وعاد التركيز يمكننا ضبط الاعدادات مره اخرى...
الخطوه 2
فان داله الرندر ترجع لنا خطا في هذه الحاله.... لذالك نحسر عملها فقط في حاله D3D_OK هكذا...
If kDirect3DDevice8.TestCooperativeLevel = D3D_OK Then
kDirect3DDevice8.Present ByVal 0, ByVal 0, 0, ByVal 0
End If
اذا كانت الداله Direct3DDevice8.TestCooperativeLevel اذا كانت الداله ترجع D3D_OK او D3DERR_DEVICENOTRESET يعني يمكننا تغيير الاعدادات
اي شيئ تم انشاؤه وتخزينه في هذه الذالكره D3DPOOL_DEFAULT يجب تدميره قبل ضبط الاعدادات مره اخرى .. والى لا تنجح العمليه ويحدث خطا..من الاشياء التي تخزن في D3DPOOL_DEFAULT
النوافذ الفرعيه التي انشاناها لذالك ندمرها .. Set kDirect3DSwapChain8 = Nothing
الرند تارقت لذالك ندمره ... Set RenderTarget= Nothing
الدابث بفور ندمره ....Set DepthBufferSurf = Nothing
التكست لا تحتاج الى تدميره لاننا يمكن ان نخزنه في ذاكره اخرى غير D3DPOOL_DEFAULT
المجسمات ايضا لا تنحاج الى تدميرها لاننا يمكن ان نخزنها في ذاكره اخرى غير D3DPOOL_DEFAULT
الخطوه 3
الان نستعمل الداله لتغيير الاعدادات..او الانتقال من العرض في نافذه الى العرض في شاشه كامله هكذا....
kDirect3DDevice8.Reset kD3DPRESENT_PARAMETERS
حيث kD3DPRESENT_PARAMETERS تركيب من نوع D3DPRESENT_PARAMETERS عناصره عباره عن اعداداتنا
الخطوه 4
بعد ان قمنا بعمليه ال reset ننشئ الاشياء المخزنه في D3DPOOL_DEFAULT التي دمرناها سابقا مثل الرندر تارقت او الدابث بفور
تذكر اذا كان اخر reset او تغيير عملناه هو العرض في شاشه كامله لايمكنها انشاء النوافذ الفرعيه مره اخرى حتى يكون العرض في النافذه الرئيسه عباره عن عرض في نافذه والى يحدث خطا..........
................بعد اي تغيير تفقد الكامرا التي انت ضابها ويضبط المحرك اوتوماتيكيا كمره موقعها (0.0.0)...لذالك قم بضبط الكامرا مره اخرى
vb6 الى vb20- عضو
- عدد المساهمات : 10
نقاط : 32
تاريخ التسجيل : 11/10/2016
الموقع : ahl-dz.yoo7.com/f28-montada
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى