View Full Version : آموزش ساخت موتور پایه گرافیکی با DirectX
AliyerEdon
جمعه 02 فروردین 1387, 13:09 عصر
به نام خداوند بخشنده ی مهربان
در این قسمت قصد دارم آموزش ساخت موتور پایه یا همون انجین خودمونو آموزش بدم. این آموزش ها برای کسانی است که DirectX کار می کنند و برای کسانی هم که OpenGL کار ی کنند می تونه ایده ی خوبی باشه. برای شروع کار باید زبان ++C را بلد باشید و بتوانید با آن یک پروژه ی Win32 ایجاد کرده و یک پنجره ی ساده ایجاد کنید. (اگر بلد نیستید اینجا (http://rapidshare.com/files/101175035/Create_Win32_Application.zip.html) را کلیک کنید). ما پنجره ی ساده را برای انجین نمی خواهیم و تنها می خواهم که انجین خود را در حال نوشتن در آن تست کنیم. بعد تز کامل شدن کدهای خود را به صورت DLL و Lib در خواهیم آورد. این انجین هیچ کاری جز پاک کردن صفحه انجام نمی دهد و هدف آن نحوه ی ایجاد یک انجین مستقل از DirectX است. یعنی برای کار دیگر نیازی به DX نداشته باشید.
AliyerEdon
جمعه 02 فروردین 1387, 13:36 عصر
یک پروژه ی Win32 Application ایجاد کرده و هنگام تنظیمات اولیه گزینه ی Empty Project را فعال کنید. بعد از ایجاد یک پروژه ی خال یک فایل CPP با نام main ایجاد کنید. کدهای مربوط به ایجاد پنجره را وارد کنید. حال اگر برنامه را اجرا کنید یک پنجره ی خالی و سفید خواهید دید. حال نوبت به کدنویسی انجین رسیده است. شما باید ابتدا محیط ویژوال استادیو را برای کار با DX آماده کنید و فایل های Lib مربوط به DX9 یعنی d3d9.lib و d3dx9.lib وهمچنین winmm.lib را به پروژه وارد کنید. این کار را با استفاده از این مقاله (http://rapidshare.com/files/101179043/DirectX_9_0_C__.pdf.html) انجام دهید. حال که محیط برای کار آماده شد به مرحلهی دوم می رویم.
AliyerEdon
جمعه 02 فروردین 1387, 13:50 عصر
حالا باید یه فایل هدر به نام Engine.h و یه فایل کد با نام Engine.cppّ برای کدنویسی ایجاد کنید. در فال هدر باید یک کلاس تعریف کنید. نام این کلاس Engine است که کد مربوط به آن به شرح زیر است:
#include "d3d9.h"
#include "d3dx9.h"
class Engine
{
public:
void Init(HWND hwnd);
void BeginRender();
void EndRender();
private:
LPDIRECT3D9 d3d9;
LPDIRECT3DDEVICE9 device;
int w ;
int h ;
};حال به توضیح آن می پردازیم.
ما سه تابع از نوع عمومی یا Public داریم. از این سه تابع، اولی DirectX9 را مقداردهی اولیه می کند و شی Device را می سازد. دومی برای شروع به رندر کردن است که توسط شی Device متد Clear و BeginScene را صدا می زند. سومین تابع برای اتمام رندر است که توسط شی Device متد Present و EndScene را صدا می زند.
اشیائی که به صورت اختصاصی یا private تعریف شده اند برای این هستند که دیگر برای استفاده نیازی به تعریف Device نباشیم.
کد های مربوط به این کار ها در فایل CPP قرار دارد که برای درک این کدها و کلاسبندی این کدها باید با DirectX و کلاس بندی ++C آشنا باشید.
کد مربوط به فایل CPP :
#include "Engine.h"
void Engine::Init(HWND hwnd)
{
w = 640; h = 480;
d3d9 = Direct3DCreate9( D3D_SDK_VERSION );
D3DPRESENT_PARAMETERS pp;
ZeroMemory( &pp, sizeof(pp) );
pp.BackBufferWidth = w;
pp.BackBufferHeight = h;
pp.Windowed = TRUE;
pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
pp.BackBufferFormat = D3DFMT_UNKNOWN;
d3d9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hwn d,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&pp,&device);
}
void Engine::BeginRender()
{
device->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
}
void Engine::EndRender()
{
device->Present(NULL,NULL,NULL,NULL);
}
AliyerEdon
جمعه 02 فروردین 1387, 13:57 عصر
برای فهمیدن طریقه ی استفاده به کد زیر توجه کنید :
#include <windows.h>
#include "resource.h"
#include "Engine.h"
//--------------------------------------------------------------------------------------
// Global Variables
//--------------------------------------------------------------------------------------
HINSTANCE g_hInst = NULL;
HWND g_hWnd = NULL;
Engine *e = new Engine();
//--------------------------------------------------------------------------------------
// Forward declarations
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//--------------------------------------------------------------------------------------
// Entry point to the program. Initializes everything and goes into a message processing
// loop. Idle time is used to render the scene.
//--------------------------------------------------------------------------------------
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
if( FAILED( InitWindow( hInstance, nCmdShow ) ) )
return 0;
// Main message loop
MSG msg = {0};
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return (int) msg.wParam;
}
//--------------------------------------------------------------------------------------
// Register class and create window
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow )
{
// Register class
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TUTORIAL1);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"TutorialWindowClass";
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_TUTORIAL1);
if( !RegisterClassEx(&wcex) )
return E_FAIL;
// Create window
g_hInst = hInstance;
RECT rc = { 0, 0, 640, 480 };
AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
g_hWnd = CreateWindow( L"TutorialWindowClass", L"Create A Simple Engine With DirectX 9.0c", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance, NULL);
if( !g_hWnd )
return E_FAIL;
ShowWindow( g_hWnd, nCmdShow );
e->Init(g_hWnd);
return S_OK;
}
//--------------------------------------------------------------------------------------
// Called every time the application receives a message
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
e->BeginRender();
e->EndRender();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
AliyerEdon
جمعه 02 فروردین 1387, 14:11 عصر
این کد در Visual Studio 2005 نوشته شده و در سیستم من به درستی کامپایل می شود. اگر در سیستم شما به درستی کامپایل نشد مطمئن شوید که فایل های DIrectX را به درستی وارد کرده اید.
دریافت کد پروژه : اینجا (http://rapidshare.com/files/101185026/Eingine.zip.html)
دریافت فایل اجرایی : اینجا (http://rapidshare.com/files/101186107/Running_Engine.zip.html)
با یاد و نام خداوند آفریدگار خداحافظ
nasservb2
شنبه 10 فروردین 1387, 00:15 صبح
معرفی وبلاگهای برنامه نویسی وی بی
وبلاگ من حاوی کتب الکترونیکی و آموزش وی بی در زمینه های گونا گون هست که اخیرآ سورس کد و آموزش دایرکت ایکس واوپن جی ال گذاشتم
www.vbook.coo.ir
www.tcvb.coo.ir
شما هم وبلاگ یا سایت خودتونو معرفی کنید
AliyerEdon
شنبه 10 فروردین 1387, 13:28 عصر
کتابات خوبه ولی همش تو اینترنت هست. اگه می تونی کتاب آموزش DirectX 10 رو پیدا کن.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.