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", SCREEN_WIDTH, SCREEN_HEIGHT},
\r
19 {SPR_TILE, "Data/Tiles0.png", FIELD_UNIT_WIDTH, FIELD_UNIT_HEIGHT},
\r
20 {SPR_PLAYER, "Data/POWBOMB.png", FIELD_UNIT_WIDTH, FIELD_UNIT_HEIGHT},
\r
21 {SPR_NONE, NULL, 0, 0}
\r
25 HINSTANCE hInstance;
\r
28 // the WindowProc function prototype
\r
29 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
31 class CPongTask : public ITask
\r
35 float paddleWidth, paddleHeight;
\r
36 float ballX, ballY, ballVX, ballVY;
\r
41 /* InitRandomNumbers();
\r
43 glMatrixMode(GL_PROJECTION);
\r
45 glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);
\r
47 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
\r
48 glShadeModel(GL_SMOOTH);
\r
49 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
\r
51 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
\r
53 paddleWidth=0.1f; paddleHeight=0.01f;
\r
55 ballX=0.5f; ballY=0.5f;
\r
56 ballVX=(float)(rand()%20-10)/20;
\r
57 ballVY=(float)(rand()%20-10)/20;
\r
64 if(CInputTask::keyDown(DIK_ESCAPE))CKernel::GetSingleton().KillAllTasks();
\r
66 glClear(GL_COLOR_BUFFER_BIT);
\r
71 glColor4f(1.0f,1.0f,1.0f,1.0f);
\r
74 glVertex2f(ballX-ballSize, ballY-ballSize);
\r
75 glVertex2f(ballX+ballSize, ballY-ballSize);
\r
76 glVertex2f(ballX+ballSize, ballY+ballSize);
\r
77 glVertex2f(ballX-ballSize, ballY+ballSize);
\r
80 glVertex2f(p2pos-paddleWidth, 0);
\r
81 glVertex2f(p2pos+paddleWidth, 0);
\r
82 glVertex2f(p2pos+paddleWidth, paddleHeight);
\r
83 glVertex2f(p2pos-paddleWidth, paddleHeight);
\r
85 glVertex2f(p1pos-paddleWidth, 1-paddleHeight);
\r
86 glVertex2f(p1pos+paddleWidth, 1-paddleHeight);
\r
87 glVertex2f(p1pos+paddleWidth, 1);
\r
88 glVertex2f(p1pos-paddleWidth, 1);
\r
92 p1pos+=((float)CInputTask::dX)/200.0f;
\r
93 if(p1pos<paddleWidth)p1pos=paddleWidth;
\r
94 if(p1pos>1-paddleWidth)p1pos=1-paddleWidth;
\r
96 ballX+=ballVX*CGlobalTimer::dT; ballY+=ballVY*CGlobalTimer::dT;
\r
97 if(ballX<ballSize)ballVX=qAbs(ballVX);
\r
98 if(ballX>1-ballSize)ballVX=-qAbs(ballVX);
\r
99 if(ballY<ballSize+paddleHeight)
\r
101 if((ballX>p2pos-paddleWidth)&&(ballX<p2pos+paddleWidth))
\r
103 ballVY=qAbs(ballVY);
\r
105 CKernel::GetSingleton().KillAllTasks();
\r
108 if(ballY>1-ballSize-paddleHeight)
\r
110 if((ballX>p1pos-paddleWidth)&&(ballX<p1pos+paddleWidth))
\r
112 ballVY=-qAbs(ballVY);
\r
114 CKernel::GetSingleton().KillAllTasks();
\r
118 if(ballX>p2pos)p2pos+=0.1f*CGlobalTimer::dT;
\r
119 if(ballX<p2pos)p2pos-=0.1f*CGlobalTimer::dT;
\r
120 if(p2pos<paddleWidth)p2pos=paddleWidth;
\r
121 if(p2pos>1-paddleWidth)p2pos=1-paddleWidth;
\r
132 void CApplication::Run(int argc, char *argv[])
\r
135 if(!CLog::Get().Init())return;
\r
137 //create a couple of singletons
\r
138 new CSettingsManager();
\r
139 CKernel *kernel = new CKernel();
\r
141 //parse the 'settings.eng' file
\r
142 CSettingsManager::GetSingleton().ParseFile("settings.esf");
\r
144 //parse command-line arguments
\r
145 //skip the first argument, which is always the program name
\r
147 for(int i=1;i<argc;i++)
\r
148 CSettingsManager::GetSingleton().ParseSetting(std::string(argv[i]));
\r
150 videoTask = new CVideoUpdate(kernel);
\r
151 videoTask->priority=10000;
\r
152 kernel->AddTask(CMMPointer<ITask>(videoTask));
\r
154 inputTask = new CInputTask(kernel);
\r
155 inputTask->priority=20;
\r
156 kernel->AddTask(CMMPointer<ITask>(inputTask));
\r
158 soundTask = new CSoundTask(kernel);
\r
159 soundTask->priority=50;
\r
160 kernel->AddTask(CMMPointer<ITask>(soundTask));
\r
162 globalTimer=new CGlobalTimer(kernel);
\r
163 globalTimer->priority=10;
\r
164 kernel->AddTask(CMMPointer<ITask>(globalTimer));
\r
166 CSpriteManager *sm = new CSpriteManager(videoTask->getGraphics(), defaultSprites);
\r
167 kernel->setSpriteManager(sm);
\r
169 Playground game(kernel);
\r
171 kernel->AddTask(CMMPointer<ITask>(&game));
\r
174 //set up the profiler with an output handler
\r
175 CProfileLogHandler profileLogHandler;
\r
176 CProfileSample::outputHandler=&profileLogHandler;
\r
181 //clean up singletons
\r
183 delete CSettingsManager::GetSingletonPtr();
\r
188 // the entry point for any Windows program
\r
189 int WINAPI WinMain(HINSTANCE hInst,
\r
190 HINSTANCE hPrevInstance,
\r
197 // register window class
\r
198 if (!hPrevInstance)
\r
202 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
\r
203 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
\r
204 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
\r
205 wc.hInstance = hInstance;
\r
206 wc.lpfnWndProc = &WindowProc;
\r
207 wc.lpszClassName = L"MainRollBallWClass";
\r
208 wc.lpszMenuName = L"MainMenu";
\r
209 wc.style = CS_HREDRAW | CS_VREDRAW;
\r
211 if (!RegisterClass(&wc)) return 0;
\r
213 hInstance = hInst;
\r
215 // create main window
\r
216 hWnd = CreateWindowEx(0, L"MainRollBallWClass", L"Main Rolling Ball Window", WS_OVERLAPPEDWINDOW, 200, 240,
\r
217 SCREEN_WIDTH+8, SCREEN_HEIGHT+26, NULL, NULL, hInstance, NULL);
\r
219 ShowWindow(hWnd, nCmdShow);
\r
220 UpdateWindow(hWnd);
\r
222 // set up and initialize Direct3D
\r
223 new CApplication();
\r
224 CApplication::GetSingleton().Run(NULL, NULL);
\r
225 delete CApplication::GetSingletonPtr();
\r
227 //clean up any remaining unreleased objects
\r
228 IMMObject::CollectRemainingObjects(true);
\r
230 PostMessage(hWnd, WM_DESTROY, 0, 0);
\r
234 // this is the main message handler for the program
\r
235 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
241 PostQuitMessage(0);
\r
246 return DefWindowProc (hWnd, message, wParam, lParam);
\r
249 int main(int argc, char *argv[])
\r
251 new CApplication();
\r
252 CApplication::GetSingleton().Run(argc,argv);
\r
253 delete CApplication::GetSingletonPtr();
\r
255 //clean up any remaining unreleased objects
\r
256 IMMObject::CollectRemainingObjects(true);
\r