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