1 // include the basic windows header files and the Direct3D header file
\r
4 #include <windowsx.h>
\r
7 #include "Engine/engine.h"
\r
8 #include "Engine/game.h"
\r
9 #include "Playground.h"
\r
10 #include "SchemeReader.h"
\r
12 // define the screen resolution and keyboard macros
\r
13 #define SCREEN_WIDTH 640
\r
14 #define SCREEN_HEIGHT 480
\r
17 HINSTANCE hInstance;
\r
20 // the WindowProc function prototype
\r
21 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
23 class CPongTask : public ITask
\r
27 float paddleWidth, paddleHeight;
\r
28 float ballX, ballY, ballVX, ballVY;
\r
33 /* InitRandomNumbers();
\r
35 glMatrixMode(GL_PROJECTION);
\r
37 glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);
\r
39 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
\r
40 glShadeModel(GL_SMOOTH);
\r
41 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
\r
43 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
\r
45 paddleWidth=0.1f; paddleHeight=0.01f;
\r
47 ballX=0.5f; ballY=0.5f;
\r
48 ballVX=(float)(rand()%20-10)/20;
\r
49 ballVY=(float)(rand()%20-10)/20;
\r
56 if(CInputTask::keyDown(DIK_ESCAPE))CKernel::GetSingleton().KillAllTasks();
\r
58 glClear(GL_COLOR_BUFFER_BIT);
\r
63 glColor4f(1.0f,1.0f,1.0f,1.0f);
\r
66 glVertex2f(ballX-ballSize, ballY-ballSize);
\r
67 glVertex2f(ballX+ballSize, ballY-ballSize);
\r
68 glVertex2f(ballX+ballSize, ballY+ballSize);
\r
69 glVertex2f(ballX-ballSize, ballY+ballSize);
\r
72 glVertex2f(p2pos-paddleWidth, 0);
\r
73 glVertex2f(p2pos+paddleWidth, 0);
\r
74 glVertex2f(p2pos+paddleWidth, paddleHeight);
\r
75 glVertex2f(p2pos-paddleWidth, paddleHeight);
\r
77 glVertex2f(p1pos-paddleWidth, 1-paddleHeight);
\r
78 glVertex2f(p1pos+paddleWidth, 1-paddleHeight);
\r
79 glVertex2f(p1pos+paddleWidth, 1);
\r
80 glVertex2f(p1pos-paddleWidth, 1);
\r
84 p1pos+=((float)CInputTask::dX)/200.0f;
\r
85 if(p1pos<paddleWidth)p1pos=paddleWidth;
\r
86 if(p1pos>1-paddleWidth)p1pos=1-paddleWidth;
\r
88 ballX+=ballVX*CGlobalTimer::dT; ballY+=ballVY*CGlobalTimer::dT;
\r
89 if(ballX<ballSize)ballVX=qAbs(ballVX);
\r
90 if(ballX>1-ballSize)ballVX=-qAbs(ballVX);
\r
91 if(ballY<ballSize+paddleHeight)
\r
93 if((ballX>p2pos-paddleWidth)&&(ballX<p2pos+paddleWidth))
\r
95 ballVY=qAbs(ballVY);
\r
97 CKernel::GetSingleton().KillAllTasks();
\r
100 if(ballY>1-ballSize-paddleHeight)
\r
102 if((ballX>p1pos-paddleWidth)&&(ballX<p1pos+paddleWidth))
\r
104 ballVY=-qAbs(ballVY);
\r
106 CKernel::GetSingleton().KillAllTasks();
\r
110 if(ballX>p2pos)p2pos+=0.1f*CGlobalTimer::dT;
\r
111 if(ballX<p2pos)p2pos-=0.1f*CGlobalTimer::dT;
\r
112 if(p2pos<paddleWidth)p2pos=paddleWidth;
\r
113 if(p2pos>1-paddleWidth)p2pos=1-paddleWidth;
\r
124 void CApplication::Run(int argc, char *argv[])
\r
127 if(!CLog::Get().Init())return;
\r
129 //create a couple of singletons
\r
130 new CSettingsManager();
\r
133 //parse the 'settings.eng' file
\r
134 CSettingsManager::GetSingleton().ParseFile("settings.esf");
\r
136 //parse command-line arguments
\r
137 //skip the first argument, which is always the program name
\r
139 for(int i=1;i<argc;i++)
\r
140 CSettingsManager::GetSingleton().ParseSetting(std::string(argv[i]));
\r
142 videoTask = new CVideoUpdate();
\r
143 videoTask->priority=10000;
\r
144 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(videoTask));
\r
146 inputTask = new CInputTask();
\r
147 inputTask->priority=20;
\r
148 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(inputTask));
\r
150 soundTask = new CSoundTask();
\r
151 soundTask->priority=50;
\r
152 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(soundTask));
\r
154 globalTimer=new CGlobalTimer();
\r
155 globalTimer->priority=10;
\r
156 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(globalTimer));
\r
160 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(&game));
\r
162 //set up the profiler with an output handler
\r
163 CProfileLogHandler profileLogHandler;
\r
164 CProfileSample::outputHandler=&profileLogHandler;
\r
167 CKernel::GetSingleton().Execute();
\r
169 //clean up singletons
\r
170 delete CKernel::GetSingletonPtr();
\r
171 delete CSettingsManager::GetSingletonPtr();
\r
176 // the entry point for any Windows program
\r
177 int WINAPI WinMain(HINSTANCE hInst,
\r
178 HINSTANCE hPrevInstance,
\r
185 // register window class
\r
186 if (!hPrevInstance)
\r
190 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
\r
191 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
\r
192 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
\r
193 wc.hInstance = hInstance;
\r
194 wc.lpfnWndProc = &WindowProc;
\r
195 wc.lpszClassName = L"MainRollBallWClass";
\r
196 wc.lpszMenuName = L"MainMenu";
\r
197 wc.style = CS_HREDRAW | CS_VREDRAW;
\r
199 if (!RegisterClass(&wc)) return 0;
\r
201 hInstance = hInst;
\r
203 // create main window
\r
204 hWnd = CreateWindowEx(0, L"MainRollBallWClass", L"Main Rolling Ball Window", WS_OVERLAPPEDWINDOW, 200, 240,
\r
205 SCREEN_WIDTH+8, SCREEN_HEIGHT+26, NULL, NULL, hInstance, NULL);
\r
207 ShowWindow(hWnd, nCmdShow);
\r
208 UpdateWindow(hWnd);
\r
210 // set up and initialize Direct3D
\r
211 new CApplication();
\r
212 CApplication::GetSingleton().Run(NULL, NULL);
\r
213 delete CApplication::GetSingletonPtr();
\r
215 //clean up any remaining unreleased objects
\r
216 IMMObject::CollectRemainingObjects(true);
\r
218 PostMessage(hWnd, WM_DESTROY, 0, 0);
\r
222 // this is the main message handler for the program
\r
223 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
229 PostQuitMessage(0);
\r
234 return DefWindowProc (hWnd, message, wParam, lParam);
\r
237 int main(int argc, char *argv[])
\r
239 new CApplication();
\r
240 CApplication::GetSingleton().Run(argc,argv);
\r
241 delete CApplication::GetSingletonPtr();
\r
243 //clean up any remaining unreleased objects
\r
244 IMMObject::CollectRemainingObjects(true);
\r