/usr/local/CPAN/Qt/Car.pm
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;