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 "Engine/SpriteManager.h"
\r
10 #include "Playground.h"
\r
11 #include "SchemeReader.h"
\r
13 // define the screen resolution and keyboard macros
\r
14 #define SCREEN_WIDTH 640
\r
15 #define SCREEN_HEIGHT 480
\r
26 SpriteData defaultSprites[] = {
\r
27 {SPR_FIELD, "FIELD0.png", 640, 480},
\r
28 {SPR_BLANK, "FIELD0.png", 640, 480},
\r
29 {SPR_NONE, NULL, 0, 0}
\r
33 HINSTANCE hInstance;
\r
36 // the WindowProc function prototype
\r
37 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
39 class CPongTask : public ITask
\r
43 float paddleWidth, paddleHeight;
\r
44 float ballX, ballY, ballVX, ballVY;
\r
49 /* InitRandomNumbers();
\r
51 glMatrixMode(GL_PROJECTION);
\r
53 glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);
\r
55 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
\r
56 glShadeModel(GL_SMOOTH);
\r
57 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
\r
59 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
\r
61 paddleWidth=0.1f; paddleHeight=0.01f;
\r
63 ballX=0.5f; ballY=0.5f;
\r
64 ballVX=(float)(rand()%20-10)/20;
\r
65 ballVY=(float)(rand()%20-10)/20;
\r
72 if(CInputTask::keyDown(DIK_ESCAPE))CKernel::GetSingleton().KillAllTasks();
\r
74 glClear(GL_COLOR_BUFFER_BIT);
\r
79 glColor4f(1.0f,1.0f,1.0f,1.0f);
\r
82 glVertex2f(ballX-ballSize, ballY-ballSize);
\r
83 glVertex2f(ballX+ballSize, ballY-ballSize);
\r
84 glVertex2f(ballX+ballSize, ballY+ballSize);
\r
85 glVertex2f(ballX-ballSize, ballY+ballSize);
\r
88 glVertex2f(p2pos-paddleWidth, 0);
\r
89 glVertex2f(p2pos+paddleWidth, 0);
\r
90 glVertex2f(p2pos+paddleWidth, paddleHeight);
\r
91 glVertex2f(p2pos-paddleWidth, paddleHeight);
\r
93 glVertex2f(p1pos-paddleWidth, 1-paddleHeight);
\r
94 glVertex2f(p1pos+paddleWidth, 1-paddleHeight);
\r
95 glVertex2f(p1pos+paddleWidth, 1);
\r
96 glVertex2f(p1pos-paddleWidth, 1);
\r
100 p1pos+=((float)CInputTask::dX)/200.0f;
\r
101 if(p1pos<paddleWidth)p1pos=paddleWidth;
\r
102 if(p1pos>1-paddleWidth)p1pos=1-paddleWidth;
\r
104 ballX+=ballVX*CGlobalTimer::dT; ballY+=ballVY*CGlobalTimer::dT;
\r
105 if(ballX<ballSize)ballVX=qAbs(ballVX);
\r
106 if(ballX>1-ballSize)ballVX=-qAbs(ballVX);
\r
107 if(ballY<ballSize+paddleHeight)
\r
109 if((ballX>p2pos-paddleWidth)&&(ballX<p2pos+paddleWidth))
\r
111 ballVY=qAbs(ballVY);
\r
113 CKernel::GetSingleton().KillAllTasks();
\r
116 if(ballY>1-ballSize-paddleHeight)
\r
118 if((ballX>p1pos-paddleWidth)&&(ballX<p1pos+paddleWidth))
\r
120 ballVY=-qAbs(ballVY);
\r
122 CKernel::GetSingleton().KillAllTasks();
\r
126 if(ballX>p2pos)p2pos+=0.1f*CGlobalTimer::dT;
\r
127 if(ballX<p2pos)p2pos-=0.1f*CGlobalTimer::dT;
\r
128 if(p2pos<paddleWidth)p2pos=paddleWidth;
\r
129 if(p2pos>1-paddleWidth)p2pos=1-paddleWidth;
\r
140 void CApplication::Run(int argc, char *argv[])
\r
143 if(!CLog::Get().Init())return;
\r
145 //create a couple of singletons
\r
146 new CSettingsManager();
\r
149 //parse the 'settings.eng' file
\r
150 CSettingsManager::GetSingleton().ParseFile("settings.esf");
\r
152 //parse command-line arguments
\r
153 //skip the first argument, which is always the program name
\r
155 for(int i=1;i<argc;i++)
\r
156 CSettingsManager::GetSingleton().ParseSetting(std::string(argv[i]));
\r
158 videoTask = new CVideoUpdate();
\r
159 videoTask->priority=10000;
\r
160 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(videoTask));
\r
162 inputTask = new CInputTask();
\r
163 inputTask->priority=20;
\r
164 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(inputTask));
\r
166 soundTask = new CSoundTask();
\r
167 soundTask->priority=50;
\r
168 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(soundTask));
\r
170 globalTimer=new CGlobalTimer();
\r
171 globalTimer->priority=10;
\r
172 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(globalTimer));
\r
174 CSpriteManager *sm = new CSpriteManager(videoTask->getGraphics(), defaultSprites);
\r
175 CKernel::GetSingleton().setSpriteManager(sm);
\r
177 Playground game(&CKernel::GetSingleton());
\r
179 CKernel::GetSingleton().AddTask(CMMPointer<ITask>(&game));
\r
181 //set up the profiler with an output handler
\r
182 CProfileLogHandler profileLogHandler;
\r
183 CProfileSample::outputHandler=&profileLogHandler;
\r
186 CKernel::GetSingleton().Execute();
\r
188 //clean up singletons
\r
189 delete CKernel::GetSingletonPtr();
\r
190 delete CSettingsManager::GetSingletonPtr();
\r
195 // the entry point for any Windows program
\r
196 int WINAPI WinMain(HINSTANCE hInst,
\r
197 HINSTANCE hPrevInstance,
\r
204 // register window class
\r
205 if (!hPrevInstance)
\r
209 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
\r
210 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
\r
211 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
\r
212 wc.hInstance = hInstance;
\r
213 wc.lpfnWndProc = &WindowProc;
\r
214 wc.lpszClassName = L"MainRollBallWClass";
\r
215 wc.lpszMenuName = L"MainMenu";
\r
216 wc.style = CS_HREDRAW | CS_VREDRAW;
\r
218 if (!RegisterClass(&wc)) return 0;
\r
220 hInstance = hInst;
\r
222 // create main window
\r
223 hWnd = CreateWindowEx(0, L"MainRollBallWClass", L"Main Rolling Ball Window", WS_OVERLAPPEDWINDOW, 200, 240,
\r
224 SCREEN_WIDTH+8, SCREEN_HEIGHT+26, NULL, NULL, hInstance, NULL);
\r
226 ShowWindow(hWnd, nCmdShow);
\r
227 UpdateWindow(hWnd);
\r
229 // set up and initialize Direct3D
\r
230 new CApplication();
\r
231 CApplication::GetSingleton().Run(NULL, NULL);
\r
232 delete CApplication::GetSingletonPtr();
\r
234 //clean up any remaining unreleased objects
\r
235 IMMObject::CollectRemainingObjects(true);
\r
237 PostMessage(hWnd, WM_DESTROY, 0, 0);
\r
241 // this is the main message handler for the program
\r
242 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
248 PostQuitMessage(0);
\r
253 return DefWindowProc (hWnd, message, wParam, lParam);
\r
256 int main(int argc, char *argv[])
\r
258 new CApplication();
\r
259 CApplication::GetSingleton().Run(argc,argv);
\r
260 delete CApplication::GetSingletonPtr();
\r
262 //clean up any remaining unreleased objects
\r
263 IMMObject::CollectRemainingObjects(true);
\r