Advertisement
SilverTES

Component::Jumper

Mar 24th, 2017
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.54 KB | None | 0 0
  1. #ifndef GAMECOMPONENT_H_INCLUDED
  2. #define GAMECOMPONENT_H_INCLUDED
  3.  
  4. #include "MyGame.h"
  5.  
  6. namespace Component
  7. {
  8.  
  9.     #define JUMPER _THIS->get<Component::Jumper>()
  10.     #define _JUMPER get<Component::Jumper>()
  11.     struct Jumper : public Component::Helper<Jumper>
  12.     {
  13.  
  14.         bool _keyJump = false;
  15.  
  16.  
  17.         bool _jump = false;
  18.  
  19.         bool _isJump = false;
  20.         bool _isFall = false;
  21.         bool _isLand = true;
  22.  
  23.         bool _moveL = false;
  24.         bool _moveR = false;
  25.  
  26.         bool _canMoveL = false;
  27.         bool _canMoveR = false;
  28.  
  29.  
  30.         bool _hitU = false;
  31.         bool _hitD = false;
  32.         bool _hitL = false;
  33.         bool _hitR = false;
  34.  
  35.  
  36.         VAR _gravity = 0;
  37.  
  38.         VAR _vy = 0;
  39.         VAR _vx = 0;
  40.         VAR _vyMax = 0;
  41.         VAR _vxMax = 0;
  42.         VAR _dy = 0;
  43.         VAR _dx = 0;
  44.  
  45.         int _posMapX = 0;
  46.         int _posMapY = 0;
  47.  
  48.         int _posMapAbsX = 0;
  49.         int _posMapAbsY = 0;
  50.  
  51.         // 4 corners
  52.  
  53.         VAR _left = 0;
  54.         VAR _top = 0;
  55.         VAR _right = 0;
  56.         VAR _bottom = 0;
  57.  
  58.         int _leftMap = 0;
  59.         int _topMap = 0;
  60.         int _rightMap = 0;
  61.         int _bottomMap = 0;
  62.  
  63.         // Map2D
  64.         Component::TileMap2D* _tileMap2D = nullptr;
  65.  
  66.         Jumper();
  67.         Jumper(VAR gravity);
  68.         Clip* setTileMap(Component::TileMap2D* tileMap2D);
  69.         Clip* setSpeedMax(VAR vxMax, VAR vyMax);
  70.         void doJump();
  71.         void doFall();
  72.         void doGravity();
  73.         void doLand(VAR y);
  74.         void doMove(VAR dx);
  75.         void doFriction(VAR fx);
  76.  
  77.  
  78.         void testCollision();
  79.  
  80.         void update();
  81.         void render();
  82.  
  83.     }__attribute__((packed));
  84.  
  85. }
  86.  
  87. #endif // GAMECOMPONENT_H_INCLUDED
  88.  
  89.  
  90. //---------------------------------------------------------------------------------------------------------
  91.  
  92. #include "gameComponent.h"
  93.  
  94. namespace Component
  95. {
  96.         Jumper::Jumper()
  97.         {
  98.             _type = Component::type("JUMPER", true);
  99.         }
  100.  
  101.         Jumper::Jumper(VAR gravity)
  102.         {
  103.             _type = Component::type("JUMPER", true);
  104.             _gravity = gravity;
  105.         }
  106.  
  107.         Clip* Jumper::setTileMap(Component::TileMap2D* tileMap2D)
  108.         {
  109.             _tileMap2D = tileMap2D;
  110.             return _clip;
  111.         }
  112.  
  113.         Clip* Jumper::setSpeedMax(VAR vxMax, VAR vyMax)
  114.         {
  115.             _vxMax = vxMax;
  116.             _vyMax = vyMax;
  117.             return _clip;
  118.         }
  119.  
  120.         void Jumper::doJump()
  121.         {
  122.             if (!_jump)
  123.             {
  124.                 _jump = true;
  125.                 _isLand = false;
  126.                 _vy = -_vyMax;
  127.                 _dy = _gravity;
  128.             }
  129.  
  130.         }
  131.  
  132.         void Jumper::doFall()
  133.         {
  134.             if (!_isFall)
  135.             {
  136.                 _jump = true;
  137.                 _isLand = false;
  138.                 if (_vy < 0) _vy = 0;
  139.                 _dy = _gravity;
  140.             }
  141.         }
  142.  
  143.         void Jumper::doGravity()
  144.         {
  145.             _vy += _dy;
  146.  
  147.             _isFall = _vy > 0;
  148.             _isJump = _vy < 0;
  149.  
  150.             if (_isJump && _vy >=0) doFall();
  151.             if (_vy > _vyMax) _vy = _vyMax;
  152.         }
  153.  
  154.  
  155.         void Jumper::doLand(VAR y)
  156.         {
  157.             if (!_isLand)
  158.             {
  159.                 _isLand = true;
  160.                 _jump = false;
  161.                 _vy = 0;
  162.                 _dy = 0;
  163.                 _clip->_y = y;
  164.             }
  165.  
  166.         }
  167.  
  168.         void Jumper::doMove(VAR dx)
  169.         {
  170.             //if (!_jump)
  171.             {
  172.                 _dx = dx;
  173.                 _vx += _dx;
  174.  
  175.                 _moveL = _vx<0;
  176.                 _moveR = _vx>0;
  177.  
  178.                 if (_moveL && _vx < -_vxMax) _vx = -_vxMax;
  179.                 if (_moveR && _vx >  _vxMax) _vx =  _vxMax;
  180.             }
  181.         }
  182.  
  183.         void Jumper::doFriction(VAR fx)
  184.         {
  185.             if (!_jump)
  186.             {
  187.                 if (_moveL)
  188.                 {
  189.                     _vx += fx;
  190.                     if (_vx >= 0) _vx = 0;
  191.                 }
  192.                 if (_moveR)
  193.                 {
  194.                     _vx -= fx;
  195.                     if (_vx <= 0) _vx = 0;
  196.                 }
  197.             }
  198.         }
  199.  
  200.         void Jumper::testCollision()
  201.         {
  202.  
  203.             _posMapX = std::floor(_clip->_x/_tileMap2D->_tileW);
  204.             _posMapY = std::floor(_clip->_y/_tileMap2D->_tileH);
  205.  
  206.             // Test Collision 4 Direction , Test 4 Corners
  207.  
  208.             _left   = _clip->_x - _clip->_oX;
  209.             _top    = _clip->_y - _clip->_oY;
  210.  
  211.             _right  = _left + _clip->_rect._w-1; // Important -1 for test the collision of TileMap at Right
  212.             _bottom = _top + _clip->_rect._h-1; // Important -1 for test the collision of TileMap at Bottom
  213.  
  214.             _leftMap   = std::floor(_left/_tileMap2D->_tileW);
  215.             _topMap    = std::floor(_top/_tileMap2D->_tileH);
  216.             _rightMap  = std::floor(_right/_tileMap2D->_tileW);
  217.             _bottomMap = std::floor(_bottom/_tileMap2D->_tileH);
  218.  
  219.             // Test LEFT
  220.             if (_tileMap2D->getTileHit(_leftMap-1, _topMap) || _tileMap2D->getTileHit(_leftMap-1, _bottomMap))
  221.                 if (Collision2D::pointRect(Vec2{_left,_top}, _tileMap2D->getTileRect(_leftMap-1, _topMap, 2+std::abs(_vx)) ) ||
  222.                     Collision2D::pointRect(Vec2{_left,_bottom}, _tileMap2D->getTileRect(_leftMap-1, _bottomMap, 2+std::abs(_vx)) ) )
  223.                 {
  224.                     _hitL = true;
  225.                 }
  226.             // Test RIGHT
  227.             if (_tileMap2D->getTileHit(_rightMap+1, _topMap) || _tileMap2D->getTileHit(_rightMap+1, _bottomMap))
  228.                 if (Collision2D::pointRect(Vec2{_right,_top}, _tileMap2D->getTileRect(_rightMap+1, _topMap, 2+_vx)) ||
  229.                     Collision2D::pointRect(Vec2{_right,_bottom}, _tileMap2D->getTileRect(_rightMap+1, _bottomMap, 2+_vx)) )
  230.                 {
  231.                     _hitR = true;
  232.                 }
  233.             // Test UP
  234.             if (_tileMap2D->getTileHit(_leftMap, _topMap-1) || _tileMap2D->getTileHit(_rightMap, _topMap-1) )
  235.                 if (Collision2D::pointRect(Vec2{_left,_top}, _tileMap2D->getTileRect(_leftMap, _topMap-1,   -_vy)) ||
  236.                     Collision2D::pointRect(Vec2{_right,_top}, _tileMap2D->getTileRect(_rightMap, _topMap-1,  -_vy)))
  237.                 {
  238.                     _hitU = true;
  239.  
  240.                 }
  241.             // Test DOWN
  242.             if (_tileMap2D->getTileHit(_leftMap, _bottomMap+1) || _tileMap2D->getTileHit(_rightMap, _bottomMap+1) )
  243.                 if (Collision2D::pointRect(Vec2{_left,_bottom}, _tileMap2D->getTileRect(_leftMap, _bottomMap+1,  2+_vy)) ||
  244.                     Collision2D::pointRect(Vec2{_right,_bottom}, _tileMap2D->getTileRect(_rightMap, _bottomMap+1,  2+_vy)))
  245.                 {
  246.                     _hitD = true;
  247.                 }
  248.  
  249.             if (!_tileMap2D->getTileHit(_leftMap, _bottomMap+1) && !_tileMap2D->getTileHit(_rightMap, _bottomMap+1) )
  250.             {
  251.                 //printf("< VOID >");
  252.                 if (_isLand)
  253.                 {
  254.                     doFall();
  255.                 }
  256.             }
  257.         }
  258.  
  259.         void Jumper::update()
  260.         {
  261.  
  262.             // Reset All collisions !
  263.             _hitU = false;
  264.             _hitD = false;
  265.             _hitL = false;
  266.             _hitR = false;
  267.  
  268.             _canMoveL = true;
  269.             _canMoveR = true;
  270.  
  271.             testCollision();
  272.  
  273.             if (_hitL)
  274.             {
  275.                 //printf("< L >");
  276.                 _canMoveL = false;
  277.                 if (_moveL) _vx = 0;
  278.             }
  279.             if (_hitR)
  280.             {
  281.                 //printf("< R >");
  282.                 _canMoveR = false;
  283.                 if (_moveR) _vx = 0;
  284.             }
  285.  
  286.             if (_hitU)
  287.             {
  288.                 //printf("< U >");
  289.                 //_clip->_y = (_topMap-1) * _tileMap2D->_tileH + _tileMap2D->_tileH;
  290.                 if (_isJump)
  291.                 {
  292.                     printf("< U > : %i, %i \n", _posMapX, _topMap-1);
  293.                     doFall();
  294.                 }
  295.             }
  296.  
  297.             if (_hitD)
  298.             {
  299.                 if (_isFall)
  300.                 {
  301.                     printf("< D > : %i, %i \n", _posMapX, _bottomMap+1);
  302.                     doLand(_tileMap2D->getTileRect(_leftMap, _bottomMap+1,4)._y-4);
  303.                 }
  304.                     //doLand(_clip->_y);
  305.             }
  306.  
  307.             doGravity();
  308.  
  309.             // Move the Jumper !
  310.             _clip->_x += _vx;
  311.             _clip->_y += _vy;
  312.  
  313.         }
  314.         void Jumper::render()
  315.         {
  316.  
  317.             if (Clip::_showClipInfo)
  318.             {
  319.                 Draw::rect(_tileMap2D->getTileRect(_posMapX-1,_posMapY)+Rect{_clip->_parent->absX(),_clip->_parent->absY(),0,0},al_map_rgb(50,150,40),0);
  320.                 Draw::rect(_tileMap2D->getTileRect(_posMapX+1,_posMapY)+Rect{_clip->_parent->absX(),_clip->_parent->absY(),0,0},al_map_rgb(50,40,150),0);
  321.                 Draw::rect(_tileMap2D->getTileRect(_posMapX,_posMapY-1)+Rect{_clip->_parent->absX(),_clip->_parent->absY(),0,0},al_map_rgb(150,150,40),0);
  322.                 Draw::rect(_tileMap2D->getTileRect(_posMapX,_posMapY+1)+Rect{_clip->_parent->absX(),_clip->_parent->absY(),0,0},al_map_rgb(150,40,150),0);
  323.  
  324.                 Draw::rect(_tileMap2D->getTileRect(_posMapX,_posMapY)+Rect{_clip->_parent->absX(),_clip->_parent->absY(),0,0},al_map_rgb(250,0,40),0);
  325.  
  326.                 Draw::rect(_tileMap2D->getTileRect(_posMapX,_posMapY,24*2)+Rect{_clip->_parent->absX(),_clip->_parent->absY(),0,0},al_map_rgb(250,0,40),0);
  327.             }
  328.  
  329.  
  330.         }
  331.  
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement