summaryrefslogtreecommitdiffstats
path: root/PerlTQt/tutorials/t13/GameBoard.pm
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2012-01-01 18:29:30 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2012-01-01 18:29:30 -0600
commitb2af005db21bd8fd068cb79b2ae700953128af2c (patch)
treeabd0ed633726bf0bbecb57d30e92836c31e02695 /PerlTQt/tutorials/t13/GameBoard.pm
parentc1b9383f2032d82db5eb8918dca885e37a901dde (diff)
downloadlibtqt-perl-b2af005db21bd8fd068cb79b2ae700953128af2c.tar.gz
libtqt-perl-b2af005db21bd8fd068cb79b2ae700953128af2c.zip
Move PerlQt
Diffstat (limited to 'PerlTQt/tutorials/t13/GameBoard.pm')
-rw-r--r--PerlTQt/tutorials/t13/GameBoard.pm114
1 files changed, 114 insertions, 0 deletions
diff --git a/PerlTQt/tutorials/t13/GameBoard.pm b/PerlTQt/tutorials/t13/GameBoard.pm
new file mode 100644
index 0000000..52f5e9b
--- /dev/null
+++ b/PerlTQt/tutorials/t13/GameBoard.pm
@@ -0,0 +1,114 @@
+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);
+
+ cannonField = CannonField(this, "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 $grid = TQt::GridLayout(this, 2, 2, 10);
+ $grid->addWidget($quit, 0, 0);
+ $grid->addWidget(cannonField, 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;