السلام عليكم
سأضع اليوم المحرك و غدا إن شاء الله نبدأ في الشرح و المناقشات
سنبدأ بمحرك بسيط جدا و هو ::
// GameEngine.h //
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow);
LRESULT CALLBACK WndProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);
//-----------------------------------------------------------------
// إعلان عن دوال المحرك
//-----------------------------------------------------------------
BOOL GameInitialize(HINSTANCE hInstance);
void GameStart(HWND hWindow);
void GameEnd();
void GameActivate(HWND hWindow);
void GameDeactivate(HWND hWindow);
void GamePaint(HDC hDC);
void GameCycle();
int GameEFullScreen();
//-----------------------------------------------------------------
// طبقة المحرك
//-----------------------------------------------------------------
class GameEngine
{
protected:
// مجموعة متغيرات
static GameEngine* m_pGameEngine;
HINSTANCE m_hInstance;
HWND m_hWindow;
TCHAR m_szWindowClass[32];
TCHAR m_szTitle[32];
WORD m_wIcon, m_wSmallIcon;
int m_iWidth, m_iHeight;
int m_iFrameDelay;
BOOL m_bSleep;
public:
// البناء و التدمير
GameEngine(HINSTANCE hInstance,
LPTSTR szWindowClass,
LPTSTR szTitle,
WORD wIcon,
WORD wSmallIcon,
int iWidth = 800,
int iHeight = 600);
virtual ~GameEngine();
static GameEngine* GetEngine()
{
return m_pGameEngine;
};
BOOL Initialize(int iCmdShow);
LRESULT HandleEvent(HWND hWindow,
UINT msg,
WPARAM wParam,
LPARAM lParam);
HINSTANCE GetInstance()
{
return m_hInstance;
};
HWND GetWindow()
{
return m_hWindow;
};
void SetWindow(HWND hWindow)
{
m_hWindow = hWindow;
};
LPTSTR GetTitle()
{
return m_szTitle;
};
WORD GetIcon()
{
return m_wIcon;
};
WORD GetSmallIcon()
{
return m_wSmallIcon;
};
int GetWidth()
{
return m_iWidth;
};
int GetHeight()
{
return m_iHeight;
};
int GetFrameDelay()
{
return m_iFrameDelay;
};
void SetFrameRate(int iFrameRate)
{
m_iFrameDelay = 1000 /iFrameRate;
};
BOOL GetSleep()
{
return m_bSleep;
};
void SetSleep(BOOL bSleep)
{
m_bSleep = bSleep;
};
};// GameEngine.cpp //
#include "GameEngine.h"
//-----------------------------------------------------------------
// تهيئة متغيرات الساكنة
//-----------------------------------------------------------------
GameEngine *GameEngine::m_pGameEngine = NULL;
GameEFullScreen()
{
DEVMODE GameEScreenSettings;
memset(&GameEScreenSettings,0,sizeof(GameEScreenSettings));
GameEScreenSettings.dmSize=sizeof(GameEScreenSettings);
GameEScreenSettings.dmPelsWidth = 800;
GameEScreenSettings.dmPelsHeight = 600;
GameEScreenSettings.dmBitsPerPel = 32;
GameEScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
if (ChangeDisplaySettings(&GameEScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
return 0;
}
return 1;
}
//-----------------------------------------------------------------
// دوال النافذة
//-----------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
MSG msg;
static int iTickTrigger = 0;
int iTickCount;
if (GameInitialize(hInstance))
{
// تشغيل محرك اللعبة
if (!GameEngine::GetEngine()->Initialize(iCmdShow))
{
return FALSE;
}
// إدخل حلقة الرسالة الرئيسية
while (TRUE)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// معالجة الرسائل
if (msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// التأكد من عدم توقف المحرك
if (!GameEngine::GetEngine()->GetSleep())
{
// الفحص في دورات اللعبة
iTickCount = GetTickCount();
if (iTickCount > iTickTrigger)
{
iTickTrigger = iTickCount + GameEngine::GetEngine()->GetFrameDelay();
GameCycle();
GameEFullScreen();
}
}
}
}
return (int)msg.wParam;
}
// نهاية اللعبة
GameEnd();
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWindow,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
// توجيه جميع رسائل إلى محرك اللعبة
return GameEngine::GetEngine()->HandleEvent(hWindow, msg, wParam, lParam);
}
//-----------------------------------------------------------------
// مبني و مهدم المحرك
//-----------------------------------------------------------------
GameEngine::GameEngine(HINSTANCE hInstance,
LPTSTR szWindowClass,
LPTSTR szTitle,
WORD wIcon,
WORD wSmallIcon,
int iWidth,
int iHeight)
{
// وضع متغيرات في محرك اللعبة
m_pGameEngine = this;
m_hInstance = hInstance;
m_hWindow = NULL;
if (lstrlen(szWindowClass) > 0)
{
lstrcpy(m_szWindowClass, szWindowClass);
}
if (lstrlen(szTitle) > 0)
{
lstrcpy(m_szTitle, szTitle);
}
m_wIcon = wIcon;
m_wSmallIcon = wSmallIcon;
m_iWidth = iWidth;
m_iHeight = iHeight;
m_iFrameDelay = 50;
m_bSleep = TRUE;
}
GameEngine::~GameEngine()
{
}
//-----------------------------------------------------------------
// إستعمال المحرك
//-----------------------------------------------------------------
BOOL GameEngine::Initialize(int iCmdShow)
{
WNDCLASSEX wndclass;
// إنشاء فيئة نافذة للنافذة الرئيسية
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = m_hInstance;
wndclass.hIcon = LoadIcon(m_hInstance,MAKEINTRESOURCE(GetIcon()));
wndclass.hIconSm = LoadIcon(m_hInstance,MAKEINTRESOURCE(GetSmallIcon()));
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 12);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = m_szWindowClass;
// تسجيل فئة النافذة
if (!RegisterClassEx(&wndclass))
{
return FALSE;
}
// حسابة موقع و حجم النافذة ...
int iWindowWidth = m_iWidth + GetSystemMetrics(SM_CXFIXEDFRAME) * 2,iWindowHeight = m_iHeight + GetSystemMetrics(SM_CYFIXEDFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION);
if (wndclass.lpszMenuName != NULL)
{
iWindowHeight += GetSystemMetrics(SM_CYMENU);
}
int iXWindowPos = (GetSystemMetrics(SM_CXSCREEN) - iWindowWidth) / 2,iYWindowPos = (GetSystemMetrics(SM_CYSCREEN) - iWindowHeight) / 2;
// إنشاء النافذة
m_hWindow = CreateWindow(m_szWindowClass, m_szTitle, WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE, 0, 0, iWindowWidth,iWindowHeight, NULL, NULL, m_hInstance, NULL);
if (!m_hWindow)
{
return FALSE;
}
// إظهار و تحديث النافذة
ShowWindow(m_hWindow, iCmdShow);
UpdateWindow(m_hWindow);
return TRUE;
}
LRESULT GameEngine::HandleEvent(HWND hWindow,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
// وضع نافذة اللعبة وإبدأ اللعبة
SetWindow(hWindow);
GameStart(hWindow);
return 0;
case WM_ACTIVATE:
// تنشيط و إيقاف التنشيط للعبة
if (wParam != WA_INACTIVE)
{
GameActivate(hWindow);
SetSleep(FALSE);
}
else
{
GameDeactivate(hWindow);
SetSleep(TRUE);
}
return 0;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hWindow, &ps);
// رسم اللعبة
GamePaint(hDC);
EndPaint(hWindow, &ps);
return 0;
case WM_DESTROY:
// نهاية العبة و الخروج منها
GameEnd();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWindow, msg, wParam, lParam);
}// GameE.cpp //
#include <windows.h>
#include "GameEngine.h"
//-----------------------------------------------------------------
// متغيرات
//-----------------------------------------------------------------
GameEngine* GameE;
//-----------------------------------------------------------------
// دوال المحرك
//-----------------------------------------------------------------
BOOL GameInitialize(HINSTANCE hInstance)
{
// إنشاء المحرك
GameE = new GameEngine(hInstance, "GameE","GameE", 0, 0);
if (GameE == NULL)
{
return FALSE;
}
// وضع نسبة الإيطار
GameE->SetFrameRate(15);
return TRUE;
}
void GameStart(HWND hWindow)
{
// إستعمال المولد العشوائي
srand(GetTickCount());
}
void GameEnd()
{
// مسح محرك اللعبة
ChangeDisplaySettings(NULL,0);
delete GameE;
}
void GameActivate(HWND hWindow)
{
/*في حالة التنشيط*/
}
void GameDeactivate(HWND hWindow)
{
/* في حالة إيقاف تنشيط المحرك*/
}
void GamePaint(HDC hDC)
{
// لرسم
}
void GameCycle()
{
// ما سيحدث
}سنتحدث غدا في ::
* ماهي المحركات
* لماذا تصنع المحركات و مافئدتها
* و شرح للشفرات
أتمنى أن يكون هناك من يساعدنا و يشاركنا الموضوع
و السلام
