// CSE 143 // Homework 5 // http://www.cs.washington.edu/education/courses/143/00su/homework/ // 30 Jul 2000, Ken Yasuhara #include "basicfirework.h" #include "util.h" // see header for defaults for last three params. BasicFirework::BasicFirework(const double newX, const double newY, const double newVx, const double newVy, const double newRadius, const int newMass, const int newDuration) : TimedProjectile(newX, newY, newVx, newVy), explosionTime(-1), // -1 indicates this hasn't exploded yet radius(newRadius), mass(newMass), duration(newDuration) { assert(radius >= 0); assert(mass > 0); assert(duration >= 0); } // virtual void BasicFirework::updatePosition() { double oldY = y; TimedProjectile::updatePosition(); if (y <= oldY) { if (explosionTime < 0) { explosionTime = 0; } else { explosionTime++; } } if (explosionTime >= duration) { doneFlag = true; } } // virtual void BasicFirework::paint(GP142Display &display) const { if (explosionTime < 0) { paintRocket(display); } else { paintExplosion(display); } } void BasicFirework::paintExplosion(GP142Display &display) const { // explosion expands to full radius gradually throughout duration double maxFlashRadius = radius * ((double)(explosionTime + 1) / (duration + 1)); for (int i = 0; i < mass; i++) { double flashX, flashY; pickRandPositionInCircle(flashX, flashY, x, y, maxFlashRadius); paintExplosionFlash(display, (int)flashX, (int)flashY); } }