1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
#include "Cloud.h"
#include "common.h"
#include "minorGems/util/random/StdRandomSource.h"
extern StdRandomSource randSource;
Cloud::Cloud()
: mBaseFade( 1.0 ), mShiftA( NULL ), mShiftB( NULL ) {
mXSpeed = randSource.getRandomBoundedDouble( 0.005, 0.001 );
}
void Cloud::shiftBetween( Cloud *inA, Cloud *inB, int inNumSteps ) {
mShiftA = inA;
mShiftB = inB;
mNumShiftSteps = inNumSteps;
mNumShiftStepsDone = 0;
}
void Cloud::draw( double inRotation, Vector3D *inPosition,
double inScale,
double inFadeFactor,
Color *inColor ) {
if( mShiftA == NULL ) {
GameObject::draw ( inRotation, inPosition,
inScale, inFadeFactor, inColor );
}
else {
double bBlend = mNumShiftStepsDone / (double)mNumShiftSteps;
double aBlend = 1 - bBlend;
// draw A underneath, but don't use full blend,
// because both A and be might be transparent
mShiftA->draw( inRotation, inPosition,
inScale, inFadeFactor * aBlend, inColor );
// fade B in on top
mShiftB->draw( inRotation, inPosition,
inScale, inFadeFactor * bBlend, inColor );
}
}
void Cloud::step() {
if( mShiftA == NULL ) {
mFadeFactor = mBaseFade;
// can see the stepping, pixel, pixel, pixel
//mX += mXSpeed;
}
else {
// shifting
mNumShiftStepsDone ++;
if( mNumShiftStepsDone > mNumShiftSteps ) {
// stop shifting
mShiftA = NULL;
mShiftB = NULL;
}
else {
double bBlend = mNumShiftStepsDone / (double)mNumShiftSteps;
bBlend = smoothBlend( bBlend );
double aBlend = 1 - bBlend;
mX = mShiftA->mX * aBlend + mShiftB->mX * bBlend;
mY = mShiftA->mY * aBlend + mShiftB->mY * bBlend;
mFadeFactor = mShiftA->mFadeFactor * aBlend +
mShiftB->mFadeFactor * bBlend;
}
}
}
|