summary refs log tree commit diff stats
path: root/src/components.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/components.cpp')
-rw-r--r--src/components.cpp173
1 files changed, 95 insertions, 78 deletions
diff --git a/src/components.cpp b/src/components.cpp index 369bb9e..4d62a87 100644 --- a/src/components.cpp +++ b/src/components.cpp
@@ -68,7 +68,7 @@ void UserMovementComponent::input(Game& game, Entity& entity, int key, int actio
68 68
69// Physics component 69// Physics component
70 70
71void PhysicsBodyComponent::receive(Game&, Entity&, Message& msg) 71void PhysicsBodyComponent::receive(Game&, Entity&, const Message& msg)
72{ 72{
73 if (msg.type == Message::Type::walkLeft) 73 if (msg.type == Message::Type::walkLeft)
74 { 74 {
@@ -142,7 +142,7 @@ void PlayerSpriteComponent::render(Game&, Entity& entity, Texture& buffer)
142 buffer.blit(sprite, src_rect, dst_rect); 142 buffer.blit(sprite, src_rect, dst_rect);
143} 143}
144 144
145void PlayerSpriteComponent::receive(Game&, Entity&, Message& msg) 145void PlayerSpriteComponent::receive(Game&, Entity&, const Message& msg)
146{ 146{
147 if (msg.type == Message::Type::walkLeft) 147 if (msg.type == Message::Type::walkLeft)
148 { 148 {
@@ -178,7 +178,7 @@ PlayerPhysicsComponent::PlayerPhysicsComponent()
178 accel.second = jump_gravity_short; 178 accel.second = jump_gravity_short;
179} 179}
180 180
181void PlayerPhysicsComponent::receive(Game&, Entity& entity, Message& msg) 181void PlayerPhysicsComponent::receive(Game&, Entity& entity, const Message& msg)
182{ 182{
183 if (msg.type == Message::Type::walkLeft) 183 if (msg.type == Message::Type::walkLeft)
184 { 184 {
@@ -264,7 +264,7 @@ void PlayerPhysicsComponent::tick(Game& game, Entity& entity)
264 264
265// Map rendering 265// Map rendering
266 266
267MapRenderComponent::MapRenderComponent(Map& map) 267MapRenderComponent::MapRenderComponent(const Map& map)
268{ 268{
269 screen.fill(screen.entirety(), 0, 0, 0); 269 screen.fill(screen.entirety(), 0, 0, 0);
270 270
@@ -302,13 +302,13 @@ void MapRenderComponent::render(Game&, Entity&, Texture& buffer)
302 302
303// Map collision 303// Map collision
304 304
305MapCollisionComponent::MapCollisionComponent(Map& map) 305MapCollisionComponent::MapCollisionComponent(const Map& map)
306{ 306{
307 leftMap = map.getLeftMap(); 307 leftMap = map.getLeftMap();
308 rightMap = map.getRightMap(); 308 rightMap = map.getRightMap();
309 309
310 add_collision(-6, 0, GAME_WIDTH, left, (map.getLeftMap() == nullptr) ? 1 : 2); 310 addCollision(-6, 0, GAME_WIDTH, Direction::left, (leftMap == nullptr) ? 1 : 2);
311 add_collision(GAME_WIDTH+6, 0, GAME_WIDTH, right, (map.getRightMap() == nullptr) ? 3 : 2); 311 addCollision(GAME_WIDTH+6, 0, GAME_WIDTH, Direction::right, (rightMap == nullptr) ? 3 : 2);
312 312
313 for (int i=0; i<MAP_WIDTH*(MAP_HEIGHT-1); i++) 313 for (int i=0; i<MAP_WIDTH*(MAP_HEIGHT-1); i++)
314 { 314 {
@@ -318,24 +318,24 @@ MapCollisionComponent::MapCollisionComponent(Map& map)
318 318
319 if ((tile > 0) && (!((tile >= 5) && (tile <= 7)))) 319 if ((tile > 0) && (!((tile >= 5) && (tile <= 7))))
320 { 320 {
321 add_collision(x*TILE_WIDTH, y*TILE_HEIGHT, (y+1)*TILE_HEIGHT, right, 0); 321 addCollision(x*TILE_WIDTH, y*TILE_HEIGHT, (y+1)*TILE_HEIGHT, Direction::right, 0);
322 add_collision((x+1)*TILE_WIDTH, y*TILE_HEIGHT, (y+1)*TILE_HEIGHT, left, 0); 322 addCollision((x+1)*TILE_WIDTH, y*TILE_HEIGHT, (y+1)*TILE_HEIGHT, Direction::left, 0);
323 add_collision(y*TILE_HEIGHT, x*TILE_WIDTH, (x+1)*TILE_WIDTH, down, 0); 323 addCollision(y*TILE_HEIGHT, x*TILE_WIDTH, (x+1)*TILE_WIDTH, Direction::down, 0);
324 add_collision((y+1)*TILE_HEIGHT, x*TILE_WIDTH, (x+1)*TILE_WIDTH, up, 0); 324 addCollision((y+1)*TILE_HEIGHT, x*TILE_WIDTH, (x+1)*TILE_WIDTH, Direction::up, 0);
325 } else if ((tile >= 5) && (tile <= 7)) 325 } else if ((tile >= 5) && (tile <= 7))
326 { 326 {
327 add_collision(y*TILE_HEIGHT, x*TILE_WIDTH, (x+1)*TILE_WIDTH, down, 3); 327 addCollision(y*TILE_HEIGHT, x*TILE_WIDTH, (x+1)*TILE_WIDTH, Direction::down, 4);
328 } 328 }
329 } 329 }
330} 330}
331 331
332void MapCollisionComponent::add_collision(int axis, int lower, int upper, direction_t dir, int type) 332void MapCollisionComponent::addCollision(int axis, int lower, int upper, Direction dir, int type)
333{ 333{
334 std::list<collision_t>::iterator it; 334 std::list<Collision>::iterator it;
335 335
336 switch (dir) 336 switch (dir)
337 { 337 {
338 case up: 338 case Direction::up:
339 it = up_collisions.begin(); 339 it = up_collisions.begin();
340 for (; it!=up_collisions.end(); it++) 340 for (; it!=up_collisions.end(); it++)
341 { 341 {
@@ -345,7 +345,7 @@ void MapCollisionComponent::add_collision(int axis, int lower, int upper, direct
345 up_collisions.insert(it, {axis, lower, upper, type}); 345 up_collisions.insert(it, {axis, lower, upper, type});
346 346
347 break; 347 break;
348 case down: 348 case Direction::down:
349 it = down_collisions.begin(); 349 it = down_collisions.begin();
350 for (; it!=down_collisions.end(); it++) 350 for (; it!=down_collisions.end(); it++)
351 { 351 {
@@ -355,7 +355,7 @@ void MapCollisionComponent::add_collision(int axis, int lower, int upper, direct
355 down_collisions.insert(it, {axis, lower, upper, type}); 355 down_collisions.insert(it, {axis, lower, upper, type});
356 356
357 break; 357 break;
358 case left: 358 case Direction::left:
359 it = left_collisions.begin(); 359 it = left_collisions.begin();
360 for (; it!=left_collisions.end(); it++) 360 for (; it!=left_collisions.end(); it++)
361 { 361 {
@@ -365,7 +365,7 @@ void MapCollisionComponent::add_collision(int axis, int lower, int upper, direct
365 left_collisions.insert(it, {axis, lower, upper, type}); 365 left_collisions.insert(it, {axis, lower, upper, type});
366 366
367 break; 367 break;
368 case right: 368 case Direction::right:
369 it = right_collisions.begin(); 369 it = right_collisions.begin();
370 for (; it!=right_collisions.end(); it++) 370 for (; it!=right_collisions.end(); it++)
371 { 371 {
@@ -395,20 +395,7 @@ void MapCollisionComponent::detectCollision(Game& game, Entity&, Entity& collide
395 if ((fixed_oy+collider.size.second > collision.lower) && (fixed_oy < collision.upper)) 395 if ((fixed_oy+collider.size.second > collision.lower) && (fixed_oy < collision.upper))
396 { 396 {
397 // We have a collision! 397 // We have a collision!
398 if (collision.type == 0) 398 processCollision(game, collider, collision, Direction::left);
399 {
400 collider.position.first = collision.axis;
401
402 Message msg(Message::Type::stopMovingHorizontally);
403 collider.send(game, msg);
404 } else if (collision.type == 1)
405 {
406 collider.position.first = GAME_WIDTH-collider.size.first/2;
407 } else if (collision.type == 2)
408 {
409 collider.position.first = GAME_WIDTH-collider.size.first/2;
410 game.loadMap(*leftMap);
411 }
412 399
413 break; 400 break;
414 } 401 }
@@ -423,26 +410,7 @@ void MapCollisionComponent::detectCollision(Game& game, Entity&, Entity& collide
423 if ((fixed_oy+collider.size.second > collision.lower) && (fixed_oy < collision.upper)) 410 if ((fixed_oy+collider.size.second > collision.lower) && (fixed_oy < collision.upper))
424 { 411 {
425 // We have a collision! 412 // We have a collision!
426 if (collision.type == 0) 413 processCollision(game, collider, collision, Direction::right);
427 {
428 collider.position.first = collision.axis - collider.size.first;
429
430 Message msg(Message::Type::stopMovingHorizontally);
431 collider.send(game, msg);
432 } else if (collision.type == 1)
433 {
434 collider.position.first = -collider.size.first/2;
435 } else if (collision.type == 2)
436 {
437 collider.position.first = -collider.size.first/2;
438 game.loadMap(*rightMap);
439 } else if (collision.type == 3)
440 {
441 collider.position.first = collision.axis - collider.size.first;
442
443 Message msg(Message::Type::walkLeft);
444 collider.send(game, msg);
445 }
446 414
447 break; 415 break;
448 } 416 }
@@ -462,16 +430,7 @@ void MapCollisionComponent::detectCollision(Game& game, Entity&, Entity& collide
462 if ((fixed_x+collider.size.first > collision.lower) && (fixed_x < collision.upper)) 430 if ((fixed_x+collider.size.first > collision.lower) && (fixed_x < collision.upper))
463 { 431 {
464 // We have a collision! 432 // We have a collision!
465 if (collision.type == 0) 433 processCollision(game, collider, collision, Direction::up);
466 {
467 collider.position.second = collision.axis;
468
469 Message msg(Message::Type::stopMovingVertically);
470 collider.send(game, msg);
471 } else if (collision.type == 1)
472 {
473 collider.position.second = GAME_HEIGHT-collider.size.second/2-1;
474 }
475 434
476 break; 435 break;
477 } 436 }
@@ -486,25 +445,83 @@ void MapCollisionComponent::detectCollision(Game& game, Entity&, Entity& collide
486 if ((fixed_x+collider.size.first > collision.lower) && (fixed_x < collision.upper)) 445 if ((fixed_x+collider.size.first > collision.lower) && (fixed_x < collision.upper))
487 { 446 {
488 // We have a collision! 447 // We have a collision!
489 if (collision.type == 0) 448 processCollision(game, collider, collision, Direction::down);
490 {
491 collider.position.second = collision.axis - collider.size.second;
492
493 Message msg(Message::Type::stopMovingVertically);
494 collider.send(game, msg);
495 } else if (collision.type == 1)
496 {
497 collider.position.second = -collider.size.second/2;
498 } else if (collision.type == 3)
499 {
500 Message msg(Message::Type::drop);
501 msg.dropAxis = collision.axis;
502
503 collider.send(game, msg);
504 }
505 449
506 break; 450 break;
507 } 451 }
508 } 452 }
509 } 453 }
510} 454}
455
456void MapCollisionComponent::processCollision(Game& game, Entity& collider, Collision collision, Direction dir)
457{
458 if (collision.type == 0)
459 {
460 if (dir == Direction::left)
461 {
462 collider.position.first = collision.axis;
463
464 Message msg(Message::Type::stopMovingHorizontally);
465 collider.send(game, msg);
466 } else if (dir == Direction::right)
467 {
468 collider.position.first = collision.axis - collider.size.first;
469
470 Message msg(Message::Type::stopMovingHorizontally);
471 collider.send(game, msg);
472 } else if (dir == Direction::up)
473 {
474 collider.position.second = collision.axis;
475
476 Message msg(Message::Type::stopMovingVertically);
477 collider.send(game, msg);
478 } else if (dir == Direction::down)
479 {
480 collider.position.second = collision.axis - collider.size.second;
481
482 Message msg(Message::Type::stopMovingVertically);
483 collider.send(game, msg);
484 }
485 } else if (collision.type == 1)
486 {
487 if (dir == Direction::left)
488 {
489 collider.position.first = GAME_WIDTH-collider.size.first/2;
490 } else if (dir == Direction::right)
491 {
492 collider.position.first = -collider.size.first/2;
493 } else if (dir == Direction::up)
494 {
495 collider.position.second = GAME_HEIGHT-collider.size.second/2-1;
496 } else if (dir == Direction::down)
497 {
498 collider.position.second = -collider.size.second/2;
499 }
500 } else if (collision.type == 2)
501 {
502 if (dir == Direction::left)
503 {
504 collider.position.first = GAME_WIDTH-collider.size.first/2;
505 game.loadMap(*leftMap);
506 } else if (dir == Direction::right)
507 {
508 collider.position.first = -collider.size.first/2;
509 game.loadMap(*rightMap);
510 }
511 } else if (collision.type == 3)
512 {
513 if (dir == Direction::right)
514 {
515 collider.position.first = collision.axis - collider.size.first;
516
517 Message msg(Message::Type::walkLeft);
518 collider.send(game, msg);
519 }
520 } else if (collision.type == 4)
521 {
522 Message msg(Message::Type::drop);
523 msg.dropAxis = collision.axis;
524
525 collider.send(game, msg);
526 }
527}