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