home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Atomic_Tanks / Atomic-Tanks-5.1.exe / src / floattext.cpp < prev    next >
C/C++ Source or Header  |  2010-04-06  |  9KB  |  274 lines

  1. #include "floattext.h"
  2.  
  3. FLOATTEXT::FLOATTEXT (GLOBALDATA *global, ENVIRONMENT *env, char *text, int xpos, int ypos, int color, alignType alignment)
  4. {
  5.       initialise ();
  6.       setEnvironment (env);
  7.       _text = NULL;
  8.       x = (double)xpos;
  9.       y = (double)ypos;
  10.       _current.x = (int)x;
  11.       _current.y = (int)y;
  12.       _current.w = 0;
  13.       _current.h = 0;
  14.       set_pos (xpos, ypos);
  15.       if (text)
  16.         set_text (text);
  17.       else
  18.         set_text( "");
  19.       set_color (color);
  20.       _align = alignment;
  21.       _global = global;
  22.       _halfColor = color;
  23.       sway = NO_SWAY;
  24.       original_x = xpos;
  25.       delta_x = 0;
  26. }
  27.  
  28.  
  29. FLOATTEXT::~FLOATTEXT()
  30. {
  31.       if (_env)
  32.         {
  33.           /* To be sure to really remove the full text (might fail due to font differences),
  34.              we "enlarge" the text by 25%: */
  35.           if (_current.w)
  36.             {
  37.               _current.x -= (int)((double)_current.w * 1.125);
  38.               _current.w  = (int)((double)_current.w * 1.250);
  39.             }
  40.           if (_current.h)
  41.             {
  42.               _current.y -= (int)((double)_current.h * 1.125);
  43.               _current.h  = (int)((double)_current.h * 1.250);
  44.             }
  45.  
  46.           switch (_align)
  47.             {
  48.             case LEFT:
  49.               _env->make_bgupdate (_current.x, _current.y, _current.w, _current.h);
  50.               _env->make_bgupdate (_old.x, _old.y, _old.w, _old.h);
  51.               break;
  52.             case RIGHT:
  53.               _env->make_bgupdate (_current.x - _current.w, _current.y - _current.h, _current.w, _current.h);
  54.               _env->make_bgupdate (_old.x - _old.w, _old.y - _old.h, _old.w, _old.h);
  55.               break;
  56.             case CENTRE:
  57.               _env->make_bgupdate (_current.x - (_current.w / 2), _current.y - (_current.h / 2), _current.w + 2, _current.h + 2);
  58.               _env->make_bgupdate (_old.x - (_old.w / 2), _old.y - (_old.h / 2), _old.w + 2, _old.h + 2);
  59.               break;
  60.             default:
  61.               _env->make_bgupdate (_current.x - _current.w, _current.y - _current.h, 2 * _current.w, 2 * _current.h);
  62.               _env->make_bgupdate (_old.x - _old.w, _old.y - _old.h, 2 * _old.w, 2 * _old.h);
  63.             }
  64.           _env->removeObject (this);
  65.         }
  66.       _global = NULL;
  67.       _env    = NULL;
  68.       if (_text)
  69.       {
  70.          free(_text);
  71.          _text = NULL;
  72.       }
  73. }
  74.  
  75.  
  76. int FLOATTEXT::applyPhysics()
  77. {
  78.       VIRTUAL_OBJECT::applyPhysics ();
  79.  
  80.       if ( (!delta_x) && (sway) )
  81.          delta_x = -1;
  82.  
  83.       x += delta_x;
  84.       if (x < original_x - sway)
  85.          delta_x = -delta_x;
  86.       else if (x > original_x + sway)
  87.          delta_x = -delta_x;
  88.  
  89.       set_pos ((int)x, (int)y);
  90.  
  91.       age++;
  92.       if ( (maxAge != -1) && (age > maxAge) )
  93.         destroy = TRUE;
  94.  
  95.       return (0);
  96. }
  97.  
  98.  
  99. void FLOATTEXT::setEnvironment(ENVIRONMENT *env)
  100. {
  101.       if (!_env || (_env != env))
  102.         {
  103.           _env = env;
  104.           _index = _env->addObject (this);
  105.         }
  106. }     
  107.  
  108.  
  109.  
  110. void FLOATTEXT::draw(BITMAP *dest)
  111.   {
  112.       if (_current.w)
  113.         {
  114.           double dFrontFade        =    1.0;
  115.           double dShadFade        = 0.75;
  116.           int iFrontCol                =    _color;
  117.           int iShadCol                =    _halfColor;
  118.           int iBackCol                =    _color;
  119.  
  120.           // get Background color:
  121.           if (  (_env->dShadowedText > 0.0) || (_env->dFadingText > 0.0)  )
  122.           {
  123.             switch (_align)
  124.               {
  125.               case LEFT:
  126.                 iBackCol = _env->getAvgBgColor(    _current.x,                                _current.y,
  127.                                                 _current.x + _current.w,    _current.y + _current.h,
  128.                                                 xv,                                                yv);
  129.                 break;
  130.               case RIGHT:
  131.                 iBackCol = _env->getAvgBgColor(    _current.x - _current.w,    _current.y - _current.h,
  132.                                                 _current.x,                                _current.y,
  133.                                                 xv,                                                yv);
  134.                 break;
  135.               case CENTRE:
  136.                 iBackCol = _env->getAvgBgColor(    _current.x - (_current.w / 2),        _current.y - (_current.h / 2),
  137.                                                 _current.x + (_current.w / 2) + 2,_current.y + (_current.h / 2) + 2,
  138.                                                 xv,                                                                yv);
  139.                 break;
  140.               }
  141.           }
  142.           if ((maxAge > 0) && (age >= (maxAge / 2)) && (_env->dFadingText > 0.0))
  143.             {
  144.               double dCalcAge = (double)age - (double)(maxAge / 2);
  145.               double dCalcMax = (double)(maxAge / 2);
  146.               dFrontFade    = 1.0 - (dCalcAge / dCalcMax);
  147.               dShadFade        =    0.75 - (0.75 * (dCalcAge / dCalcMax));
  148.               if (dFrontFade    < 0.0) dFrontFade        = 0.0;
  149.               if (dFrontFade    > 1.0) dFrontFade        = 1.0;
  150.               if (dShadFade < 0.0) dShadFade    = 0.0;
  151.               if (dShadFade >    1.0) dShadFade    = 1.0;
  152.               iFrontCol = newmakecol((getr(iFrontCol) * dFrontFade) + (getr(iBackCol) * (1.0 - dFrontFade)),
  153.                                   (getg(iFrontCol) * dFrontFade) + (getg(iBackCol) * (1.0 - dFrontFade)),
  154.                                   (getb(iFrontCol) * dFrontFade) + (getb(iBackCol) * (1.0 - dFrontFade)));
  155.             }
  156.           if (_env->dShadowedText > 0.0)
  157.             iShadCol = newmakecol(    (getr(iShadCol) * dShadFade) + (getr(iBackCol) * (1.0 - dShadFade)),
  158.                                 (getg(iShadCol) * dShadFade) + (getg(iBackCol) * (1.0 - dShadFade)),
  159.                                 (getb(iShadCol) * dShadFade) + (getb(iBackCol) * (1.0 - dShadFade)));
  160.           if (_align == LEFT)
  161.             {
  162.               if (_env->dShadowedText > 0.0)
  163.                 textout_ex (dest, font, _text,
  164.                             _current.x + 1, _current.y + 1, iShadCol, -1);
  165.               textout_ex (dest, font, _text,
  166.                           _current.x, _current.y, iFrontCol, -1);
  167.             }
  168.           else if (_align == RIGHT)
  169.             {
  170.               if (_env->dShadowedText > 0.0)
  171.                 textout_ex (dest, font, _text,
  172.                             _current.x - _current.w + 1,
  173.                             _current.y - _current.h + 1, iShadCol, -1);
  174.               textout_ex (dest, font, _text,
  175.                           _current.x - _current.w,
  176.                           _current.y - _current.h, iFrontCol, -1);
  177.             }
  178.           else
  179.             {
  180.               if (_env->dShadowedText > 0.0)
  181.                 textout_centre_ex (dest, font, _text,
  182.                                    _current.x + 1, _current.y + 1, iShadCol, -1);
  183.               textout_centre_ex (dest, font, _text,
  184.                                  _current.x, _current.y, iFrontCol, -1);
  185.             }
  186.         }
  187. }
  188.  
  189.  
  190. /*
  191. This is too limiting, creating a more flexible text setting function below.
  192. -- Jesse
  193. void FLOATTEXT::set_text(char *text)
  194.  {
  195.       strncpy (_text, text, 80);
  196.       if (strlen (text) > 0)
  197.         {
  198.           _current.w = text_length (font, _text) + 3;
  199.           _text[79] = '\0';
  200.         }
  201.       else
  202.         _current.w = 0;
  203.       _current.h = text_height (font) + 15;
  204. }
  205. */
  206.  
  207. // Returns TRUE on success or FALSE on failure.
  208. int FLOATTEXT::set_text(char *text)
  209. {
  210.    int my_length = strlen(text);
  211.  
  212.    // clean up old text
  213.    if (_text)
  214.       free(_text);
  215.     
  216.    _text = (char *) calloc( my_length + 1, sizeof(char));
  217.    if (! _text)
  218.       return FALSE;
  219.  
  220.    strcpy(_text, text);
  221.    if (my_length)
  222.         _current.w = text_length(font, _text) + 3;
  223.    else
  224.        _current.w = 0;
  225.    _current.h = text_height(font) + 15;
  226.    return TRUE;
  227. }
  228.  
  229.  
  230. void FLOATTEXT::set_color(int color)
  231. {
  232.       int red        =    getr(color);
  233.       int green    =    getg(color);
  234.       int blue    =    getb(color);
  235.       int iAverage = (red + green + blue) / 3;
  236.  
  237.       _color = color;
  238.  
  239.       if (!(red & 0xc0) && !(green & 0xc0) && !(blue & 0xc0))
  240.         _halfColor = makecol(red | 0x80, green | 0x80, blue | 0x80); // Color is too dark, shadow should be bright
  241.       else
  242.         _halfColor = makecol(    red        > iAverage?(red        / 4):(red        / 6),
  243.                               green    > iAverage?(green    / 4):(green    / 6),
  244.                               blue    > iAverage?(blue    / 4):(blue    / 6));
  245. }
  246.  
  247.  
  248. void FLOATTEXT::newRound()
  249. {
  250.    age = maxAge + 1;
  251. }
  252.  
  253. void FLOATTEXT::set_pos(int x, int y)
  254. {
  255.    _current.x = x;
  256.    _current.y = y;
  257. }
  258.  
  259.  
  260.  
  261. void FLOATTEXT::set_speed(double x_speed, double y_speed)
  262. {
  263.      double mix_it_up;       // avoid over-lapping text
  264.  
  265.      mix_it_up = rand() % SPEED_RANGE;      // (0-5)
  266.      mix_it_up -= 3.0;                      // -3 to +2
  267.      mix_it_up /= 10.0;                     // -0.3 to + 0.2
  268.      xv = x_speed;
  269.      yv = y_speed + mix_it_up;
  270.      if ( (yv == 0.0) && (y_speed < 0.0) )
  271.         yv = -0.1;       // avoid text that does not move
  272. }
  273.  
  274.