Example #1
0
void Walker::setPathWay(PathWay &pathWay)
{
   _pathWay = pathWay;
   _pathWay.begin();

   onMidTile();
}
Example #2
0
void Walker::setPathWay( const PathWay &pathWay)
{
   _d->pathWay = pathWay;
   _d->pathWay.begin();

   onMidTile();
}
Example #3
0
void Walker::walk()
{
   if (D_NONE == _action._direction )
   {
      // nothing to do
      return;
   }

   Tile& tile = Scenario::instance().getCity().getTilemap().at( getIJ() );
    
   switch (_action._direction)
   {
   case D_NORTH:
   case D_SOUTH:
      _remainMoveJ += _d->getSpeed();
      break;
   case D_EAST:
   case D_WEST:
      _remainMoveI += _d->getSpeed();
      break;
   case D_NORTH_EAST:
   case D_SOUTH_WEST:
   case D_SOUTH_EAST:
   case D_NORTH_WEST:
      _remainMoveI += _d->getSpeed() * 0.7f;
      _remainMoveJ += _d->getSpeed() * 0.7f ;
      break;
   default:
      THROW("Invalid move direction: " << _action._direction);
      break;
   }
   

   bool newTile = false;
   bool midTile = false;
   int amountI = int(_remainMoveI);
   int amountJ = int(_remainMoveJ);
   _remainMoveI -= amountI;
   _remainMoveJ -= amountJ;

   // std::cout << "walker step, amount :" << amount << std::endl;
   while (amountI+amountJ > 0)
   {
      switch (_action._direction)
      {
      case D_NORTH:
         inc(_sj, _d->pos.rj(), amountJ, _d->midTile.getJ(), newTile, midTile);
         break;
      case D_NORTH_EAST:
         inc(_sj, _d->pos.rj(), amountJ, _d->midTile.getJ(), newTile, midTile);
         inc(_si, _d->pos.ri(), amountI, _d->midTile.getI(), newTile, midTile);
         break;
      case D_EAST:
         inc(_si, _d->pos.ri(), amountI, _d->midTile.getI(), newTile, midTile);
         break;
      case D_SOUTH_EAST:
         dec(_sj, _d->pos.rj(), amountJ, _d->midTile.getJ(), newTile, midTile);
         inc(_si, _d->pos.ri(), amountI, _d->midTile.getI(), newTile, midTile);
         break;
      case D_SOUTH:
         dec(_sj, _d->pos.rj(), amountJ, _d->midTile.getJ(), newTile, midTile);
         break;
      case D_SOUTH_WEST:
         dec(_sj, _d->pos.rj(), amountJ, _d->midTile.getJ(), newTile, midTile);
         dec(_si, _d->pos.ri(), amountI, _d->midTile.getI(), newTile, midTile);
         break;
      case D_WEST:
         dec(_si, _d->pos.ri(), amountI, _d->midTile.getI(), newTile, midTile);
         break;
      case D_NORTH_WEST:
         inc(_sj, _d->pos.rj(), amountJ, _d->midTile.getJ(), newTile, midTile);
         dec(_si, _d->pos.ri(), amountI, _d->midTile.getI(), newTile, midTile);
         break;
      default:
         THROW("Invalid move direction: " << _action._direction);
         break;
      }

      if (newTile)
      {
         // walker is now on a new tile!
         onNewTile();
      }

      if (midTile)
      {
         // walker is now on the middle of the tile!
         onMidTile();
      }

      // if (midTile) std::cout << "walker mid tile" << std::endl;
      // if (newTile) std::cout << "walker new tile" << std::endl;
      // if (amount != 0) std::cout << "walker remaining step :" << amount << std::endl;
   }

   _ii = _d->pos.getI()*15+_si;
   _jj = _d->pos.getJ()*15+_sj;
}
Example #4
0
void Walker::walk()
{
   if (D_NONE == _d->action.direction )
   {
      // nothing to do
      return;
   }

   Tile& tile = _d->city->getTilemap().at( getIJ() );
    
   switch (_d->action.direction)
   {
   case D_NORTH:
   case D_SOUTH:
      _d->remainMove += PointF( 0, _d->getSpeed() );
   break;

   case D_EAST:
   case D_WEST:
      _d->remainMove += PointF( _d->getSpeed(), 0 );
   break;

   case D_NORTH_EAST:
   case D_SOUTH_WEST:
   case D_SOUTH_EAST:
   case D_NORTH_WEST:
      _d->remainMove += PointF( _d->getSpeed() * 0.7f, _d->getSpeed() * 0.7f );
   break;

   default:
      StringHelper::debug( 0xff, "Invalid move direction: %d", _d->action.direction );
      _d->action.direction = D_NONE;
   break;
   }
   

   bool newTile = false;
   bool midTile = false;
   int amountI = int(_d->remainMove.getX());
   int amountJ = int(_d->remainMove.getY());
   _d->remainMove -= Point( amountI, amountJ ).toPointF();

   // std::cout << "walker step, amount :" << amount << std::endl;
   int tmpX = _d->tileOffset.getX();
   int tmpY = _d->tileOffset.getY();
   int tmpJ = _d->pos.getJ();
   int tmpI = _d->pos.getI();
   while (amountI+amountJ > 0)
   {
      switch (_d->action.direction)
      {
      case D_NORTH:
         inc(tmpY, tmpJ, amountJ, _d->midTilePos.getY(), newTile, midTile);
         break;
      case D_NORTH_EAST:
         inc(tmpY, tmpJ, amountJ, _d->midTilePos.getY(), newTile, midTile);
         inc(tmpX, tmpI, amountI, _d->midTilePos.getX(), newTile, midTile);
         break;
      case D_EAST:
         inc(tmpX, tmpI, amountI, _d->midTilePos.getX(), newTile, midTile);
         break;
      case D_SOUTH_EAST:
         dec(tmpY, tmpJ, amountJ, _d->midTilePos.getY(), newTile, midTile);
         inc(tmpX, tmpI, amountI, _d->midTilePos.getX(), newTile, midTile);
         break;
      case D_SOUTH:
         dec(tmpY, tmpJ, amountJ, _d->midTilePos.getY(), newTile, midTile);
         break;
      case D_SOUTH_WEST:
         dec(tmpY, tmpJ, amountJ, _d->midTilePos.getY(), newTile, midTile);
         dec(tmpX, tmpI, amountI, _d->midTilePos.getX(), newTile, midTile);
         break;
      case D_WEST:
         dec(tmpX, tmpI, amountI, _d->midTilePos.getX(), newTile, midTile);
         break;
      case D_NORTH_WEST:
         inc(tmpY, tmpJ, amountJ, _d->midTilePos.getY(), newTile, midTile);
         dec(tmpX, tmpI, amountI, _d->midTilePos.getX(), newTile, midTile);
         break;
      default:
         StringHelper::debug( 0xff, "Invalid move direction: %d", _d->action.direction);
         _d->action.direction = D_NONE;
      break;
      }

      _d->tileOffset = Point( tmpX, tmpY );
      _d->pos = TilePos( tmpI, tmpJ );

      if (newTile)
      {
         // walker is now on a new tile!
         onNewTile();
      }

      if (midTile)
      {
         // walker is now on the middle of the tile!
         onMidTile();
      }

      // if (midTile) std::cout << "walker mid tile" << std::endl;
      // if (newTile) std::cout << "walker new tile" << std::endl;
      // if (amount != 0) std::cout << "walker remaining step :" << amount << std::endl;
   }

   Point overlayOffset = tile.getOverlay().isValid()
                              ? tile.getOverlay()->getOffset( _d->tileOffset )
                              : Point( 0, 0 );

   _d->posOnMap = Point( _d->pos.getI(), _d->pos.getJ() )*15 + _d->tileOffset + overlayOffset;
}
Example #5
0
void Walker::walk()
{
   if (_action._direction == D_NONE)
   {
      // nothing to do
      return;
   }
   _animIndex = (_animIndex+1) % 12;
   int amount = _speed;  // amount of movement

   bool newTile = false;
   bool midTile = false;

   // std::cout << "walker step, amount :" << amount << std::endl;
   while (amount > 0)
   {
      switch (_action._direction)
      {
      case D_NORTH:
         inc(_sj, _j, amount, _midTileJ, newTile, midTile);
         break;
      case D_NORTH_EAST:
         inc(_sj, _j, amount, _midTileJ, newTile, midTile);
         inc(_si, _i, amount, _midTileI, newTile, midTile);
         break;
      case D_EAST:
         inc(_si, _i, amount, _midTileI, newTile, midTile);
         break;
      case D_SOUTH_EAST:
         dec(_sj, _j, amount, _midTileJ, newTile, midTile);
         inc(_si, _i, amount, _midTileI, newTile, midTile);
         break;
      case D_SOUTH:
         dec(_sj, _j, amount, _midTileJ, newTile, midTile);
         break;
      case D_SOUTH_WEST:
         dec(_sj, _j, amount, _midTileJ, newTile, midTile);
         dec(_si, _i, amount, _midTileI, newTile, midTile);
         break;
      case D_WEST:
         dec(_si, _i, amount, _midTileI, newTile, midTile);
         break;
      case D_NORTH_WEST:
         inc(_sj, _j, amount, _midTileJ, newTile, midTile);
         dec(_si, _i, amount, _midTileI, newTile, midTile);
         break;
      default:
         THROW("Invalid move direction: " << _action._direction);
         break;
      }

      if (newTile)
      {
         // walker is now on a new tile!
         onNewTile();
      }

      if (midTile)
      {
         // walker is now on the middle of the tile!
         onMidTile();
      }

      // if (midTile) std::cout << "walker mid tile" << std::endl;
      // if (newTile) std::cout << "walker new tile" << std::endl;
      // if (amount != 0) std::cout << "walker remaining step :" << amount << std::endl;
   }

   _ii = _i*15+_si;
   _jj = _j*15+_sj;
}