5f1eed7b94
unneeded imports. I've got partially completed patches for narya & vilya, too, but nenya was the only one that wound up in a decent state after a friday evening puttering at it, killing time waiting on other things to finish. git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@572 ed5b42cb-e716-0410-a449-f6a68f950b19
246 lines
7.2 KiB
Java
246 lines
7.2 KiB
Java
//
|
|
// $Id$
|
|
//
|
|
// Nenya library - tools for developing networked games
|
|
// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved
|
|
// http://www.threerings.net/code/nenya/
|
|
//
|
|
// This library is free software; you can redistribute it and/or modify it
|
|
// under the terms of the GNU Lesser General Public License as published
|
|
// by the Free Software Foundation; either version 2.1 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
package com.threerings.media.sprite;
|
|
|
|
import java.awt.AlphaComposite;
|
|
import java.awt.Composite;
|
|
import java.awt.Graphics2D;
|
|
|
|
import com.threerings.media.util.Path;
|
|
|
|
public class FadableImageSprite extends OrientableImageSprite
|
|
{
|
|
/**
|
|
* Fades this sprite in over the specified duration after waiting for the specified delay.
|
|
*/
|
|
public void fadeIn (long delay, long duration)
|
|
{
|
|
setAlpha(0.0f);
|
|
|
|
_fadeStamp = 0;
|
|
_fadeDelay = delay;
|
|
_fadeInDuration = duration;
|
|
}
|
|
|
|
/**
|
|
* Fades this sprite out over the specified duration after waiting for the specified delay.
|
|
*/
|
|
public void fadeOut (long delay, long duration)
|
|
{
|
|
setAlpha(1.0f);
|
|
|
|
_fadeStamp = 0;
|
|
_fadeDelay = delay;
|
|
_fadeOutDuration = duration;
|
|
}
|
|
|
|
/**
|
|
* Puts this sprite on the specified path and fades it in over the specified duration.
|
|
*
|
|
* @param path the path to move along
|
|
* @param fadePortion the portion of time to spend fading in, from 0.0f (no time) to 1.0f (the
|
|
* entire time)
|
|
*/
|
|
public void moveAndFadeIn (Path path, long pathDuration, float fadePortion)
|
|
{
|
|
move(path);
|
|
|
|
setAlpha(0.0f);
|
|
|
|
_fadeInDuration = (long)(pathDuration * fadePortion);
|
|
}
|
|
|
|
/**
|
|
* Puts this sprite on the specified path and fades it out over the specified duration.
|
|
*
|
|
* @param path the path to move along
|
|
* @param pathDuration the duration of the path
|
|
* @param fadePortion the portion of time to spend fading out, from 0.0f (no time) to 1.0f
|
|
* (the entire time)
|
|
*/
|
|
public void moveAndFadeOut (Path path, long pathDuration, float fadePortion)
|
|
{
|
|
move(path);
|
|
|
|
setAlpha(1.0f);
|
|
|
|
_fadeStamp = 0;
|
|
_pathDuration = pathDuration;
|
|
_fadeOutDuration = (long)(pathDuration * fadePortion);
|
|
_fadeDelay = _pathDuration - _fadeOutDuration;
|
|
}
|
|
|
|
/**
|
|
* Puts this sprite on the specified path, fading it in over the specified duration at the
|
|
* beginning and fading it out at the end.
|
|
*
|
|
* @param path the path to move along
|
|
* @param pathDuration the duration of the path
|
|
* @param fadePortion the portion of time to spend fading in/out, from 0.0f (no time) to 1.0f
|
|
* (the entire time)
|
|
*/
|
|
public void moveAndFadeInAndOut (Path path, long pathDuration, float fadePortion)
|
|
{
|
|
move(path);
|
|
|
|
setAlpha(0.0f);
|
|
|
|
_pathDuration = pathDuration;
|
|
_fadeInDuration = _fadeOutDuration = (long)(pathDuration * fadePortion);
|
|
}
|
|
|
|
@Override
|
|
public void tick (long tickStamp)
|
|
{
|
|
super.tick(tickStamp);
|
|
|
|
if (_fadeInDuration != -1) {
|
|
if (_path != null && (tickStamp - _pathStamp) <= _fadeInDuration) {
|
|
// fading in while moving
|
|
float alpha = (float)(tickStamp - _pathStamp) / _fadeInDuration;
|
|
if (alpha >= 1.0f) {
|
|
completeFadeIn();
|
|
} else {
|
|
setAlpha(alpha);
|
|
}
|
|
|
|
} else {
|
|
// fading in while stationary
|
|
if (_fadeStamp == 0) {
|
|
// store the time at which fade started
|
|
_fadeStamp = tickStamp;
|
|
}
|
|
if (tickStamp > _fadeStamp + _fadeDelay) {
|
|
// initial delay has passed
|
|
float alpha = (float)(tickStamp - _fadeStamp - _fadeDelay) / _fadeInDuration;
|
|
if (alpha >= 1.0f) {
|
|
completeFadeIn();
|
|
} else {
|
|
setAlpha(alpha);
|
|
}
|
|
}
|
|
}
|
|
|
|
} else if (_fadeOutDuration != -1) {
|
|
if (_fadeStamp == 0) {
|
|
// store the time at which fade started
|
|
_fadeStamp = tickStamp;
|
|
}
|
|
|
|
if (tickStamp > _fadeStamp + _fadeDelay) {
|
|
// initial delay has passed
|
|
float alpha = 1f - (float)(tickStamp - _fadeStamp - _fadeDelay) / _fadeOutDuration;
|
|
if (alpha <= 0.0f) {
|
|
completeFadeOut();
|
|
} else {
|
|
setAlpha(alpha);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void pathCompleted (long timestamp)
|
|
{
|
|
super.pathCompleted(timestamp);
|
|
if (_fadeInDuration != -1) {
|
|
completeFadeIn();
|
|
} else if (_fadeOutDuration != -1) {
|
|
completeFadeOut();
|
|
}
|
|
}
|
|
|
|
/** Completes the process of fading in. */
|
|
protected void completeFadeIn ()
|
|
{
|
|
setAlpha(1.0f);
|
|
_fadeInDuration = -1;
|
|
}
|
|
|
|
/** Completes the process of fading out. */
|
|
protected void completeFadeOut ()
|
|
{
|
|
setAlpha(0.0f);
|
|
_fadeOutDuration = -1;
|
|
}
|
|
|
|
@Override
|
|
public void paint (Graphics2D gfx)
|
|
{
|
|
if (_alphaComposite.getAlpha() < 1.0f) {
|
|
Composite ocomp = gfx.getComposite();
|
|
gfx.setComposite(_alphaComposite);
|
|
super.paint(gfx);
|
|
gfx.setComposite(ocomp);
|
|
|
|
} else {
|
|
super.paint(gfx);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets the alpha value of this sprite.
|
|
*/
|
|
public void setAlpha (float alpha)
|
|
{
|
|
if (alpha < 0.0f) {
|
|
alpha = 0.0f;
|
|
|
|
} else if (alpha > 1.0f) {
|
|
alpha = 1.0f;
|
|
}
|
|
if (alpha != _alphaComposite.getAlpha()) {
|
|
_alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
|
|
if (_mgr != null) {
|
|
_mgr.getRegionManager().invalidateRegion(_bounds);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the alpha value of this sprite.
|
|
*/
|
|
public float getAlpha ()
|
|
{
|
|
return _alphaComposite.getAlpha();
|
|
}
|
|
|
|
/** The alpha composite. */
|
|
protected AlphaComposite _alphaComposite =
|
|
AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f);
|
|
|
|
/** If fading in, the fade-in duration (otherwise -1). */
|
|
protected long _fadeInDuration = -1;
|
|
|
|
/** If fading in without moving, the fade-in delay. */
|
|
protected long _fadeDelay;
|
|
|
|
/** The time at which fading started. */
|
|
protected long _fadeStamp = -1;
|
|
|
|
/** If fading out, the fade-out duration (otherwise -1). */
|
|
protected long _fadeOutDuration = -1;
|
|
|
|
/** If fading out, the path duration. */
|
|
protected long _pathDuration;
|
|
}
|