5e1a52ac19125ccf5f86576fbdae4a52557badd5
[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 enum SpriteID {\r
18         SPR_NONE = 0,\r
19         SPR_FIELD,\r
20         SPR_SOLID,\r
21         SPR_BRICK,\r
22         SPR_BLANK,\r
23         SPR_PLAYER,\r
24 };\r
25 \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
30 };\r
31 \r
32 #ifdef WIN32\r
33 HINSTANCE hInstance;\r
34 HWND hWnd;\r
35 \r
36 // the WindowProc function prototype\r
37 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\r
38 \r
39 class CPongTask : public ITask\r
40 {\r
41 public:\r
42         float p1pos, p2pos;\r
43         float paddleWidth, paddleHeight;\r
44         float ballX, ballY, ballVX, ballVY;\r
45         float ballSize;\r
46 \r
47         bool Start()\r
48                 {\r
49 /*                      InitRandomNumbers();\r
50 \r
51                         glMatrixMode(GL_PROJECTION);\r
52                         glLoadIdentity();\r
53                         glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);\r
54 \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
58                         glEnable(GL_BLEND);\r
59                         glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);\r
60 \r
61                         paddleWidth=0.1f; paddleHeight=0.01f;\r
62                         p1pos=p2pos=0.5f;\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
66                         ballSize=0.01f;\r
67 */\r
68                         return true;\r
69                 }\r
70         void Update()\r
71                 {\r
72                         if(CInputTask::keyDown(DIK_ESCAPE))CKernel::GetSingleton().KillAllTasks();\r
73                         /*\r
74                         glClear(GL_COLOR_BUFFER_BIT);\r
75                         \r
76 \r
77                         glBegin(GL_QUADS);\r
78                         {\r
79                                 glColor4f(1.0f,1.0f,1.0f,1.0f);\r
80                                 \r
81                                 //draw the ball\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
86                                 \r
87                                 //paddles\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
92 \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
97                         }\r
98                         glEnd();\r
99 \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
103 \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
108                         {\r
109                                 if((ballX>p2pos-paddleWidth)&&(ballX<p2pos+paddleWidth))\r
110                                 {\r
111                                         ballVY=qAbs(ballVY);\r
112                                 }else{\r
113                                         CKernel::GetSingleton().KillAllTasks();\r
114                                 }\r
115                         }\r
116                         if(ballY>1-ballSize-paddleHeight)\r
117                         {\r
118                                 if((ballX>p1pos-paddleWidth)&&(ballX<p1pos+paddleWidth))\r
119                                 {\r
120                                         ballVY=-qAbs(ballVY);\r
121                                 }else{\r
122                                         CKernel::GetSingleton().KillAllTasks();\r
123                                 }\r
124                         }\r
125 \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
130 */\r
131                 }\r
132         void Stop()\r
133         {\r
134 \r
135         };\r
136         AUTO_SIZE;\r
137 };\r
138 \r
139 #endif // WIN32\r
140 void CApplication::Run(int argc, char *argv[])\r
141 {\r
142         //open logfiles\r
143         if(!CLog::Get().Init())return;\r
144 \r
145         //create a couple of singletons\r
146         new CSettingsManager();\r
147         new CKernel();\r
148 \r
149         //parse the 'settings.eng' file\r
150         CSettingsManager::GetSingleton().ParseFile("settings.esf");\r
151         \r
152         //parse command-line arguments\r
153         //skip the first argument, which is always the program name\r
154         if(argc>1)\r
155                 for(int i=1;i<argc;i++)\r
156                         CSettingsManager::GetSingleton().ParseSetting(std::string(argv[i]));\r
157         \r
158         videoTask = new CVideoUpdate();\r
159         videoTask->priority=10000;\r
160         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(videoTask));\r
161 \r
162         inputTask = new CInputTask();\r
163         inputTask->priority=20;\r
164         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(inputTask));\r
165 \r
166         soundTask = new CSoundTask();\r
167         soundTask->priority=50;\r
168         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(soundTask));\r
169 \r
170         globalTimer=new CGlobalTimer();\r
171         globalTimer->priority=10;\r
172         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(globalTimer));\r
173 \r
174         CSpriteManager *sm = new CSpriteManager(videoTask->getGraphics(), defaultSprites);\r
175         CKernel::GetSingleton().setSpriteManager(sm);\r
176 \r
177         Playground game(&CKernel::GetSingleton());\r
178         game.priority=100;\r
179         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(&game));\r
180 \r
181         //set up the profiler with an output handler\r
182         CProfileLogHandler profileLogHandler;\r
183         CProfileSample::outputHandler=&profileLogHandler;\r
184 \r
185         //main game loop\r
186         CKernel::GetSingleton().Execute();\r
187         \r
188         //clean up singletons\r
189         delete CKernel::GetSingletonPtr();\r
190         delete CSettingsManager::GetSingletonPtr();\r
191 }\r
192 \r
193 #ifdef WIN32\r
194 \r
195 // the entry point for any Windows program\r
196 int WINAPI WinMain(HINSTANCE hInst,\r
197                    HINSTANCE hPrevInstance,\r
198                    LPSTR lpCmdLine,\r
199                    int nCmdShow)\r
200 {\r
201   WNDCLASS wc;\r
202 \r
203 \r
204         // register window class\r
205         if (!hPrevInstance)\r
206         {\r
207                 wc.cbClsExtra = 0;\r
208                 wc.cbWndExtra = 0;\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
217 \r
218                 if (!RegisterClass(&wc)) return 0;\r
219         }\r
220         hInstance = hInst;      \r
221 \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
225 \r
226     ShowWindow(hWnd, nCmdShow);\r
227         UpdateWindow(hWnd);\r
228 \r
229     // set up and initialize Direct3D\r
230         new CApplication();\r
231         CApplication::GetSingleton().Run(NULL, NULL);\r
232         delete CApplication::GetSingletonPtr();\r
233 \r
234         //clean up any remaining unreleased objects\r
235         IMMObject::CollectRemainingObjects(true);\r
236 \r
237         PostMessage(hWnd, WM_DESTROY, 0, 0);\r
238   return 0;\r
239 }\r
240 \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
243 {\r
244     switch(message)\r
245     {\r
246         case WM_DESTROY:\r
247             {\r
248                 PostQuitMessage(0);\r
249                 return 0;\r
250             } break;\r
251     }\r
252 \r
253     return DefWindowProc (hWnd, message, wParam, lParam);\r
254 }\r
255 #else // WIN32\r
256 int main(int argc, char *argv[])\r
257 {\r
258   new CApplication();\r
259   CApplication::GetSingleton().Run(argc,argv);\r
260   delete CApplication::GetSingletonPtr();\r
261 \r
262   //clean up any remaining unreleased objects\r
263   IMMObject::CollectRemainingObjects(true);\r
264 \r
265   return 0;\r
266 }\r
267 #endif //WIN32\r
268 \r