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; }
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; }
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; }