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 / virtobj.cpp < prev    next >
C/C++ Source or Header  |  2009-07-20  |  5KB  |  213 lines

  1. /*
  2.  * atanks - obliterate each other with oversize weapons
  3.  * Copyright (C) 2003  Thomas Hudson
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  * */
  19.  
  20. #include "virtobj.h"
  21. #include "environment.h"
  22.  
  23.  
  24.  
  25. VIRTUAL_OBJECT::VIRTUAL_OBJECT()
  26.     {
  27.       _bitmap = NULL;
  28.       _env = NULL;
  29.       _global = NULL;
  30.       x = 0;
  31.       y = 0;
  32.       xv = yv = 0;
  33.       angle = 0;
  34.       destroy = FALSE;
  35.       age = 0;
  36.       maxAge = -1;
  37.       physics = 0;
  38.       _current.x = 0;
  39.       _current.y = 0;
  40.       _current.w = 0;
  41.       _current.h = 0;
  42.       _old.x = 0;
  43.       _old.y = 0;
  44.       _old.w = 0;
  45.       _old.h = 0;
  46.     }
  47.  
  48.  
  49.  
  50.  
  51. VIRTUAL_OBJECT::~VIRTUAL_OBJECT ()
  52.       {
  53.         _bitmap = NULL;
  54.         // player, _env and _global must be handled by descendants!
  55.       }
  56.  
  57.  
  58.  
  59. /** @brief update
  60.   *
  61.   * This method triggers an update of the canvas (aka drawing area) with the dimensions and position
  62.   * of this object.
  63.   */
  64. void VIRTUAL_OBJECT::update()
  65. {
  66.   if (_requireUpdate)
  67.     {
  68.       int changed;
  69.  
  70.       if (_current.w)
  71.         {
  72.           if (_align == LEFT)
  73.             {
  74.               _env->make_update (_current.x, _current.y,
  75.                                  _current.w, _current.h);
  76.             }
  77.           else if (_align == RIGHT)
  78.             {
  79.               _env->make_update (_current.x - _current.w,
  80.                                  _current.y - _current.h,
  81.                                  _current.w, _current.h);
  82.             }
  83.           else
  84.             {
  85.               _env->make_update (_current.x - (_current.w / 2),
  86.                                  _current.y - (_current.h / 2),
  87.                                  _current.w + 2, _current.h + 2);
  88.             }
  89.         }
  90.  
  91.       if ((_old.x == _current.x) &&
  92.           (_old.y == _current.y) &&
  93.           (_old.w == _current.w) &&
  94.           (_old.h == _current.h))
  95.         changed = FALSE;
  96.       else
  97.         changed = TRUE;
  98.  
  99.       if (changed)
  100.         {
  101.           if (_old.w)
  102.             {
  103.               if (_align == LEFT)
  104.                 {
  105.                   _env->make_update (_old.x, _old.y,
  106.                                      _old.w, _old.h);
  107.                 }
  108.               else if (_align == RIGHT)
  109.                 {
  110.                   _env->make_update (_old.x - _old.w,
  111.                                      _old.y - _old.h,
  112.                                      _old.w, _old.h);
  113.                 }
  114.               else
  115.                 {
  116.                   _env->make_update (_old.x - (_old.w / 2),
  117.                                      _old.y - (_old.h / 2),
  118.                                      _old.w + 2, _old.h + 2);
  119.                 }
  120.             }
  121.           _old.x = _current.x;
  122.           _old.y = _current.y;
  123.           _old.w = _current.w;
  124.           _old.h = _current.h;
  125.         }
  126.       _requireUpdate = FALSE;
  127.     }
  128. }
  129.  
  130.  
  131. void VIRTUAL_OBJECT::initialise ()
  132.     {
  133.       age = 0;
  134.       maxAge = -1;
  135.       x = 0;
  136.       y = 0;
  137.       xv = 0;
  138.       yv = 0;
  139.       destroy = false;
  140.       _current.x = 0;
  141.       _current.y = 0;
  142.       _current.w = 0;
  143.       _current.h = 0;
  144.       _old.x = 0;
  145.       _old.y = 0;
  146.       _old.w = 0;
  147.       _old.h = 0;
  148.     }
  149.  
  150.  
  151.  
  152. int VIRTUAL_OBJECT::applyPhysics ()
  153.     {
  154.       x += xv;
  155.       y += yv;
  156.  
  157.       return (0);
  158.     }
  159.  
  160.  
  161.  
  162. void VIRTUAL_OBJECT::draw (BITMAP *dest)
  163.     {
  164.       if (!destroy)
  165.         {
  166.           rotate_sprite (dest, _bitmap,
  167.                          (int)x - (_bitmap->w / 2),
  168.                          (int)y - (_bitmap->h / 2),
  169.                          itofix (angle));
  170.           if (angle == 0)
  171.             {
  172.               setUpdateArea ((int)x - (_bitmap->w / 2 + 1),
  173.                              (int)y - (_bitmap->h / 2 + 1),
  174.                              _bitmap->w + 2, _bitmap->h + 2);
  175.             }
  176.           else
  177.             {
  178.               int length = MAX (_bitmap->w, _bitmap->h);
  179.               length += MIN (_bitmap->w, _bitmap->h) / 2;
  180.               setUpdateArea ((int)x - (length/2),
  181.                              (int)y - (length/2),
  182.                              length, length);
  183.             }
  184.           requireUpdate ();
  185.         }
  186.     }
  187.  
  188.  
  189.  
  190.  
  191. void VIRTUAL_OBJECT::setUpdateArea (int left, int top, int width, int height)
  192.     {
  193.       _current.x = left;
  194.       _current.y = top;
  195.       _current.w = width;
  196.       _current.h = height;
  197.     }
  198.  
  199.  
  200.  
  201. void VIRTUAL_OBJECT::addUpdateArea (int left, int top, int width, int height)
  202.     {
  203.       if (left < _current.x)
  204.         _current.x = left;
  205.       if (top < _current.y)
  206.         _current.y = top;
  207.       if (left + width > _current.x + _current.w)
  208.         _current.w = width;
  209.       if (top + height > _current.y + _current.h)
  210.         _current.h = height;
  211.     }
  212.  
  213.