예제 #1
0
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);
        }
    }
}
예제 #2
0
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;
}