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
106 lines
3.4 KiB
Java
106 lines
3.4 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.animation;
|
|
|
|
import java.awt.AlphaComposite;
|
|
import java.awt.Composite;
|
|
import java.awt.Graphics2D;
|
|
import java.awt.Rectangle;
|
|
|
|
import com.threerings.media.image.Mirage;
|
|
import com.threerings.media.util.LinearTimeFunction;
|
|
import com.threerings.media.util.TimeFunction;
|
|
|
|
/**
|
|
* Blends between a series of images using alpha.
|
|
*/
|
|
public class BlendAnimation extends Animation
|
|
{
|
|
/**
|
|
* Blends from the starting image through each successive image in the
|
|
* specified amount of time (blending between each image takes place
|
|
* in <code>delay</code> milliseconds).
|
|
*/
|
|
public BlendAnimation (int x, int y, Mirage[] images, int delay)
|
|
{
|
|
super(new Rectangle(x, y, images[0].getWidth(), images[0].getHeight()));
|
|
_images = images;
|
|
int fades = images.length-1;
|
|
_tfunc = new LinearTimeFunction(0, 100 * fades, delay * fades);
|
|
}
|
|
|
|
@Override
|
|
public void tick (long timestamp)
|
|
{
|
|
// check to see if our blend level has changed
|
|
int level = _tfunc.getValue(timestamp);
|
|
if (level == _level) {
|
|
return;
|
|
}
|
|
// stop if we reach the end
|
|
if (level == 100*(_images.length-1)) {
|
|
_finished = true;
|
|
}
|
|
_level = level;
|
|
invalidate();
|
|
}
|
|
|
|
@Override
|
|
public void fastForward (long timeDelta)
|
|
{
|
|
_tfunc.fastForward(timeDelta);
|
|
}
|
|
|
|
@Override
|
|
public void paint (Graphics2D gfx)
|
|
{
|
|
int index = _level / 100;
|
|
float alpha = 1f - (_level % 100) / 100f;
|
|
|
|
Composite ocomp = gfx.getComposite();
|
|
gfx.setComposite(AlphaComposite.getInstance(
|
|
AlphaComposite.SRC_OVER, alpha));
|
|
_images[index].paint(gfx, _bounds.x, _bounds.y);
|
|
if (index < _images.length-1) {
|
|
gfx.setComposite(AlphaComposite.getInstance(
|
|
AlphaComposite.SRC_OVER, 1f-alpha));
|
|
_images[index+1].paint(gfx, _bounds.x, _bounds.y);
|
|
}
|
|
gfx.setComposite(ocomp);
|
|
}
|
|
|
|
/** The images between which we are blending. */
|
|
protected Mirage[] _images;
|
|
|
|
/** The time function we're using to time our blends. */
|
|
protected TimeFunction _tfunc;
|
|
|
|
/** Our current blend level and image index all wrapped into one. */
|
|
protected int _level;
|
|
|
|
/** The alpha composite used to render our current image. */
|
|
protected AlphaComposite _currentComp;
|
|
|
|
/** The alpha composite used to render our "next" image. */
|
|
protected AlphaComposite _nextComp;
|
|
}
|