René Nyffenegger's collection of things on the web
René Nyffenegger on Oracle - Most wanted - Feedback -
 

MovieClip [Ming wrapper class]

A MovieClip (Sprite) is in many respects very similar to a flash movie. Therefore, this class is inherited from MovieClip_ which defines the common functionality.
However, a MovieClip has also the characteristics of a Character_, so it's also inherited from Character_.

The source

MovieClip.h
#ifndef MOVIE_CLIP_H
#define MOVIE_CLIP_H

#include "MovieClip_.h"
#include "Character_.h"

class MovieClip : public MovieClip_, public Character_ {
  friend class Movie;

  public:
    MovieClip();

    MovieClip& operator=(MovieClip const&);

    using MovieClip_::Add;

    virtual void        Add(Action const&);

    virtual DisplayItem Add(Character_ &);
    virtual DisplayClip Add(MovieClip  &);

    virtual void Stop     ();
    virtual void NextFrame() const;
    virtual void Remove   (DisplayItem item);
    virtual void Frames   (int);
    virtual void Label    (std::string const&);

  private:
    SWFMovieClip movieClip_;

  protected:

    /* A MovieClip_ might be interested to know if 
       it had been added to another MovieClip_.
       See also Character_::AfterAdding 
     
       Note, this method overrides Character_::AfterAdding 
       that takes a DisplayItem& as parameter
     */
    virtual void AfterAdding(DisplayClip&) {}

    // HACK?
    virtual SWFBlock_s* swf_block() const;
};

#endif
MovieClip.cpp
#include "MovieClip.h"

#include "Action.h"
#include "TextField.h"

MovieClip::MovieClip() {
  movieClip_ = newSWFMovieClip();
}

void MovieClip::NextFrame() const {
  SWFMovieClip_nextFrame(movieClip_);
}

void MovieClip::Stop() {
  Add(Action("stop();"));
}

/* TODO: does it make sense to return a display item if character == Action here? */
DisplayItem MovieClip::Add(Character_ & c) {
  c.BeforeAdding();
  DisplayItem d(SWFMovieClip_add(movieClip_, c.swf_block()));
  c.AfterAdding(d);

  return d;
}

void MovieClip::Add(Action const& a) {
  SWFMovieClip_add(movieClip_, a.swf_block());
}

DisplayClip MovieClip::Add(MovieClip & c) {
  c.BeforeAdding();
  DisplayClip d(SWFMovieClip_add(movieClip_, c.swf_block()));
  c.AfterAdding(d);

  return d;
}

void MovieClip::Label(const std::string& label) {
  SWFMovieClip_labelFrame(movieClip_, label.c_str());
}

void MovieClip::Remove(DisplayItem item) {
  SWFMovieClip_remove(movieClip_, item.item_);
}

void MovieClip::Frames(int nofFrames) {
  SWFMovieClip_setNumberOfFrames(movieClip_, nofFrames);
}

SWFBlock_s* MovieClip::swf_block() const {
  return reinterpret_cast<SWFBlock_s*>(movieClip_);
}

MovieClip& MovieClip::operator=(MovieClip const& o) {
  movieClip_ = o.movieClip_;
  return *this;
}

Examples

The following clsses demonstrate this class: