* Add Tile0 sprite.
[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", 640, 480},\r
19         {SPR_TILE, "Data/Tiles0.png", 40, 36},\r
20         {SPR_NONE, NULL, 0, 0}\r
21 };\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         CSpriteManager *sm = new CSpriteManager(videoTask->getGraphics(), defaultSprites);\r
166         CKernel::GetSingleton().setSpriteManager(sm);\r
167 \r
168         Playground game(&CKernel::GetSingleton());\r
169         game.priority=100;\r
170         CKernel::GetSingleton().AddTask(CMMPointer<ITask>(&game));\r
171 \r
172 \r
173         //set up the profiler with an output handler\r
174         CProfileLogHandler profileLogHandler;\r
175         CProfileSample::outputHandler=&profileLogHandler;\r
176 \r
177         //main game loop\r
178         CKernel::GetSingleton().Execute();\r
179         \r
180         //clean up singletons\r
181         delete CKernel::GetSingletonPtr();\r
182         delete CSettingsManager::GetSingletonPtr();\r
183 }\r
184 \r
185 #ifdef WIN32\r
186 \r
187 // the entry point for any Windows program\r
188 int WINAPI WinMain(HINSTANCE hInst,\r
189                    HINSTANCE hPrevInstance,\r
190                    LPSTR lpCmdLine,\r
191                    int nCmdShow)\r
192 {\r
193   WNDCLASS wc;\r
194 \r
195 \r
196         // register window class\r
197         if (!hPrevInstance)\r
198         {\r
199                 wc.cbClsExtra = 0;\r
200                 wc.cbWndExtra = 0;\r
201                 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);\r
202                 wc.hCursor = LoadCursor(NULL, IDC_ARROW);\r
203                 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);\r
204                 wc.hInstance = hInstance;\r
205                 wc.lpfnWndProc = &WindowProc;\r
206                 wc.lpszClassName = L"MainRollBallWClass";\r
207                 wc.lpszMenuName = L"MainMenu";\r
208                 wc.style = CS_HREDRAW | CS_VREDRAW;\r
209 \r
210                 if (!RegisterClass(&wc)) return 0;\r
211         }\r
212         hInstance = hInst;      \r
213 \r
214         // create main window\r
215         hWnd = CreateWindowEx(0, L"MainRollBallWClass", L"Main Rolling Ball Window", WS_OVERLAPPEDWINDOW, 200, 240,\r
216                         SCREEN_WIDTH+8, SCREEN_HEIGHT+26, NULL, NULL, hInstance, NULL);\r
217 \r
218     ShowWindow(hWnd, nCmdShow);\r
219         UpdateWindow(hWnd);\r
220 \r
221     // set up and initialize Direct3D\r
222         new CApplication();\r
223         CApplication::GetSingleton().Run(NULL, NULL);\r
224         delete CApplication::GetSingletonPtr();\r
225 \r
226         //clean up any remaining unreleased objects\r
227         IMMObject::CollectRemainingObjects(true);\r
228 \r
229         PostMessage(hWnd, WM_DESTROY, 0, 0);\r
230   return 0;\r
231 }\r
232 \r
233 // this is the main message handler for the program\r
234 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
235 {\r
236     switch(message)\r
237     {\r
238         case WM_DESTROY:\r
239             {\r
240                 PostQuitMessage(0);\r
241                 return 0;\r
242             } break;\r
243     }\r
244 \r
245     return DefWindowProc (hWnd, message, wParam, lParam);\r
246 }\r
247 #else // WIN32\r
248 int main(int argc, char *argv[])\r
249 {\r
250   new CApplication();\r
251   CApplication::GetSingleton().Run(argc,argv);\r
252   delete CApplication::GetSingletonPtr();\r
253 \r
254   //clean up any remaining unreleased objects\r
255   IMMObject::CollectRemainingObjects(true);\r
256 \r
257   return 0;\r
258 }\r
259 #endif //WIN32\r
260 \r