1 #include "Playground.h"
\r
3 #include "Engine/engine.h"
\r
4 #include "Engine/VideoUpdate.h"
\r
5 #include "SchemeReader.h"
\r
7 Playground::Playground(CKernel* kernel) : ITask(kernel) { }
\r
9 bool Playground::Start()
\r
11 // init playing field
\r
12 SchemeReader *scheme = new SchemeReader("Data/schemes/BASIC.SCH");
\r
14 CMMPointer<Sprite> tile_sprite = this->getKernel()->getSpriteManager()->getSprite(SPR_TILE);
\r
15 // put in non-destructible blocks
\r
16 for (int col=0; col<PLAYGROUND_COLS; col++)
\r
18 for (int row=0; row<PLAYGROUND_ROWS; row++)
\r
21 switch(scheme->PlayField[row*PLAYGROUND_NUMFIELD_X+col]) {
\r
23 subsprite = SPR_SUB_BRICK;
\r
26 subsprite = SPR_SUB_SOLID;
\r
29 if (subsprite != -1)
\r
30 field[col][row] = new Tile(tile_sprite, subsprite, col, row);
\r
32 field[col][row] = NULL;
\r
36 // put in desctructible blocks with chance 90%
\r
37 for (int i=0; i<PLAYGROUND_COLS; i+=2)
\r
38 for (int j=0; j<PLAYGROUND_ROWS; ++j)
\r
39 if ((double)rand()/RAND_MAX <= 0.9) field[i][j] = new Tile(foreground, 0, i, j);
\r
40 for (int i=1; i<PLAYGROUND_COLS; i+=2)
\r
41 for (int j=0; j<PLAYGROUND_ROWS; j+=2)
\r
42 if ((double)rand()/RAND_MAX <= 0.9) field[i][j] = new Tile(foreground, 0, i, j);
\r
45 CMMPointer<Sprite> player_sprite = this->getKernel()->getSpriteManager()->getSprite(SPR_PLAYER);
\r
46 bomberman = new Bomberman(player_sprite, 20, 66);
\r
47 if (field[0][0] != NULL)
\r
52 if (field[1][0] != NULL)
\r
57 if (field[0][1] != NULL)
\r
63 old_counter = GetTickCount();
\r
67 void Playground::Update()
\r
69 CMMPointer<Sprite> s = this->getKernel()->getSpriteManager()->getSprite(SPR_FIELD);
\r
71 s->blit(0, 0, 1.0, 1.0, 0, 0, COLOUR_RGBA(255, 255, 255, 255));
\r
72 for (int i=0; i<PLAYGROUND_COLS; ++i)
\r
74 for (int j=0; j<PLAYGROUND_ROWS; ++j)
\r
76 if (field[i][j] != NULL) field[i][j]->Draw();
\r
80 bomberman->Update();
\r
81 if (CInputTask::keyDown(SDLK_RIGHT)) this->move_right();
\r
82 if (CInputTask::keyDown(SDLK_LEFT)) this->move_left();
\r
83 if (CInputTask::keyDown(SDLK_UP)) this->move_up();
\r
84 if (CInputTask::keyDown(SDLK_DOWN)) this->move_down();
\r
88 d3dspt->End(); // end sprite drawing
\r
91 RECT rect = {10,10,400,36};
\r
93 DWORD new_counter = GetTickCount();
\r
94 DWORD tmp = new_counter-old_counter;
\r
95 double tmp2 = 1 / (double(tmp) / 1000.0f);
\r
97 _itoa_s(0, buf, 5, 10);
\r
100 //_gcvt_s(buf, 105, tmp2, 4);
\r
101 sprintf(buf, "%2.2f", tmp2);
\r
102 font->DrawTextA(NULL, (char *)&buf, -1, &rect, DT_LEFT, D3DCOLOR_XRGB(255,255,255));
\r
105 RECT rect2 = {210,10,300,36};
\r
106 sprintf(buf, "(%d, %d)", bomberman->getX(), bomberman->getY());
\r
107 font->DrawTextA(NULL, (char *)&buf, -1, &rect2, DT_LEFT, D3DCOLOR_XRGB(255,255,255));
\r
109 //draw bomberman_array position
\r
110 RECT rect3 = {310,10,500,36};
\r
111 sprintf(buf, "(%d, %d) - (%d,%d)", bomberman->getFieldCenterX(), bomberman->getFieldCenterY(), bomberman->getOffsetX(), bomberman->getOffsetY());
\r
112 font->DrawTextA(NULL, (char *)&buf, -1, &rect3, DT_LEFT, D3DCOLOR_XRGB(255,255,255));
\r
115 old_counter = GetTickCount();
\r
118 void Playground::Stop()
\r
120 for (int i=0; i<PLAYGROUND_COLS; ++i)
\r
121 for (int j=0; j<PLAYGROUND_ROWS; ++j)
\r
122 if (field[i][j] != NULL) delete field[i][j];
\r
124 if (bomberman != NULL) delete bomberman;
\r
127 void Playground::move_down()
\r
129 // first check to stay within the playground
\r
130 if ((bomberman->getY() + bomberman->getHeight()) < (PLAYGROUND_BORDER_TOP + FIELD_UNIT_HEIGHT * PLAYGROUND_ROWS))
\r
132 int array_x = bomberman->getFieldCenterX();
\r
133 int array_left = array_x-1;
\r
134 int array_right = array_x+1;
\r
135 int array_y = bomberman->getFieldCenterY();
\r
136 int array_below = array_y+1;
\r
138 if ((array_below <= PLAYGROUND_ROWS) && (field[array_x][array_below] == NULL) &&
\r
139 (bomberman->getOffsetX() == 0))//center of field
\r
141 //bomberman->move_to(array_x, array_below);
\r
142 bomberman->move_to_direction(S);
\r
145 //special cases for down-left :P
\r
146 if ((field[array_x][array_below] == NULL) && (bomberman->getOffsetX() == 10) && (bomberman->getOffsetY()%2 == 1))
\r
148 bomberman->move_to_direction(SW);
\r
151 if ((field[array_x][array_below] == NULL) && (bomberman->getOffsetX() == 12) && (bomberman->getOffsetY() == 0))
\r
153 bomberman->move_to_direction(SW);
\r
157 //directly above (according to getCenterX), offset 0-18, down left
\r
158 if ((field[array_x][array_below] == NULL) &&
\r
159 (bomberman->getOffsetX() >= (FIELD_UNIT_HEIGHT/3)))
\r
161 bomberman->move_to_direction(SWW);
\r
164 if ((field[array_x][array_below] == NULL) &&
\r
165 (bomberman->getOffsetX() < (FIELD_UNIT_HEIGHT/3)))
\r
167 bomberman->move_to_direction(SSW);
\r
170 //offset 20-36 = down left
\r
171 if ((field[array_left][array_below] == NULL) && (field[array_x][array_below] != NULL) &&
\r
172 (bomberman->getOffsetX() >= (FIELD_UNIT_WIDTH/2)) && (bomberman->getOffsetX() < FIELD_UNIT_WIDTH-2))
\r
174 bomberman->move_to_direction(SWW);
\r
177 //offset 4-18 = down right
\r
178 if ((field[array_right][array_below] == NULL) && (field[array_x][array_below] != NULL) &&
\r
179 (bomberman->getOffsetX() < (FIELD_UNIT_WIDTH/2)) && (bomberman->getOffsetX() > 2))
\r
181 bomberman->move_to_direction(SEE);
\r
184 //directly above (according to getCenterX), offset 20-38, down right
\r
185 if ((field[array_x][array_below] == NULL) &&
\r
186 (bomberman->getOffsetX() >= (FIELD_UNIT_WIDTH-FIELD_UNIT_HEIGHT/3)))
\r
188 bomberman->move_to_direction(SEE);
\r
191 if ((field[array_x][array_below] == NULL))
\r
193 bomberman->move_to_direction(SSE);
\r
198 void Playground::move_up()
\r
200 // first check to stay within the playground
\r
201 if (bomberman->getY() > PLAYGROUND_BORDER_TOP)
\r
203 int array_x = bomberman->getFieldCenterX();
\r
204 int array_left = array_x-1;
\r
205 int array_right = array_x+1;
\r
206 int array_y = bomberman->getFieldCenterY();
\r
207 int array_above = array_y-1;
\r
209 if ((array_above == -1) || (field[array_x][array_above] == NULL))
\r
211 bomberman->move_to(array_x, array_above);
\r
214 if ((field[array_left][array_above] == NULL) && (field[array_x][array_above] != NULL) &&
\r
215 (bomberman->getCenterX()-PLAYGROUND_BORDER_LEFT < (array_x*40+20)))//linkerkant van midden
\r
217 bomberman->move_to(array_left, array_above);
\r
220 if ((field[array_right][array_above] == NULL) && (field[array_x][array_above] != NULL) &&
\r
221 (bomberman->getCenterX()-PLAYGROUND_BORDER_LEFT > (array_x*40+20)))//rechts van midden
\r
223 bomberman->move_to(array_right, array_above);
\r
229 void Playground::move_left()
\r
231 // first check to stay within the playground
\r
232 if (bomberman->getX() > PLAYGROUND_BORDER_LEFT)
\r
234 int array_x = bomberman->getFieldCenterX();
\r
235 int array_left = array_x-1;
\r
236 int array_y = bomberman->getFieldCenterY();
\r
237 int array_below = array_y+1;
\r
238 int array_above = array_y-1;
\r
240 if ((array_left == -1) || (field[array_left][array_y] == NULL))
\r
242 bomberman->move_to(array_left, array_y);
\r
245 if ((field[array_left][array_above] == NULL) && (field[array_left][array_y] != NULL) &&
\r
246 (bomberman->getCenterY()-PLAYGROUND_BORDER_TOP < (array_y*36+18)))
\r
248 bomberman->move_to(array_left, array_above);
\r
251 if ((field[array_left][array_below] == NULL) && (field[array_left][array_y] != NULL) &&
\r
252 (bomberman->getCenterY()-PLAYGROUND_BORDER_TOP > (array_y*36+18)))
\r
254 bomberman->move_to(array_left, array_below);
\r
260 void Playground::move_right()
\r
262 // first check to stay within the playground
\r
263 if ((bomberman->getX() + bomberman->getWidth()) < (20 + 40 * PLAYGROUND_COLS))
\r
264 { // i can go right
\r
265 int array_x = bomberman->getFieldCenterX();
\r
266 int array_right = array_x+1;
\r
267 int array_y = bomberman->getFieldCenterY();
\r
268 int array_below = array_y+1;
\r
269 int array_above = array_y-1;
\r
271 if ((array_right < PLAYGROUND_COLS) && (field[array_right][array_y] == NULL))
\r
273 bomberman->move_to(array_right, array_y);
\r
276 if ((field[array_right][array_above] == NULL) && (field[array_right][array_y] != NULL) && (bomberman->getCenterY()-PLAYGROUND_BORDER_TOP < (array_y*36+18)))
\r
278 bomberman->move_to(array_right, array_above);
\r
281 if ((field[array_right][array_below] == NULL) && (field[array_right][array_y] != NULL) && (bomberman->getCenterY()-PLAYGROUND_BORDER_TOP > (array_y*36+18)))
\r
283 bomberman->move_to(array_right, array_below);
\r
289 // =============================================
\r
291 // =============================================
\r
293 Bomberman::Bomberman(const CMMPointer<Sprite> &sprite, int xloc, int yloc)
\r
295 this->sprite = sprite;
\r
300 Bomberman::~Bomberman()
\r
304 void Bomberman::Update()
\r
306 this->sprite->blit(
\r
309 1.0, 1.0, 0, 0, COLOUR_RGBA(255, 255, 255, 255)
\r
313 void Bomberman::move(int xloc, int yloc)
\r
319 int Bomberman::getY()
\r
324 int Bomberman::getX()
\r
329 int Bomberman::getHeight()
\r
334 int Bomberman::getWidth()
\r
339 int Bomberman::getCenterX()
\r
341 return (this->getX()+(FIELD_UNIT_WIDTH/2));
\r
344 int Bomberman::getCenterY()
\r
346 return (this->getY()+(FIELD_UNIT_HEIGHT/2));
\r
349 int Bomberman::getOffsetX()
\r
351 return (this->getX()- PLAYGROUND_BORDER_LEFT) % FIELD_UNIT_WIDTH;
\r
354 int Bomberman::getOffsetY()
\r
356 return (this->getY()- PLAYGROUND_BORDER_TOP) % FIELD_UNIT_HEIGHT;
\r
359 int Bomberman::getFieldCenterX()
\r
361 return (this->getCenterX() - PLAYGROUND_BORDER_LEFT)/FIELD_UNIT_WIDTH;
\r
364 int Bomberman::getFieldCenterY()
\r
366 return (this->getCenterY() - PLAYGROUND_BORDER_TOP)/FIELD_UNIT_HEIGHT;
\r
369 void Bomberman::move_to(int xloc, int yloc)
\r
372 float center_x = (xloc-1)*40+20+20;
\r
373 float center_y = (yloc-1)*36+66+18;
\r
374 float dist_x = center_x - this->x;
\r
375 float dist_y = center_y - this->y;
\r
377 double dist = sqrt(dist_x*dist_x + dist_y*dist_y);
\r
379 int x_move = (xloc*FIELD_UNIT_WIDTH+PLAYGROUND_BORDER_LEFT) - x;
\r
380 int y_move = (yloc*FIELD_UNIT_HEIGHT+PLAYGROUND_BORDER_TOP) - y;
\r
382 if ((x_move == 0) && (y_move > 0)) this->move(0,2);
\r
383 if ((x_move == 0) && (y_move < 0)) this->move(0,-2);
\r
384 if ((y_move == 0) && (x_move > 0)) this->move(2,0);
\r
385 if ((y_move == 0) && (x_move < 0)) this->move(-2,0);
\r
386 if ((x_move < 0) && (y_move < 0)) this->move(-1,-1);
\r
387 if ((x_move < 0) && (y_move > 0)) this->move(-1,1);
\r
388 if ((x_move > 0) && (y_move < 0)) this->move(1,-1);
\r
389 if ((x_move > 0) && (y_move > 0)) this->move(1,1);
\r
392 void Bomberman::move_to_direction(TMoveDirection dir)
\r
396 case N: this->move(0,-2); break;
\r
397 case NNE: this->move(1,-2); break;
\r
398 case NE: this->move(1,-1); break;
\r
399 case NEE: this->move(2,-1); break;
\r
400 case E: this->move(2,0); break;
\r
401 case SEE: this->move(2,1); break;
\r
402 case SE: this->move(1,1); break;
\r
403 case SSE: this->move(1,2); break;
\r
404 case S: this->move(0,2); break;
\r
405 case SSW: this->move(-1,2); break;
\r
406 case SW: this->move(-1,1); break;
\r
407 case SWW: this->move(-2,1); break;
\r
408 case W: this->move(-2,0); break;
\r
409 case NWW: this->move(-2,-1); break;
\r
410 case NW: this->move(-1,-1); break;
\r
411 case NNW: this->move(-1,-2); break;
\r
415 // =============================================
\r
417 // =============================================
\r
419 Tile::Tile(const CMMPointer<Sprite> &sprite, int subsprite, int col, int row)
\r
421 this->sprite = sprite;
\r
424 this->subsprite = subsprite;
\r
432 this->sprite->blit(
\r
433 PLAYGROUND_BORDER_LEFT + this->col * FIELD_UNIT_WIDTH,
\r
434 PLAYGROUND_BORDER_TOP + this->row * FIELD_UNIT_HEIGHT,
\r
435 1.0, 1.0, this->subsprite, 0, COLOUR_RGBA(255, 255, 255, 255)
\r