1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
package GameBoard;
use QtCore4;
use QtGui4;
use QtCore4::isa qw(Qt::Widget);
use QtCore4::slots fire => [],
hit => [],
missed => [],
newGame => [];
use CannonField;
use LCDRange;
my @widgets;
sub NEW {
shift->SUPER::NEW(@_);
my $quit = Qt::PushButton("&Quit");
$quit->setFont(Qt::Font("Times", 18, Qt::Font::Bold()));
this->connect($quit, SIGNAL "clicked()", qApp, SLOT "quit()");
my $angle = LCDRange(undef, "ANGLE");
$angle->setRange(5, 70);
my $force = LCDRange(undef, "FORCE");
$force->setRange(10, 50);
my $cannonField = CannonField();
this->connect($angle, SIGNAL 'valueChanged(int)',
$cannonField, SLOT 'setAngle(int)');
this->connect($cannonField, SIGNAL 'angleChanged(int)',
$angle, SLOT 'setValue(int)');
this->connect($force, SIGNAL 'valueChanged(int)',
$cannonField, SLOT 'setForce(int)');
this->connect($cannonField, SIGNAL 'forceChanged(int)',
$force, SLOT 'setValue(int)');
this->connect($cannonField, SIGNAL 'hit()',
this, SLOT 'hit()');
this->connect($cannonField, SIGNAL 'missed()',
this, SLOT 'missed()');
my $shoot = Qt::PushButton("&Shoot");
$shoot->setFont(Qt::Font("Times", 18, Qt::Font::Bold()));
this->connect($shoot, SIGNAL 'clicked()',
this, SLOT 'fire()');
this->connect($cannonField, SIGNAL 'canShoot(bool)',
$shoot, SLOT 'setEnabled(bool)');
my $restart = Qt::PushButton("&New Game");
$restart->setFont(Qt::Font("Times", 18, Qt::Font::Bold()));
this->connect($restart, SIGNAL 'clicked()', this, SLOT 'newGame()');
my $hits = Qt::LCDNumber(2);
$hits->setSegmentStyle(Qt::LCDNumber::Filled());
my $shotsLeft = Qt::LCDNumber(2);
$shotsLeft->setSegmentStyle(Qt::LCDNumber::Filled());
my $hitsLabel = Qt::Label("HITS");
my $shotsLeftLabel = Qt::Label("SHOTS LEFT");
my $topLayout = Qt::HBoxLayout();
$topLayout->addWidget($shoot);
$topLayout->addWidget($hits);
$topLayout->addWidget($hitsLabel);
$topLayout->addWidget($shotsLeft);
$topLayout->addWidget($shotsLeftLabel);
$topLayout->addStretch(1);
$topLayout->addWidget($restart);
my $leftLayout = Qt::VBoxLayout();
$leftLayout->addWidget($angle);
$leftLayout->addWidget($force);
my $gridLayout = Qt::GridLayout();
$gridLayout->addWidget($quit, 0, 0);
$gridLayout->addLayout($topLayout, 0, 1);
$gridLayout->addLayout($leftLayout, 1, 0);
$gridLayout->addWidget($cannonField, 1, 1, 2, 1);
$gridLayout->setColumnStretch(1, 10);
this->setLayout($gridLayout);
$angle->setValue(60);
$force->setValue(25);
$angle->setFocus();
this->{angle} = $angle;
this->{force} = $force;
this->{cannonField} = $cannonField;
this->{shoot} = $shoot;
this->{restart} = $restart;
this->{hits} = $hits;
this->{shotsLeft} = $shotsLeft;
push @widgets, $cannonField;
newGame();
}
sub fire {
return if(this->{cannonField}->{gameOver} || this->{cannonField}->isShooting());
this->{shotsLeft}->display(this->{shotsLeft}->intValue() - 1);
this->{cannonField}->shoot();
}
sub hit {
this->{hits}->display(this->{hits}->intValue() + 1);
if (this->{shotsLeft}->intValue() == 0) {
this->{cannonField}->setGameOver();
}
else {
this->{cannonField}->newTarget();
emit this->{cannonField}->canShoot( 1 );
}
}
sub missed {
if (this->{shotsLeft}->intValue() == 0) {
this->{cannonField}->setGameOver();
}
}
sub newGame {
this->{shotsLeft}->display(15);
this->{hits}->display(0);
this->{cannonField}->restartGame();
this->{cannonField}->newTarget();
}
1;
|