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
17 SpriteData defaultSprites[] = {
\r
18 {SPR_FIELD, "Data/FIELD0.png", 640, 480},
\r
19 {SPR_TILE, "Data/Tiles0.png", 40, 36},
\r
20 {SPR_NONE, NULL, 0, 0}
\r
24 HINSTANCE hInstance;
\r
27 // the WindowProc function prototype
\r
28 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
30 class CPongTask : public ITask
\r
34 float paddleWidth, paddleHeight;
\r
35 float ballX, ballY, ballVX, ballVY;
\r
40 /* InitRandomNumbers();
\r
42 glMatrixMode(GL_PROJECTION);
\r
44 glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);
\r
46 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
\r
47 glShadeModel(GL_SMOOTH);
\r
48 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
\r
50 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
\r
52 paddleWidth=0.1f; paddleHeight=0.01f;
\r
54 ballX=0.5f; ballY=0.5f;
\r
55 ballVX=(float)(rand()%20-10)/20;
\r
56 ballVY=(float)(rand()%20-10)/20;
\r
63 if(CInputTask::keyDown(DIK_ESCAPE))CKernel::GetSingleton().KillAllTasks();
\r
65 glClear(GL_COLOR_BUFFER_BIT);
\r
70 glColor4f(1.0f,1.0f,1.0f,1.0f);
\r
73 glVertex2f(ballX-ballSize, ballY-ballSize);
\r
74 glVertex2f(ballX+ballSize, ballY-ballSize);
\r
75 glVertex2f(ballX+ballSize, ballY+ballSize);
\r
76 glVertex2f(ballX-ballSize, ballY+ballSize);
\r
79 glVertex2f(p2pos-paddleWidth, 0);
\r
80 glVertex2f(p2pos+paddleWidth, 0);
\r
81 glVertex2f(p2pos+paddleWidth, paddleHeight);
\r
82 glVertex2f(p2pos-paddleWidth, paddleHeight);
\r
84 glVertex2f(p1pos-paddleWidth, 1-paddleHeight);
\r
85 glVertex2f(p1pos+paddleWidth, 1-paddleHeight);
\r
86 glVertex2f(p1pos+paddleWidth, 1);
\r
87 glVertex2f(p1pos-paddleWidth, 1);
\r
91 p1pos+=((float)CInputTask::dX)/200.0f;
\r
92 if(p1pos<paddleWidth)p1pos=paddleWidth;
\r
93 if(p1pos>1-paddleWidth)p1pos=1-paddleWidth;
\r
95 ballX+=ballVX*CGlobalTimer::dT; ballY+=ballVY*CGlobalTimer::dT;
\r
96 if(ballX<ballSize)ballVX=qAbs(ballVX);
\r
97 if(ballX>1-ballSize)ballVX=-qAbs(ballVX);
\r
98 if(ballY<ballSize+paddleHeight)
\r
100 if((ballX>p2pos-paddleWidth)&&(ballX<p2pos+paddleWidth))
\r
102 ballVY=qAbs(ballVY);
\r
104 CKernel::GetSingleton().KillAllTasks();
\r
107 if(ballY>1-ballSize-paddleHeight)
\r
109 if((ballX>p1pos-paddleWidth)&&(ballX<p1pos+paddleWidth))
\r
111 ballVY=-qAbs(ballVY);
\r
113 CKernel::GetSingleton().KillAllTasks();
\r
117 if(ballX>p2pos)p2pos+=0.1f*CGlobalTimer::dT;
\r
118 if(ballX<p2pos)p2pos-=0.1f*CGlobalTimer::dT;
\r
119 if(p2pos<paddleWidth)p2pos=paddleWidth;
\r
120 if(p2pos>1-paddleWidth)p2pos=1-paddleWidth;
\r
131 void CApplication::Run(int argc, char *argv[])
\r
134 if(!CLog::Get().Init())return;
\r
136 //create a couple of singletons
\r
137 new CSettingsManager();
\r
138 CKernel *kernel = new CKernel();
\r
140 //parse the 'settings.eng' file
\r
141 CSettingsManager::GetSingleton().ParseFile("settings.esf");
\r
143 //parse command-line arguments
\r
144 //skip the first argument, which is always the program name
\r
146 for(int i=1;i<argc;i++)
\r
147 CSettingsManager::GetSingleton().ParseSetting(std::string(argv[i]));
\r
149 videoTask = new CVideoUpdate(kernel);
\r
150 videoTask->priority=10000;
\r
151 kernel->AddTask(CMMPointer<ITask>(videoTask));
\r
153 inputTask = new CInputTask(kernel);
\r
154 inputTask->priority=20;
\r
155 kernel->AddTask(CMMPointer<ITask>(inputTask));
\r
157 soundTask = new CSoundTask(kernel);
\r
158 soundTask->priority=50;
\r
159 kernel->AddTask(CMMPointer<ITask>(soundTask));
\r
161 globalTimer=new CGlobalTimer(kernel);
\r
162 globalTimer->priority=10;
\r
163 kernel->AddTask(CMMPointer<ITask>(globalTimer));
\r
165 CSpriteManager *sm = new CSpriteManager(videoTask->getGraphics(), defaultSprites);
\r
166 kernel->setSpriteManager(sm);
\r
168 Playground game(kernel);
\r
170 kernel->AddTask(CMMPointer<ITask>(&game));
\r
173 //set up the profiler with an output handler
\r
174 CProfileLogHandler profileLogHandler;
\r
175 CProfileSample::outputHandler=&profileLogHandler;
\r
180 //clean up singletons
\r
182 delete CSettingsManager::GetSingletonPtr();
\r
187 // the entry point for any Windows program
\r
188 int WINAPI WinMain(HINSTANCE hInst,
\r
189 HINSTANCE hPrevInstance,
\r
196 // register window class
\r
197 if (!hPrevInstance)
\r
201 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
\r
202 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
\r
203 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
\r
204 wc.hInstance = hInstance;
\r
205 wc.lpfnWndProc = &WindowProc;
\r
206 wc.lpszClassName = L"MainRollBallWClass";
\r
207 wc.lpszMenuName = L"MainMenu";
\r
208 wc.style = CS_HREDRAW | CS_VREDRAW;
\r
210 if (!RegisterClass(&wc)) return 0;
\r
212 hInstance = hInst;
\r
214 // create main window
\r
215 hWnd = CreateWindowEx(0, L"MainRollBallWClass", L"Main Rolling Ball Window", WS_OVERLAPPEDWINDOW, 200, 240,
\r
216 SCREEN_WIDTH+8, SCREEN_HEIGHT+26, NULL, NULL, hInstance, NULL);
\r
218 ShowWindow(hWnd, nCmdShow);
\r
219 UpdateWindow(hWnd);
\r
221 // set up and initialize Direct3D
\r
222 new CApplication();
\r
223 CApplication::GetSingleton().Run(NULL, NULL);
\r
224 delete CApplication::GetSingletonPtr();
\r
226 //clean up any remaining unreleased objects
\r
227 IMMObject::CollectRemainingObjects(true);
\r
229 PostMessage(hWnd, WM_DESTROY, 0, 0);
\r
233 // this is the main message handler for the program
\r
234 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
240 PostQuitMessage(0);
\r
245 return DefWindowProc (hWnd, message, wParam, lParam);
\r
248 int main(int argc, char *argv[])
\r
250 new CApplication();
\r
251 CApplication::GetSingleton().Run(argc,argv);
\r
252 delete CApplication::GetSingletonPtr();
\r
254 //clean up any remaining unreleased objects
\r
255 IMMObject::CollectRemainingObjects(true);
\r