* Make the Bomberman draw itself.
[matthijs/ABM2.git] / ABM2 / main.cpp
1 // include the basic windows header files and the Direct3D header file\r
2 #ifdef WIN32\r
3 #include <windows.h>\r
4 #include <windowsx.h>\r
5 #endif\r
6 \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
12 \r
13 // define the screen resolution and keyboard macros\r
14 #define SCREEN_WIDTH  640\r
15 #define SCREEN_HEIGHT 480\r
16 \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
22 };\r
23 \r
24 #ifdef WIN32\r
25 HINSTANCE hInstance;\r
26 HWND hWnd;\r
27 \r
28 // the WindowProc function prototype\r
29 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\r
30 \r
31 class CPongTask : public ITask\r
32 {\r
33 public:\r
34         float p1pos, p2pos;\r
35         float paddleWidth, paddleHeight;\r
36         float ballX, ballY, ballVX, ballVY;\r
37         float ballSize;\r
38 \r
39         bool Start()\r
40                 {\r
41 /*                      InitRandomNumbers();\r
42 \r
43                         glMatrixMode(GL_PROJECTION);\r
44                         glLoadIdentity();\r
45                         glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);\r
46 \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
50                         glEnable(GL_BLEND);\r
51                         glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);\r
52 \r
53                         paddleWidth=0.1f; paddleHeight=0.01f;\r
54                         p1pos=p2pos=0.5f;\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
58                         ballSize=0.01f;\r
59 */\r
60                         return true;\r
61                 }\r
62         void Update()\r
63                 {\r
64                         if(CInputTask::keyDown(DIK_ESCAPE))CKernel::GetSingleton().KillAllTasks();\r
65                         /*\r
66                         glClear(GL_COLOR_BUFFER_BIT);\r
67                         \r
68 \r
69                         glBegin(GL_QUADS);\r
70                         {\r
71                                 glColor4f(1.0f,1.0f,1.0f,1.0f);\r
72                                 \r
73                                 //draw the ball\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
78                                 \r
79                                 //paddles\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
84 \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
89                         }\r
90                         glEnd();\r
91 \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
95 \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
100                         {\r
101                                 if((ballX>p2pos-paddleWidth)&&(ballX<p2pos+paddleWidth))\r
102                                 {\r
103                                         ballVY=qAbs(ballVY);\r
104                                 }else{\r
105                                         CKernel::GetSingleton().KillAllTasks();\r
106                                 }\r
107                         }\r
108                         if(ballY>1-ballSize-paddleHeight)\r
109                         {\r
110                                 if((ballX>p1pos-paddleWidth)&&(ballX<p1pos+paddleWidth))\r
111                                 {\r
112                                         ballVY=-qAbs(ballVY);\r
113                                 }else{\r
114                                         CKernel::GetSingleton().KillAllTasks();\r
115                                 }\r
116                         }\r
117 \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
122 */\r
123                 }\r
124         void Stop()\r
125         {\r
126 \r
127         };\r
128         AUTO_SIZE;\r
129 };\r
130 \r
131 #endif // WIN32\r
132 void CApplication::Run(int argc, char *argv[])\r
133 {\r
134         //open logfiles\r
135         if(!CLog::Get().Init())return;\r
136 \r
137         //create a couple of singletons\r
138         new CSettingsManager();\r
139         CKernel *kernel = new CKernel();\r
140 \r
141         //parse the 'settings.eng' file\r
142         CSettingsManager::GetSingleton().ParseFile("settings.esf");\r
143         \r
144         //parse command-line arguments\r
145         //skip the first argument, which is always the program name\r
146         if(argc>1)\r
147                 for(int i=1;i<argc;i++)\r
148                         CSettingsManager::GetSingleton().ParseSetting(std::string(argv[i]));\r
149         \r
150         videoTask = new CVideoUpdate(kernel);\r
151         videoTask->priority=10000;\r
152         kernel->AddTask(CMMPointer<ITask>(videoTask));\r
153 \r
154         inputTask = new CInputTask(kernel);\r
155         inputTask->priority=20;\r
156         kernel->AddTask(CMMPointer<ITask>(inputTask));\r
157 \r
158         soundTask = new CSoundTask(kernel);\r
159         soundTask->priority=50;\r
160         kernel->AddTask(CMMPointer<ITask>(soundTask));\r
161 \r
162         globalTimer=new CGlobalTimer(kernel);\r
163         globalTimer->priority=10;\r
164         kernel->AddTask(CMMPointer<ITask>(globalTimer));\r
165 \r
166         CSpriteManager *sm = new CSpriteManager(videoTask->getGraphics(), defaultSprites);\r
167         kernel->setSpriteManager(sm);\r
168 \r
169         Playground game(kernel);\r
170         game.priority=100;\r
171         kernel->AddTask(CMMPointer<ITask>(&game));\r
172 \r
173 \r
174         //set up the profiler with an output handler\r
175         CProfileLogHandler profileLogHandler;\r
176         CProfileSample::outputHandler=&profileLogHandler;\r
177 \r
178         //main game loop\r
179         kernel->Execute();\r
180         \r
181         //clean up singletons\r
182         delete kernel;\r
183         delete CSettingsManager::GetSingletonPtr();\r
184 }\r
185 \r
186 #ifdef WIN32\r
187 \r
188 // the entry point for any Windows program\r
189 int WINAPI WinMain(HINSTANCE hInst,\r
190                    HINSTANCE hPrevInstance,\r
191                    LPSTR lpCmdLine,\r
192                    int nCmdShow)\r
193 {\r
194   WNDCLASS wc;\r
195 \r
196 \r
197         // register window class\r
198         if (!hPrevInstance)\r
199         {\r
200                 wc.cbClsExtra = 0;\r
201                 wc.cbWndExtra = 0;\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
210 \r
211                 if (!RegisterClass(&wc)) return 0;\r
212         }\r
213         hInstance = hInst;      \r
214 \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
218 \r
219     ShowWindow(hWnd, nCmdShow);\r
220         UpdateWindow(hWnd);\r
221 \r
222     // set up and initialize Direct3D\r
223         new CApplication();\r
224         CApplication::GetSingleton().Run(NULL, NULL);\r
225         delete CApplication::GetSingletonPtr();\r
226 \r
227         //clean up any remaining unreleased objects\r
228         IMMObject::CollectRemainingObjects(true);\r
229 \r
230         PostMessage(hWnd, WM_DESTROY, 0, 0);\r
231   return 0;\r
232 }\r
233 \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
236 {\r
237     switch(message)\r
238     {\r
239         case WM_DESTROY:\r
240             {\r
241                 PostQuitMessage(0);\r
242                 return 0;\r
243             } break;\r
244     }\r
245 \r
246     return DefWindowProc (hWnd, message, wParam, lParam);\r
247 }\r
248 #else // WIN32\r
249 int main(int argc, char *argv[])\r
250 {\r
251   new CApplication();\r
252   CApplication::GetSingleton().Run(argc,argv);\r
253   delete CApplication::GetSingletonPtr();\r
254 \r
255   //clean up any remaining unreleased objects\r
256   IMMObject::CollectRemainingObjects(true);\r
257 \r
258   return 0;\r
259 }\r
260 #endif //WIN32\r
261 \r