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

/* Ohnivá koule začíná v dolní pravé části panelu a přímou dráhou 
   cestuje k jeho levé části (různými rychlostmi).
   Pokud zasháne 'jacka', exploduje (s vhodným zvukem exploze).
 
   Ohnivá koule, která opustila levou stranu nebo explodovala
   se pouzije odznova.
*/

import java.awt.*;


public class FireBallSprite extends Sprite
{
  // hodnoty x-ového a y-ového kroku jsou STEP +/- STEP_OFFSET
  private static final int STEP = -10;   // přesun vlevo
  private static final int STEP_OFFSET = 2;

  private JackPanel jp;    // oznam objektu typu JackPanel kolizi s jackem
  private JumperSprite jack;


  public FireBallSprite(int w, int h, ImagesLoader imsLd,
                               JackPanel jp, JumperSprite j) 
  { super( w, h/2, w, h, imsLd, "fireball");  
        // koule je umístěna uprostřed pravé strany panelu
    this.jp = jp;
    jack = j;
    initPosition();
  } // konec metody: FireBallSprite()


  private void initPosition()
  // upraví pozici ohnivé kousle a její pohyb směrem vlevo
  {
    int h = getPHeight()/2 + ((int)(getPHeight() * Math.random())/2);
                     // podél dolní poloviny okraje na pravé straně
    if (h + getHeight() > getPHeight())
      h -= getHeight();    // so all on screen

    setPosition(getPWidth(), h);   
    setStep(STEP + getRandRange(STEP_OFFSET), 0);   // přesun vlevo
  } // konec metody: initPosition()


  private int getRandRange(int x) 
  // generátor náhodných čísel v rozmezí od -x do x
  {   return ((int)(2 * x * Math.random())) - x;  }



  public void updateSprite() 
  { hasHitJack();
    goneOffScreen();
    super.updateSprite();
  }


  private void hasHitJack()
  /* Pokud koule zasáhne jacka, oznam to objektu typu JackPanel 
     (který zobrazí explozi a přehraje zvuk) a začni znovu.
  */
  { 
    Rectangle jackBox = jack.getMyRectangle();
    jackBox.grow(-jackBox.width/3, 0);   // ztenči jackům ohraničující box

    if (jackBox.intersects( getMyRectangle() )) {    // kolize s jackem?
      jp.showExplosion(locx, locy+getHeight()/2);  
             // dej vědět objektu typu JackPanel, předej mu souřadnice střetu
      initPosition();
    }
  } // konec metody: hasHitJack()


  private void goneOffScreen()
  // jakmile koule opustí levou stranu, začni znovu.
  {
    if (((locx+getWidth()) <= 0) && (dx < 0)) // za levou stranou a pohybujeme se vlevo
      initPosition();   // spos míček od nové pozice
  }  // konec metody: goneOffScreen()


}  // konec třídy: FireBallSprite
