package visual.dynamic.described;

import java.awt.*;
import java.awt.geom.*;
import java.util.*;

import visual.statik.TransformableContent;


/**
 * An abstract rule-based Sprite
 *
 * Note: Concrete descendents must implement the
 * handleTick() method
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 *
 */
public abstract class RuleBasedSprite extends AbstractSprite
{
    protected ArrayList<Sprite>         protagonists;    
    protected TransformableContent      content;

      
    /**
     * Explicit Value Constructor
     *
     * @param content   The static visual content
     */
    public RuleBasedSprite(TransformableContent content)
    {
       super();

       protagonists = new ArrayList<Sprite>();       
       this.content = content;
       setVisible(true);
    }

    /**
     * Add a "protagonist" Sprite to this Sprite
     *
     * @param protagonist   The "protagonist" Sprite to add
     */
    public void addProtagonist(Sprite protagonist)
    {
       protagonists.add(protagonist);       
    }

    /**
     * Get the visual content associated with this Sprite
     * (required by Sprite)
     */
    public TransformableContent getContent()
    {
       return content;
    }

    /**
     * Handle a tick event (required by MetronomeListener)
     *
     * @param time  The current time (in milliseconds)
     */
    public abstract void handleTick(int time);


    /**
     * Remove a "protagonist" Sprite from the collection of
     * "protagonists" this Sprite is concerned with
     *
     * @param protagonist   The "protagonist" Sprite to remove
     */
    public void removeProtagonist(Sprite protagonist)
    {
       protagonists.remove(protagonist);       
    }
}
