package CannonField;
use Qt 2.0;
use Qt::signals 'angleChanged(int)', 'forceChanged(int)';
use Qt::slots 'setAngle(int)', 'setForce(int)';
@ISA = qw(Qt::Widget);
sub new {
my $self = shift->SUPER::new(@_);
$self->{'ang'} = 45;
$self->{'f'} = 0;
return $self;
}
sub angle { return shift->{'ang'} }
sub force { return shift->{'f'} }
sub setAngle {
my $self = shift;
my $degrees = shift;
$degrees = 5 if $degrees < 5;
$degrees = 70 if $degrees > 70;
return if $self->{'ang'} == $degrees;
$self->{'ang'} = $degrees;
$self->repaint($self->cannonRect(), 0);
emit $self->angleChanged($self->{'ang'});
}
sub setForce {
my $self = shift;
my $newton = shift;
$newton = 0 if $newton < 0;
return if $self->{'f'} == $newton;
$self->{'f'} = $newton;
emit $self->forceChanged($self->{'f'});
}
sub paintEvent {
my $self = shift;
my $e = shift;
if($e->rect()->intersects($self->cannonRect())) {
my $p = Qt::Painter->new($self);
$self->paintCannon($p);
}
}
sub paintCannon {
my $self = shift;
my $p = shift;
my $cr = $self->cannonRect();
my $pix = Qt::Pixmap->new($cr->size());
$pix->fill($self, $cr->topLeft());
my $tmp = Qt::Painter->new($pix);
$tmp->setBrush(Qt::blue);
$tmp->setPen(Qt::NoPen);
$tmp->translate(0, $pix->height() - 1);
$tmp->drawPie(Qt::Rect->new(-35, -35, 70, 70), 0, 90*16);
$tmp->rotate(-$self->{'ang'});
$tmp->drawRect(Qt::Rect->new(33, -4, 15, 8));
$tmp->end();
$p->drawPixmap($cr->topLeft(), $pix);
}
sub cannonRect {
my $self = shift;
my $r = Qt::Rect->new(0, 0, 50, 50);
$r->moveBottomLeft($self->rect()->bottomLeft());
return $r;
}
sub sizePolicy {
return Qt::SizePolicy->new(Qt::SizePolicy::Expanding,
Qt::SizePolicy::Expanding);
}