
// Ribbon.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Tato třída se stará o obrázky, které jsou širší než herní panel
   width >= pWidth

   Místo horizontálního pohybu spritu (doleva/doprava) se pohybují
   pásy v pozadí, a to v opačném směru (doprava/doleva). Velikost
   pohybu určuje hodnota proměnné moveSize.

   Obrázek horizontálně navazuje sám na sebe, takže v ktérémkoliv
   momentu může být na obrazovce viditelný jeho chvost následovaný
   jeho čelem.

   Kolekci pásů spravuje objekt typu RibbonsManager.
*/

import java.awt.*;
import javax.swing.*;
import java.awt.image.*;



public class Ribbon
{
  private BufferedImage im;
  private int width;      // šířka obrázku (>= pWidth)
  private int pWidth, pHeight;    // rozměry zobrazovacího panelu

  private int moveSize;       // velikost pohybu (v pixelech)
  private boolean isMovingRight;  // příznaky pohybu
  private boolean isMovingLeft;

  private int xImHead;   
     /* x-voá souřadnice v panelu, odkud se má začít kreslit
        cihličková síť (její čelo).
        Může být v rozsahu od -width do with (vyjma), takže 
        může mít hodnotu mimo hranicí panelu (0-pWidth).

        Jak se její hodnota mění, bude se na obrazovce obvykle
        objevovat kombinace jejího chvostu následovaná čelem.
     */
 

  public Ribbon(int w, int h, BufferedImage im, int moveSz)
  {
    pWidth = w; pHeight = h;
    
    this.im = im;
    width = im.getWidth();    // výšku ukládat nepotřebujeme
    if (width < pWidth) 
      System.out.println("Ribbon width < panel width");

    moveSize = moveSz;
    isMovingRight = false;   // žádný pohyb at start
    isMovingLeft = false;
    xImHead = 0;
  }  // konec metody: Ribbon()



  public void moveRight()
  // při následující aktualizace přesouvej obrázek pásu doprava
  { isMovingRight = true;
    isMovingLeft = false;
  }


  public void moveLeft()
  // move the ribbon image to the left on the next update
  { isMovingRight = false;
    isMovingLeft = true;
  }

  public void stayStill()
  // don't move the ribbon image on the next update
  { isMovingRight = false;
    isMovingLeft = false;
  }

  
  public void update()
  /* Zvýší hodnota proměnné xImHead v závislosti na příznaku pohybu.
     Její rozsah je -width to width (vyjma), což je šířka obrázku.
  */
  { if (isMovingRight)
      xImHead = (xImHead + moveSize) % width;
    else if (isMovingLeft)
      xImHead = (xImHead - moveSize) % width;

    // System.out.println("xImHead is " + xImHead);
  } // konec metody: update()


  public void display(Graphics g)
  /* Uvažujeme 5 případů:
       - xImHead == 0: vykreslí pouze čelo obrázku
       - xMapHead >= 0: vykreslí chvost obrázku a čelo obrázku nebo jen chvost obrázku 
       - xMapHead < 0: vykreslí chvost obrázku nebo chvost obrázku a čelo obrázku 

     Proměnná xMapHead je v rozsahu -width až width (vyjma)
  */
  {
    if (xImHead == 0)   // draw čelo obrázku at (0,0)
      draw(g, im, 0, pWidth, 0, pWidth);
    else if ((xImHead > 0) && (xImHead < pWidth)) {  
       // vykresli týl obrázku v bodu (0,0) a čelo obrázku v bodu (xImHead,0) 
      draw(g, im, 0, xImHead, width-xImHead, width);   // týl obrázku
      draw(g, im, xImHead, pWidth, 0, pWidth-xImHead);  // čelo obrázku
    }
    else if (xImHead >= pWidth)   // vykresli jen čelo obrázku im na (0,0)
      draw(g, im, 0, pWidth, 
                  width-xImHead, width-xImHead+pWidth);  // týl obrázku
    else if ((xImHead < 0) && (xImHead >= pWidth-width))
      draw(g, im, 0, pWidth, -xImHead, pWidth-xImHead);  // tělo obrázku
    else if (xImHead < pWidth-width) {
       // draw týl obrázku im at (0,0) and čelo obrázku at (width+xImHead,0)
      draw(g, im, 0, width+xImHead, -xImHead, width);  // týl obrázku
      draw(g, im, width+xImHead, pWidth, 
                  0, pWidth-width-xImHead);  // čelo obrázku
    }
  } // konec metody: display()


  private void draw(Graphics g, BufferedImage im, 
                        int scrX1, int scrX2, int imX1, int imX2)
  /* y-ové souřadnice obrázku začínají vždy od 0 a končí hodnotou 
     pHeight (výška panelu), jsou tedy nastaveny napevno. */
  { g.drawImage(im, scrX1, 0, scrX2, pHeight, 
                     imX1, 0,  imX2, pHeight, null);
  }

}  // konec třídy: Ribbon
