diff options
Diffstat (limited to 'PerlTQt/tutorials/t14/GameBoard.pm')
-rw-r--r-- | PerlTQt/tutorials/t14/GameBoard.pm | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/PerlTQt/tutorials/t14/GameBoard.pm b/PerlTQt/tutorials/t14/GameBoard.pm new file mode 100644 index 0000000..a81deef --- /dev/null +++ b/PerlTQt/tutorials/t14/GameBoard.pm @@ -0,0 +1,125 @@ +package GameBoard; +use strict; +use TQt; +use TQt::isa qw(TQt::Widget); +use TQt::slots + fire => [], + hit => [], + missed => [], + newGame => []; +use TQt::attributes qw( + hits + shotsLeft + cannonField +); + +use LCDRange; +use CannonField; + +sub NEW { + shift->SUPER::NEW(@_); + + my $quit = TQt::PushButton("&Quit", this, "quit"); + $quit->setFont(TQt::Font("Times", 18, &TQt::Font::Bold)); + + TQt::app->connect($quit, TQT_SIGNAL('clicked()'), TQT_SLOT('quit()')); + + my $angle = LCDRange("ANGLE", this, "angle"); + $angle->setRange(5, 70); + + my $force = LCDRange("FORCE", this, "force"); + $force->setRange(10, 50); + + my $box = TQt::VBox(this, "cannonFrame"); + $box->setFrameStyle($box->WinPanel | $box->Sunken); + + cannonField = CannonField($box, "cannonField"); + + cannonField->connect($angle, TQT_SIGNAL('valueChanged(int)'), TQT_SLOT('setAngle(int)')); + $angle->connect(cannonField, TQT_SIGNAL('angleChanged(int)'), TQT_SLOT('setValue(int)')); + + cannonField->connect($force, TQT_SIGNAL('valueChanged(int)'), TQT_SLOT('setForce(int)')); + $force->connect(cannonField, TQT_SIGNAL('forceChanged(int)'), TQT_SLOT('setValue(int)')); + + this->connect(cannonField, TQT_SIGNAL('hit()'), TQT_SLOT('hit()')); + this->connect(cannonField, TQT_SIGNAL('missed()'), TQT_SLOT('missed()')); + + my $shoot = TQt::PushButton('&Shoot', this, "shoot"); + $shoot->setFont(TQt::Font("Times", 18, &TQt::Font::Bold)); + + this->connect($shoot, TQT_SIGNAL('clicked()'), TQT_SLOT('fire()')); + + $shoot->connect(cannonField, TQT_SIGNAL('canShoot(bool)'), TQT_SLOT('setEnabled(bool)')); + + my $restart = TQt::PushButton('&New Game', this, "newgame"); + $restart->setFont(TQt::Font("Times", 18, &TQt::Font::Bold)); + + this->connect($restart, TQT_SIGNAL('clicked()'), TQT_SLOT('newGame()')); + + hits = TQt::LCDNumber(2, this, "hits"); + shotsLeft = TQt::LCDNumber(2, this, "shotsleft"); + my $hitsL = TQt::Label("HITS", this, "hitsLabel"); + my $shotsLeftL = TQt::Label("SHOTS LEFT", this, "shotsLeftLabel"); + + my $accel = TQt::Accel(this); + $accel->connectItem($accel->insertItem(TQt::KeySequence(int &Key_Enter)), + this, TQT_SLOT('fire()')); + $accel->connectItem($accel->insertItem(TQt::KeySequence(int &Key_Return)), + this, TQT_SLOT('fire()')); + $accel->connectItem($accel->insertItem(TQt::KeySequence(int &CTRL+&Key_Q)), + TQt::app, TQT_SLOT('quit()')); + + my $grid = TQt::GridLayout(this, 2, 2, 10); + $grid->addWidget($quit, 0, 0); + $grid->addWidget($box, 1, 1); + $grid->setColStretch(1, 10); + + my $leftBox = TQt::VBoxLayout; + $grid->addLayout($leftBox, 1, 0); + $leftBox->addWidget($angle); + $leftBox->addWidget($force); + + my $topBox = TQt::HBoxLayout; + $grid->addLayout($topBox, 0, 1); + $topBox->addWidget($shoot); + $topBox->addWidget(hits); + $topBox->addWidget($hitsL); + $topBox->addWidget(shotsLeft); + $topBox->addWidget($shotsLeftL); + $topBox->addStretch(1); + $topBox->addWidget($restart); + + $angle->setValue(60); + $force->setValue(25); + $angle->setFocus(); + + newGame(); +} + +sub fire { + return if cannonField->gameOver or cannonField->isShooting; + shotsLeft->display(int(shotsLeft->intValue - 1)); + cannonField->shoot; +} + +sub hit { + hits->display(int(hits->intValue + 1)); + if(shotsLeft->intValue == 0) { + cannonField->setGameOver; + } else { + cannonField->newTarget; + } +} + +sub missed { + cannonField->setGameOver if shotsLeft->intValue == 0; +} + +sub newGame { + shotsLeft->display(int(15)); + hits->display(0); + cannonField->restartGame; + cannonField->newTarget; +} + +1; |