* Remove some hacks.
[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 "Playground.h"\r
10 #include "SchemeReader.h"\r
11 \r
12 // define the screen resolution and keyboard macros\r
13 #define SCREEN_WIDTH  640\r
14 #define SCREEN_HEIGHT 480\r
15 \r
16 #ifdef WIN32\r
17 HINSTANCE hInstance;\r
18 HWND hWnd;\r
19 \r
20 // the WindowProc function prototype\r
21 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\r
22 \r
23 class CPongTask : public ITask\r
24 {\r
25 public:\r
26         float p1pos, p2pos;\r
27         float paddleWidth, paddleHeight;\r
28         float ballX, ballY, ballVX, ballVY;\r
29         float ballSize;\r
30 \r
31         bool Start()\r
32                 {\r
33 /*                      InitRandomNumbers();\r
34 \r
35                         glMatrixMode(GL_PROJECTION);\r
36                         glLoadIdentity();\r
37                         glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);\r
38 \r
39                         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);\r
40                         glShadeModel(GL_SMOOTH);\r
41                         glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);\r
42                         glEnable(GL_BLEND);\r
43                         glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);\r
44 \r
45                         paddleWidth=0.1f; paddleHeight=0.01f;\r
46                         p1pos=p2pos=0.5f;\r
47                         ballX=0.5f; ballY=0.5f;\r
48                         ballVX=(float)(rand()%20-10)/20;\r
49                         ballVY=(float)(rand()%20-10)/20;\r
50                         ballSize=0.01f;\r
51 */\r
52                         return true;\r
53                 }\r
54         void Update()\r
55                 {\r
56                         if(CInputTask::keyDown(DIK_ESCAPE))CKernel::GetSingleton().KillAllTasks();\r
57                         /*\r
58                         glClear(GL_COLOR_BUFFER_BIT);\r
59                         \r
60 \r
61                         glBegin(GL_QUADS);\r
62                         {\r
63                                 glColor4f(1.0f,1.0f,1.0f,1.0f);\r
64                                 \r
65                                 //draw the ball\r
66                                 glVertex2f(ballX-ballSize, ballY-ballSize);\r
67                                 glVertex2f(ballX+ballSize, ballY-ballSize);\r
68                                 glVertex2f(ballX+ballSize, ballY+ballSize);\r
69                                 glVertex2f(ballX-ballSize, ballY+ballSize);\r
70                                 \r
71                                 //paddles\r
72                                 glVertex2f(p2pos-paddleWidth, 0);\r
73                                 glVertex2f(p2pos+paddleWidth, 0);\r
74                                 glVertex2f(p2pos+paddleWidth, paddleHeight);\r
75                                 glVertex2f(p2pos-paddleWidth, paddleHeight);\r
76 \r
77                                 glVertex2f(p1pos-paddleWidth, 1-paddleHeight);\r
78                                 glVertex2f(p1pos+paddleWidth, 1-paddleHeight);\r
79                                 glVertex2f(p1pos+paddleWidth, 1);\r
80                                 glVertex2f(p1pos-paddleWidth, 1);\r
81                         }\r
82                         glEnd();\r
83 \r
84                         p1pos+=((float)CInputTask::dX)/200.0f;\r
85                         if(p1pos<paddleWidth)p1pos=paddleWidth;\r
86                         if(p1pos>1-paddleWidth)p1pos=1-paddleWidth;\r
87 \r
88                         ballX+=ballVX*CGlobalTimer::dT; ballY+=ballVY*CGlobalTimer::dT;\r
89                         if(ballX<ballSize)ballVX=qAbs(ballVX);\r
90                         if(ballX>1-ballSize)ballVX=-qAbs(ballVX);\r
91                         if(ballY<ballSize+paddleHeight)\r
92                         {\r
93                                 if((ballX>p2pos-paddleWidth)&&(ballX<p2pos+paddleWidth))\r
94                                 {\r
95                                         ballVY=qAbs(ballVY);\r
96                                 }else{\r
97                                         CKernel::GetSingleton().KillAllTasks();\r
98                                 }\r
99                         }\r
100                         if(ballY>1-ballSize-paddleHeight)\r
101                         {\r
102                                 if((ballX>p1pos-paddleWidth)&&(ballX<p1pos+paddleWidth))\r
103                                 {\r
104                                         ballVY=-qAbs(ballVY);\r
105                                 }else{\r
106                                         CKernel::GetSingleton().KillAllTasks();\r
107                                 }\r
108                         }\r
109 \r
110                         if(ballX>p2pos)p2pos+=0.1f*CGlobalTimer::dT;\r
111                         if(ballX<p2pos)p2pos-=0.1f*CGlobalTimer::dT;\r
112                         if(p2pos<paddleWidth)p2pos=paddleWidth;\r
113                         if(p2pos>1-paddleWidth)p2pos=1-paddleWidth;\r
114 */\r
115                 }\r
116         void Stop()\r
117         {\r
118 \r
119         };\r
120         AUTO_SIZE;\r
121 };\r
122 \r
123 #endif // WIN32\r
124 void CApplication::Run(int argc, char *argv[])\r
125 {\r
126         //open logfiles\r
127         if(!CLog::Get().Init())return;\r
128 \r
129         //create a couple of singletons\r
130         new CSettingsManager();\r
131         new CKernel();\r
132 \r
133         //parse the 'settings.eng' file\r
134         CSettingsManager::GetSingleton().ParseFile("settings.esf");\r
135         \r
136         //parse command-line arguments\r
137         //skip the first argument, which is always the program name\r
138         if(argc>1)\r
139                 for(int i=1;i<argc;i++)\r
140                         CSettingsManager::GetSingleton().ParseSetting(std::string(argv[i]));\r
141         \r
142         videoTask = new CVideoUpdate();\r
143         videoTask->priority=10000;\r
144         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(videoTask));\r
145 \r
146         inputTask = new CInputTask();\r
147         inputTask->priority=20;\r
148         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(inputTask));\r
149 \r
150         soundTask = new CSoundTask();\r
151         soundTask->priority=50;\r
152         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(soundTask));\r
153 \r
154         globalTimer=new CGlobalTimer();\r
155         globalTimer->priority=10;\r
156         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(globalTimer));\r
157 \r
158         Playground game;\r
159         game.priority=100;\r
160         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(&game));\r
161 \r
162         //set up the profiler with an output handler\r
163         CProfileLogHandler profileLogHandler;\r
164         CProfileSample::outputHandler=&profileLogHandler;\r
165 \r
166         //main game loop\r
167         CKernel::GetSingleton().Execute();\r
168         \r
169         //clean up singletons\r
170         delete CKernel::GetSingletonPtr();\r
171         delete CSettingsManager::GetSingletonPtr();\r
172 }\r
173 \r
174 #ifdef WIN32\r
175 \r
176 // the entry point for any Windows program\r
177 int WINAPI WinMain(HINSTANCE hInst,\r
178                    HINSTANCE hPrevInstance,\r
179                    LPSTR lpCmdLine,\r
180                    int nCmdShow)\r
181 {\r
182   WNDCLASS wc;\r
183 \r
184 \r
185         // register window class\r
186         if (!hPrevInstance)\r
187         {\r
188                 wc.cbClsExtra = 0;\r
189                 wc.cbWndExtra = 0;\r
190                 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);\r
191                 wc.hCursor = LoadCursor(NULL, IDC_ARROW);\r
192                 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);\r
193                 wc.hInstance = hInstance;\r
194                 wc.lpfnWndProc = &WindowProc;\r
195                 wc.lpszClassName = L"MainRollBallWClass";\r
196                 wc.lpszMenuName = L"MainMenu";\r
197                 wc.style = CS_HREDRAW | CS_VREDRAW;\r
198 \r
199                 if (!RegisterClass(&wc)) return 0;\r
200         }\r
201         hInstance = hInst;      \r
202 \r
203         // create main window\r
204         hWnd = CreateWindowEx(0, L"MainRollBallWClass", L"Main Rolling Ball Window", WS_OVERLAPPEDWINDOW, 200, 240,\r
205                         SCREEN_WIDTH+8, SCREEN_HEIGHT+26, NULL, NULL, hInstance, NULL);\r
206 \r
207     ShowWindow(hWnd, nCmdShow);\r
208         UpdateWindow(hWnd);\r
209 \r
210     // set up and initialize Direct3D\r
211         new CApplication();\r
212         CApplication::GetSingleton().Run(NULL, NULL);\r
213         delete CApplication::GetSingletonPtr();\r
214 \r
215         //clean up any remaining unreleased objects\r
216         IMMObject::CollectRemainingObjects(true);\r
217 \r
218         PostMessage(hWnd, WM_DESTROY, 0, 0);\r
219   return 0;\r
220 }\r
221 \r
222 // this is the main message handler for the program\r
223 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
224 {\r
225     switch(message)\r
226     {\r
227         case WM_DESTROY:\r
228             {\r
229                 PostQuitMessage(0);\r
230                 return 0;\r
231             } break;\r
232     }\r
233 \r
234     return DefWindowProc (hWnd, message, wParam, lParam);\r
235 }\r
236 #else // WIN32\r
237 int main(int argc, char *argv[])\r
238 {\r
239   new CApplication();\r
240   CApplication::GetSingleton().Run(argc,argv);\r
241   delete CApplication::GetSingletonPtr();\r
242 \r
243   //clean up any remaining unreleased objects\r
244   IMMObject::CollectRemainingObjects(true);\r
245 \r
246   return 0;\r
247 }\r
248 #endif //WIN32\r
249 \r