You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdetoys/ktux/spriteanim.cpp

162 lines
4.1 KiB

//---------------------------------------------------------------------------
//
// spriteanim.cpp
//
// Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
//
#include "spritemisc.h"
#include "spritepm.h"
#include "spriteanim.h"
#include <kdebug.h>
//===========================================================================
//
// SpriteObject stores the animations that create an object
//
SpriteObject::SpriteObject(SpritePixmapSequence *seq, TQCanvas *c )
: TQCanvasSprite(seq, c),
mCycle(0),
mLifeSpan(-1),
mSeq(seq)
{
}
//---------------------------------------------------------------------------
void SpriteObject::age()
{
if (mLifeSpan > 0)
{
mLifeSpan--;
}
mCycle++;
if (mCycle > mSeq->delay(frame()))
{
setFrame((frame()+1)%frameCount());
mCycle = 0;
}
}
void SpriteObject::setBounds( int x1, int y1, int x2, int y2 )
{
mBound = TQRect( x1, y1, x2-x1, y2-y1 );
}
bool SpriteObject::outOfBounds() const
{
bool in = mBound.contains( static_cast<int>(x()), static_cast<int>(y()) );
return !in;
}
//===========================================================================
//
// SpriteDef stores the animations that create an object
//
SpriteDef::SpriteDef(KConfigBase &config)
{
read(config);
}
//---------------------------------------------------------------------------
SpriteObject *SpriteDef::create( TQCanvas *c )
{
SpriteObject *sprite = 0;
if (mSeq)
{
int startX = mStartX.random();
int startY = mStartY.random();
sprite = new SpriteObject(mSeq, c);
sprite->setVelocity(mDirX.random(), mDirY.random());
if ( mDirX.min() != 0 || mDirX.max() != 0 ||
mDirY.min() != 0 || mDirY.max() != 0 ) {
sprite->setAnimated( true );
}
sprite->move(startX, startY);
sprite->setBounds(startX-1, startY-1, mEndX.random()+1, mEndY.random()+1);
sprite->setLifeSpan(mLifeSpan);
sprite->setZ(mZ);
sprite->show();
}
return sprite;
}
//---------------------------------------------------------------------------
void SpriteDef::read(KConfigBase &config)
{
mDirX.set(config.readEntry("DirectionX", "0"));
mDirY.set(config.readEntry("DirectionY", "0"));
mStartX.set(config.readEntry("StartX", "0"));
mStartY.set(config.readEntry("StartY", "0"));
mEndX.set(config.readEntry("EndX", "10000"));
mEndY.set(config.readEntry("EndY", "10000"));
mLifeSpan = config.readNumEntry("LifeSpan", -1);
mZ = config.readNumEntry("Z", 1);
TQString animation = config.readEntry("Animation", "");
mSeq = SpriteSequenceManager::manager()->load(config, animation);
kdDebug() << "Set Z = " << mZ << endl;
}
//===========================================================================
//
// SpriteGroup
//
SpriteGroup::SpriteGroup(TQCanvas *c, KConfigBase &config)
: mCanvas(c)
{
mAvailable.setAutoDelete(true);
mActive.setAutoDelete(true);
read(config);
}
//---------------------------------------------------------------------------
void SpriteGroup::next()
{
TQPtrListIterator<SpriteObject> it(mActive);
for (; it.current(); ++it)
{
SpriteObject *sprite = it.current();
if (sprite->outOfBounds() || sprite->dead())
{
mActive.removeRef(sprite);
}
else
{
// sprite->forward(1);
sprite->age();
}
}
}
//---------------------------------------------------------------------------
void SpriteGroup::refresh()
{
if (((int) mActive.count()) < mCount)
{
SpriteObject *sprite = mAvailable.first()->create(mCanvas);
mActive.append(sprite);
}
}
//---------------------------------------------------------------------------
void SpriteGroup::read(KConfigBase &config)
{
SpriteRange countRange(config.readEntry("Count", "1"));
mCount = countRange.random();
mRefresh.set(config.readEntry("Refresh", "1000"));
TQStrList anims;
config.readListEntry("Animations", anims);
for (anims.first(); anims.current(); anims.next())
{
config.setGroup(anims.current());
SpriteDef *obj = new SpriteDef(config);
mAvailable.append(obj);
}
}