package Car; use strict; use warnings; use QtCore4; use QtGui4; use QtDBus4; use QtCore4::isa qw( Qt::GraphicsItem ); use QtCore4::slots accelerate => [], decelerate => [], turnLeft => [], turnRight => []; use QtCore4::signals crashed => []; sub color() { return this->{color}; } sub wheelsAngle() { return this->{wheelsAngle}; } sub speed() { return this->{speed}; } use constant Pi => 3.14159265358979323846264338327950288419717; sub boundingRect { return Qt::RectF(-35, -81, 70, 115); } sub NEW { my ($class) = @_; $class->SUPER::NEW(); this->{color} = Qt::Color(Qt::green()); this->{wheelsAngle} = 0; this->{speed} = 0; this->setFlag(Qt::GraphicsItem::ItemIsMovable(), 1); this->setFlag(Qt::GraphicsItem::ItemIsFocusable(), 1); } sub accelerate { if (this->speed < 10){ ++this->{speed}; } } sub decelerate { if (this->speed < 10){ --(this->{speed}); } } sub turnLeft { if (this->wheelsAngle > -30) { this->{wheelsAngle} -= 5; } } sub turnRight { if (this->wheelsAngle < 30) { this->{wheelsAngle} += 5; } } sub paint { my ($painter) = @_; $painter->setBrush(Qt::Brush(Qt::gray())); $painter->drawRect(-20, -58, 40, 2); # front axel $painter->drawRect(-20, 7, 40, 2); # rear axel $painter->setBrush(Qt::Brush(this->color)); $painter->drawRect(-25, -79, 50, 10); # front wing $painter->drawEllipse(-25, -48, 50, 20); # side pods $painter->drawRect(-25, -38, 50, 35); # side pods $painter->drawRect(-5, 9, 10, 10); # back pod $painter->drawEllipse(-10, -81, 20, 100); # main body $painter->drawRect(-17, 19, 34, 15); # rear wing $painter->setBrush(Qt::Brush(Qt::black())); $painter->drawPie(-5, -51, 10, 15, 0, 180 * 16); $painter->drawRect(-5, -44, 10, 10); # cocpit $painter->save(); $painter->translate(-20, -58); $painter->rotate(this->wheelsAngle); $painter->drawRect(-10, -7, 10, 15); # front left $painter->restore(); $painter->save(); $painter->translate(20, -58); $painter->rotate(this->wheelsAngle); $painter->drawRect(0, -7, 10, 15); # front left $painter->restore(); $painter->drawRect(-30, 0, 12, 17); # rear left $painter->drawRect(19, 0, 12, 17); # rear right } sub timerEvent { my $axelDistance = 54; my $wheelsAngleRads = (this->wheelsAngle * Pi) / 180; my $turnDistance = cos($wheelsAngleRads) * $axelDistance * 2; my $turnRateRads = $wheelsAngleRads / $turnDistance; # rough estimate my $turnRate = ($turnRateRads * 180) / Pi; my $rotation = this->speed * $turnRate; this->rotate($rotation); this->translate(0, -(this->speed)); this->update(); } 1;