summaryrefslogtreecommitdiffstats
path: root/PerlQt/tutorials/t14/GameBoard.pm
blob: a81deef7dfe8e7a9caf4f2cdbcc141af228a8ab3 (plain)
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
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;