Source Code (Use browser search to find items of interest.)
Class Index
kasteroids'KAsteroidsView (./kdegames/kasteroids/view.h:11)
class KAsteroidsView : public QWidget
{
Q_OBJECT
public:
KAsteroidsView( QWidget *parent = 0, const char *name = 0 );
virtual ~KAsteroidsView();
void reset();
void setRockSpeed( double rs ) { rockSpeed = rs; }
void addRocks( int num );
void newGame();
void endGame();
void newShip();
void rotateLeft( bool r ) { rotateL = r; rotateSlow = 5; }
void rotateRight( bool r ) { rotateR = r; rotateSlow = 5; }
void thrust( bool t ) { thrustShip = t; }
void shoot( bool s ) { shootShip = s; shootDelay = 0; }
void showText( const QString &text, const QColor &color );
void hideText();
signals:
void shipKilled();
void rockHit( int size );
void rocksRemoved();
protected:
void readSprites();
void processMissiles();
void processShip();
virtual void resizeEvent( QResizeEvent *event );
virtual void timerEvent( QTimerEvent * );
private:
QwImageSpriteField field;
QwSpriteFieldView view;
QList<QwRealMobileSprite> rocks;
QwSpritePixmapSequence *largeRockImg;
QwSpritePixmapSequence *mediumRockImg;
QwSpritePixmapSequence *smallRockImg;
QList<KMissile> missiles;
QwSpritePixmapSequence *missileImg;
QList<KBit> bits;
QwSpritePixmapSequence *bitImg;
QwRealMobileSprite *ship;
QwTextSprite *textSprite;
bool rotateL;
bool rotateR;
bool thrustShip;
bool shootShip;
int shootDelay;
int shipAngle;
int rotateSlow;
double shipDx;
double shipDy;
int textDy;
double rockSpeed;
KRandomSequence random;
};
kasteroids'KAsteroidsView::KAsteroidsView() (./kdegames/kasteroids/view.cpp:51)
KAsteroidsView::KAsteroidsView( QWidget *parent, const char *name )
: QWidget( parent, name ), field(locate("sprite", IMG_BACKGROUND).ascii(),WIDTH,HEIGHT),
view(&field,this)
{
rocks.setAutoDelete( true );
missiles.setAutoDelete( true );
bits.setAutoDelete( true );
textSprite = new QwTextSprite;
readSprites();
}
kasteroids'KAsteroidsView::~KAsteroidsView() (./kdegames/kasteroids/view.cpp:64)
KAsteroidsView::~KAsteroidsView()
{
}
kasteroids'KAsteroidsView::reset() (./kdegames/kasteroids/view.cpp:68)
void KAsteroidsView::reset()
{
rocks.clear();
missiles.clear();
bits.clear();
rotateL = false;
rotateR = false;
thrustShip = false;
shootShip = false;
shootDelay = 0;
shipAngle = 0;
shipDx = 0.0;
shipDy = 0.0;
rockSpeed = 1.0;
rotateSlow = 0;
random.setSeed(0);
}
kasteroids'KAsteroidsView::newGame() (./kdegames/kasteroids/view.cpp:91)
void KAsteroidsView::newGame()
{
reset();
startTimer( REFRESH_DELAY );
}
kasteroids'KAsteroidsView::endGame() (./kdegames/kasteroids/view.cpp:97)
void KAsteroidsView::endGame()
{
killTimers();
}
kasteroids'KAsteroidsView::newShip() (./kdegames/kasteroids/view.cpp:102)
void KAsteroidsView::newShip()
{
ship->moveTo( width()/2, height()/2, 0 );
ship->setVelocity( 0.0, 0.0 );
shipDx = 0;
shipDy = 0;
shipAngle = 0;
rotateL = false;
rotateR = false;
thrustShip = false;
shootShip = false;
shootDelay = 0;
ship->show();
}
kasteroids'KAsteroidsView::readSprites() (./kdegames/kasteroids/view.cpp:118)
void KAsteroidsView::readSprites()
{
QString sprites_prefix =
KGlobal::dirs()->findResourceDir("sprite", "rock1/rock1-1.pbm");
largeRockImg = new QwSpritePixmapSequence(
sprites_prefix + ROCK1_IMAGE,
sprites_prefix + ROCK1_MASK, ROCK1_FRAMES );
mediumRockImg = new QwSpritePixmapSequence(
sprites_prefix + ROCK2_IMAGE,
sprites_prefix + ROCK2_MASK, ROCK2_FRAMES );
smallRockImg = new QwSpritePixmapSequence(
sprites_prefix + ROCK3_IMAGE,
sprites_prefix + ROCK3_MASK, ROCK3_FRAMES );
bitImg = new QwSpritePixmapSequence(
sprites_prefix + BITS_IMAGE,
sprites_prefix + BITS_MASK, BITS_FRAMES );
QwSpritePixmapSequence *images = new QwSpritePixmapSequence(
sprites_prefix + SHIP_IMAGE,
sprites_prefix + SHIP_MASK, SHIP_FRAMES );
ship = new QwRealMobileSprite( images );
ship->setBoundsAction( QwRealMobileSprite::Wrap );
ship->hide();
missileImg = new QwSpritePixmapSequence( sprites_prefix + MISSILE_IMAGE,
sprites_prefix + MISSILE_MASK, MISSILE_FRAMES );
}
kasteroids'KAsteroidsView::addRocks() (./kdegames/kasteroids/view.cpp:151)
void KAsteroidsView::addRocks( int num )
{
int i;
for ( i = 0; i < num; i++ )
{
KLargeRock *rock = new KLargeRock( largeRockImg );
rock->setBoundsAction( QwRealMobileSprite::Wrap );
rock->setVelocity( 2.0 - random.getDouble()*4.0,
2.0 - random.getDouble()*4.0 );
switch ( random.getLong(4) )
{
case 0:
rock->moveTo( 0, 0, 0 );
break;
case 1:
rock->moveTo( 639, 0, 0 );
break;
case 2:
rock->moveTo( 639, 479, 0 );
break;
default:
rock->moveTo( 0, 479, 0 );
break;
}
rocks.append( rock );
}
}
kasteroids'KAsteroidsView::showText() (./kdegames/kasteroids/view.cpp:184)
void KAsteroidsView::showText( const QString &text, const QColor &color )
{
textSprite->setText( text );
textSprite->setColor( color );
textDy = TEXT_SPEED;
textSprite->moveTo( (width()-textSprite->boundingRect().width()) / 2, -5 );
textSprite->show();
}
kasteroids'KAsteroidsView::hideText() (./kdegames/kasteroids/view.cpp:196)
void KAsteroidsView::hideText()
{
textDy = -TEXT_SPEED;
}
kasteroids'KAsteroidsView::resizeEvent() (./kdegames/kasteroids/view.cpp:201)
void KAsteroidsView::resizeEvent(QResizeEvent* event)
{
QWidget::resizeEvent(event);
view.resize(width(),height());
field.resize(width(),height());
QwRealMobileSprite *rock;
for ( rock = rocks.first(); rock; rock = rocks.next() )
{
rock->adoptSpritefieldBounds();
}
QwRealMobileSprite *missile;
for ( missile = missiles.first(); missile; missile = missiles.next() )
{
missile->adoptSpritefieldBounds();
}
ship->adoptSpritefieldBounds();
}
kasteroids'KAsteroidsView::timerEvent() (./kdegames/kasteroids/view.cpp:224)
void KAsteroidsView::timerEvent( QTimerEvent * )
{
killTimers();
startTimer(REFRESH_DELAY);
QwRealMobileSprite *rock;
// move rocks forward
for ( rock = rocks.first(); rock; rock = rocks.next() )
{
rock->forward( rockSpeed );
switch ( rock->rtti() )
{
case LARGE_ROCK:
rock->frame( ( rock->frame()+1 ) % ROCK1_FRAMES );
break;
case MEDIUM_ROCK:
rock->frame( ( rock->frame()+1 ) % ROCK2_FRAMES );
break;
case SMALL_ROCK:
rock->frame( ( rock->frame()+1 ) % ROCK3_FRAMES );
break;
}
}
// move missiles and check for collision with rocks.
processMissiles();
// these are generated when a ship explodes
for ( KBit *bit = bits.first(); bit; bit = bits.next() )
{
if ( bit->expired() )
{
bit->hide();
bits.remove();
}
else
{
bit->forward( 2.0 );
bit->growOlder();
bit->frame( ( bit->frame()+1 ) % BITS_FRAMES );
}
}
// move / rotate ship.
// check for collision with a rock.
processShip();
if ( textSprite->visible() )
{
if ( textDy < 0 && textSprite->boundingRect().y() <= -5 )
textSprite->hide();
else
{
textSprite->moveBy( 0, textDy );
}
if ( textSprite->boundingRect().y() > height()/3 )
textDy = 0;
}
field.update();
}
kasteroids'KAsteroidsView::processMissiles() (./kdegames/kasteroids/view.cpp:289)
void KAsteroidsView::processMissiles()
{
QwSpriteFieldGraphic *hit;
KMissile *missile;
// move missiles forward
for ( missile = missiles.first(); missile; missile = missiles.next() )
missile->forward( MISSILE_SPEED );
// if a missile has hit a rock, remove missile and break rock into smaller
// rocks or remove completely.
QListIterator<KMissile> it(missiles);
for ( ; it.current(); ++it )
{
missile = it.current();
missile->growOlder();
if ( missile->expired() )
{
missile->hide();
missiles.removeRef( missile );
continue;
}
Pix p;
p = missile->neighbourhood( missile->frame() );
hit = missile->at( p );
while ( hit && ( hit == ship || !missile->exact( p ) ) )
{
missile->next( p );
hit = missile->at( p );
}
missile->end( p );
if ( hit && hit != ship )
{
hit->hide();
if ( hit->rtti() == LARGE_ROCK || hit->rtti() == MEDIUM_ROCK )
{
// break into smaller rocks
double addx[4] = { 1.0, 1.0, -1.0, -1.0 };
double addy[4] = { -1.0, 1.0, -1.0, 1.0 };
QwRealMobileSprite *rHit = (QwRealMobileSprite *) hit;
double dx = rHit->dX();
double dy = rHit->dY();
if ( dx > MAX_ROCK_SPEED )
dx = MAX_ROCK_SPEED;
else if ( dx < -MAX_ROCK_SPEED )
dx = -MAX_ROCK_SPEED;
if ( dy > MAX_ROCK_SPEED )
dy = MAX_ROCK_SPEED;
else if ( dy < -MAX_ROCK_SPEED )
dy = -MAX_ROCK_SPEED;
QwRealMobileSprite *nrock;
for ( int i = 0; i < 4; i++ )
{
double r = random.getDouble()*0.7;
if ( hit->rtti() == LARGE_ROCK )
{
nrock = new KMediumRock( mediumRockImg );
emit rockHit( 0 );
}
else
{
nrock = new KSmallRock( smallRockImg );
emit rockHit( 1 );
}
nrock->setBoundsAction( QwRealMobileSprite::Wrap );
nrock->moveTo( rHit->x(), rHit->y(), 0 );
nrock->setVelocity( dx+addx[i]+r, dy+addy[i]+r );
rocks.append( nrock );
}
}
else if ( hit->rtti() == SMALL_ROCK )
emit rockHit( 2 );
rocks.removeRef( (const QwRealMobileSprite *)hit );
if ( rocks.count() == 0 )
emit rocksRemoved();
missile->hide();
missiles.removeRef( missile );
}
}
}
kasteroids'KAsteroidsView::processShip() (./kdegames/kasteroids/view.cpp:381)
void KAsteroidsView::processShip()
{
QwSpriteFieldGraphic *hit;
Pix sp;
int i;
if ( ship->visible() )
{
sp = ship->neighbourhood( ship->frame() );
hit = ship->at( sp );
while ( hit )
{
if ( hit->rtti() >= LARGE_ROCK && hit->rtti() <= SMALL_ROCK )
{
if ( ship->exact( sp ) )
{
KBit *bit;
for ( i = 0; i < 12; i++ )
{
bit = new KBit( bitImg );
bit->setBoundsAction( QwRealMobileSprite::Wrap );
bit->moveTo( ship->exact_x(), ship->exact_y(),
random.getLong(BITS_FRAMES) );
bit->setVelocity( 0.5-random.getDouble(),
0.5-random.getDouble() );
bit->setDeath( 60 + random.getLong(60) );
bits.append( bit );
}
ship->hide();
emit shipKilled();
break;
}
}
ship->next( sp );
hit = ship->at( sp );
}
if ( rotateSlow )
rotateSlow--;
if ( rotateL )
{
shipAngle -= rotateSlow ? 1 : 2;
if ( shipAngle < 0 )
shipAngle += SHIP_STEPS;
}
if ( rotateR )
{
shipAngle += rotateSlow ? 1 : 2;
if ( shipAngle >= SHIP_STEPS )
shipAngle -= SHIP_STEPS;
}
double angle = shipAngle * PI_X_2 / SHIP_STEPS;
double cosangle = cos( angle );
double sinangle = sin( angle );
if ( thrustShip )
{
shipDx += cosangle;
shipDy += sinangle;
ship->setVelocity( shipDx, shipDy );
}
int frame = shipAngle >> 1;
ship->frame( frame );
ship->forward( SHIP_SPEED );
if ( shootShip )
{
if ( !shootDelay && missiles.count() < 5 )
{
KMissile *missile = new KMissile( missileImg );
missile->setBoundsAction( QwRealMobileSprite::Wrap );
missile->moveTo( ship->exact_x()+cosangle*24,
ship->exact_y()+sinangle*24, 0 );
missile->setVelocity( cosangle, sinangle );
missiles.append( missile );
shootDelay = 5;
}
if ( shootDelay )
shootDelay--;
}
}
}