1 // include the basic windows header files and the Direct3D header file
\r
3 #include <windowsx.h>
\r
5 #include "Engine/engine.h"
\r
6 #include "Engine/game.h"
\r
7 #include "Playground.h"
\r
8 #include "Schemereader.h"
\r
10 // define the screen resolution and keyboard macros
\r
11 #define SCREEN_WIDTH 640
\r
12 #define SCREEN_HEIGHT 480
\r
14 HINSTANCE hInstance;
\r
17 // the WindowProc function prototype
\r
18 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
21 class CPongTask : public ITask
\r
25 float paddleWidth, paddleHeight;
\r
26 float ballX, ballY, ballVX, ballVY;
\r
31 /* InitRandomNumbers();
\r
33 glMatrixMode(GL_PROJECTION);
\r
35 glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);
\r
37 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
\r
38 glShadeModel(GL_SMOOTH);
\r
39 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
\r
41 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
\r
43 paddleWidth=0.1f; paddleHeight=0.01f;
\r
45 ballX=0.5f; ballY=0.5f;
\r
46 ballVX=(float)(rand()%20-10)/20;
\r
47 ballVY=(float)(rand()%20-10)/20;
\r
54 if(CInputTask::keyDown(DIK_ESCAPE))CKernel::GetSingleton().KillAllTasks();
\r
56 glClear(GL_COLOR_BUFFER_BIT);
\r
61 glColor4f(1.0f,1.0f,1.0f,1.0f);
\r
64 glVertex2f(ballX-ballSize, ballY-ballSize);
\r
65 glVertex2f(ballX+ballSize, ballY-ballSize);
\r
66 glVertex2f(ballX+ballSize, ballY+ballSize);
\r
67 glVertex2f(ballX-ballSize, ballY+ballSize);
\r
70 glVertex2f(p2pos-paddleWidth, 0);
\r
71 glVertex2f(p2pos+paddleWidth, 0);
\r
72 glVertex2f(p2pos+paddleWidth, paddleHeight);
\r
73 glVertex2f(p2pos-paddleWidth, paddleHeight);
\r
75 glVertex2f(p1pos-paddleWidth, 1-paddleHeight);
\r
76 glVertex2f(p1pos+paddleWidth, 1-paddleHeight);
\r
77 glVertex2f(p1pos+paddleWidth, 1);
\r
78 glVertex2f(p1pos-paddleWidth, 1);
\r
82 p1pos+=((float)CInputTask::dX)/200.0f;
\r
83 if(p1pos<paddleWidth)p1pos=paddleWidth;
\r
84 if(p1pos>1-paddleWidth)p1pos=1-paddleWidth;
\r
86 ballX+=ballVX*CGlobalTimer::dT; ballY+=ballVY*CGlobalTimer::dT;
\r
87 if(ballX<ballSize)ballVX=qAbs(ballVX);
\r
88 if(ballX>1-ballSize)ballVX=-qAbs(ballVX);
\r
89 if(ballY<ballSize+paddleHeight)
\r
91 if((ballX>p2pos-paddleWidth)&&(ballX<p2pos+paddleWidth))
\r
93 ballVY=qAbs(ballVY);
\r
95 CKernel::GetSingleton().KillAllTasks();
\r
98 if(ballY>1-ballSize-paddleHeight)
\r
100 if((ballX>p1pos-paddleWidth)&&(ballX<p1pos+paddleWidth))
\r
102 ballVY=-qAbs(ballVY);
\r
104 CKernel::GetSingleton().KillAllTasks();
\r
108 if(ballX>p2pos)p2pos+=0.1f*CGlobalTimer::dT;
\r
109 if(ballX<p2pos)p2pos-=0.1f*CGlobalTimer::dT;
\r
110 if(p2pos<paddleWidth)p2pos=paddleWidth;
\r
111 if(p2pos>1-paddleWidth)p2pos=1-paddleWidth;
\r
121 void CApplication::Run(int argc, char *argv[])
\r
124 if(!CLog::Get().Init())return;
\r
126 //create a couple of singletons
\r
127 new CSettingsManager();
\r
130 //parse the 'settings.eng' file
\r
131 CSettingsManager::GetSingleton().ParseFile("settings.esf");
\r
133 //parse command-line arguments
\r
134 //skip the first argument, which is always the program name
\r
136 for(int i=1;i<argc;i++)
\r
137 CSettingsManager::GetSingleton().ParseSetting(std::string(argv[i]));
\r
139 videoTask = new CVideoUpdate();
\r
140 videoTask->priority=10000;
\r
141 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(videoTask));
\r
143 inputTask = new CInputTask();
\r
144 inputTask->priority=20;
\r
145 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(inputTask));
\r
147 soundTask = new CSoundTask();
\r
148 soundTask->priority=50;
\r
149 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(soundTask));
\r
151 globalTimer=new CGlobalTimer();
\r
152 globalTimer->priority=10;
\r
153 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(globalTimer));
\r
157 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(&game));
\r
159 //set up the profiler with an output handler
\r
160 CProfileLogHandler profileLogHandler;
\r
161 CProfileSample::outputHandler=&profileLogHandler;
\r
164 CKernel::GetSingleton().Execute();
\r
166 //clean up singletons
\r
167 delete CKernel::GetSingletonPtr();
\r
168 delete CSettingsManager::GetSingletonPtr();
\r
172 // the entry point for any Windows program
\r
173 int WINAPI WinMain(HINSTANCE hInst,
\r
174 HINSTANCE hPrevInstance,
\r
181 // register window class
\r
182 if (!hPrevInstance)
\r
186 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
\r
187 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
\r
188 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
\r
189 wc.hInstance = hInstance;
\r
190 wc.lpfnWndProc = &WindowProc;
\r
191 wc.lpszClassName = L"MainRollBallWClass";
\r
192 wc.lpszMenuName = L"MainMenu";
\r
193 wc.style = CS_HREDRAW | CS_VREDRAW;
\r
195 if (!RegisterClass(&wc)) return 0;
\r
197 hInstance = hInst;
\r
199 // create main window
\r
200 hWnd = CreateWindowEx(0, L"MainRollBallWClass", L"Main Rolling Ball Window", WS_OVERLAPPEDWINDOW, 200, 240,
\r
201 SCREEN_WIDTH+8, SCREEN_HEIGHT+26, NULL, NULL, hInstance, NULL);
\r
203 ShowWindow(hWnd, nCmdShow);
\r
204 UpdateWindow(hWnd);
\r
206 // set up and initialize Direct3D
\r
207 new CApplication();
\r
208 CApplication::GetSingleton().Run(NULL, NULL);
\r
209 delete CApplication::GetSingletonPtr();
\r
211 //clean up any remaining unreleased objects
\r
212 IMMObject::CollectRemainingObjects(true);
\r
214 PostMessage(hWnd, WM_DESTROY, 0, 0);
\r
219 // this is the main message handler for the program
\r
220 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
226 PostQuitMessage(0);
\r
231 return DefWindowProc (hWnd, message, wParam, lParam);
\r