void Rasterizer::rasterizeLine(QPoint begin, QPoint end, QVector<QPoint> * pixels) const { Q_ASSERT(pixels); if (clearDestination()) { pixels->clear(); } if (begin.x() == end.x()) { rasterizeVerticalLine(begin, end, pixels); return; } if (begin.x() > end.x()) { qSwap(begin, end); } qreal k = (end.y() - begin.y()) / (qreal)(end.x() - begin.x()); qreal b = begin.y() - begin.x() * k; if (begin.x() < 0) { begin.setX(0); begin.setY(b); } if (end.x() >= (qint32)canvas_->width()) { end.setX(canvas_->width() - 1); end.setY(k * end.x() + b); } qint32 x = begin.x(); qint32 y = begin.y(); qint32 delta = k < 0 ? -1 : 1; qreal err = 0; while (x <= end.x()) { if (err >= 0.5) { y += delta; err -= 1; } if (0 <= y && y < qint32(canvas_->height())) { pixels->push_back(QPoint(x, y)); } if (err < 0.5) { x++; err += qAbs(k); } } }
bool VehicleInstance::handleDamage(ShootableMapObject::DamageInflictType *d) { if (health_ < 0 || d->dtype == MapObject::dmg_Mental) return false; health_ -= d->dvalue; if (health_ <= 0){ speed_ = 0; clearDestination(); switch ((unsigned int)d->dtype) { case MapObject::dmg_Bullet: case MapObject::dmg_Laser: case MapObject::dmg_Burn: case MapObject::dmg_Explosion: vehicle_->setVehicleAnim(Vehicle::OnFireAnim); setTimeShowAnim(10000); break; } } // NOTE: maybe reduce speed on hit? return true; }