public RBootsWallSprite(RBootsView host, Sprite bg) {
    super(host, theWallImg);
    _bg = bg;
    _prevX = 0.0f;
    _stopped = false;
    _topEdges = new RingBuffer(200);
    _bottomEdges = new RingBuffer(200);
    SpriteAppearanceAgent a =
        new SpriteAppearanceAgent() {
          public void renderSpriteOn(Sprite aSprite, Canvas aCanvas) {
            PointF p = pos();
            int le = (int) _leftEdge;
            int i = 0;
            while (le < aCanvas.getWidth() + WALL_SEGMENT_WIDTH) {
              aCanvas.drawBitmap(
                  shape(), le, _topEdges.ref(i) - shape().getHeight(), aSprite.host().paint());
              aCanvas.drawBitmap(shape(), le, _bottomEdges.ref(i), aSprite.host().paint());
              i++;
              le += WALL_SEGMENT_WIDTH;
            }
          }
        };

    SpriteBehaviorAgent b =
        new SpriteBehaviorAgent() {
          public void act(Sprite aSprite) {
            RBootsView v = (RBootsView) host();
            if (!v.isPaused()) {
              while (_xPos > pos().x) {
                _topEdges.append(nextWallTop());
                _bottomEdges.append(nextWallBottom());
                _xPos -= WALL_SEGMENT_WIDTH;
              }
              _leftEdge = pos().x;
              while (_leftEdge < -WALL_SEGMENT_WIDTH) {
                _leftEdge += WALL_SEGMENT_WIDTH;
              }
              _bg.moveTo(_bg.pos().x + (vel().x / 2.0f), _bg.pos().y + (vel().y / 2.0f));
              v.updateScoar((int) (-(pos().x) / 20.0f));
              if (v.ogen() != null) {
                v.ogen().update(-(pos().x));
              }
              if (!_stopped && ((int) _prevX / 1200) != ((int) (pos().x) / 1200)) {
                setVel(vel().x * 1.2f, 0.0f);
              }
              _prevX = pos().x;
              DefaultBehaviorAgent.instance().act(aSprite);
            }
          }
        };
    setAppearanceAgent(a);
    setBehaviorAgent(b);
    _wallTop = 15;
    _wallTopFirstDeriv = 0;
    _wallTopSecondDeriv = 0;
    _wallDist = 200;
    _xPos = 0.0;
    _leftEdge = 0.0;
    for (int i = 0; i < 200; i++) {
      _topEdges.append(nextWallTop());
      _bottomEdges.append(nextWallBottom());
    }
    setVel(-1.0f, 0.0f);
  }
 public int bottomEdgeFor(float x) {
   int idx = (int) (x + _leftEdge);
   return _bottomEdges.ref(idx / WALL_SEGMENT_WIDTH);
 }