Added onAppearanceChanged to check if a sprite's appearance has been changed by a call to self's / parent's hide() or show() methods

Note: there's a reason this is not called onVisibilityChanged().
TLDR;the visible flag arg here is NOT equal to Sprite::visible()
The reason is that,  the final visibility of a sprite is decided
by the visibility of itself and its parents.  the "visible" flag
here is the result of the calculation based on calls to self and
parents' hide() / show() methods. The "visible" flag here is NOT
the same as Sprite::visible()! Sprite::visible() is only limited
to the sprite itself while visible flag here is described above.