diff options
Diffstat (limited to 'qtjava/javalib/tutorial/t14')
-rw-r--r-- | qtjava/javalib/tutorial/t14/CannonField.java | 261 | ||||
-rw-r--r-- | qtjava/javalib/tutorial/t14/GameBoard.java | 118 | ||||
-rw-r--r-- | qtjava/javalib/tutorial/t14/LCDRange.java | 61 | ||||
-rw-r--r-- | qtjava/javalib/tutorial/t14/Tut14.java | 24 |
4 files changed, 464 insertions, 0 deletions
diff --git a/qtjava/javalib/tutorial/t14/CannonField.java b/qtjava/javalib/tutorial/t14/CannonField.java new file mode 100644 index 00000000..1ace9c78 --- /dev/null +++ b/qtjava/javalib/tutorial/t14/CannonField.java @@ -0,0 +1,261 @@ +import org.kde.qt.*; + +public class CannonField extends QWidget { + private int ang; + private int f; + + private int timerCount; + private QTimer autoShootTimer; + private float shoot_ang; + private float shoot_f; + + private QPoint target; + + private boolean gameEnded; + private boolean barrelPressed; + + private final QRect barrelRect = new QRect(33, -4, 15, 8); + + public CannonField(QWidget parent, String name) { + super(parent, name); + ang = 45; + f = 0; + timerCount = 0; + autoShootTimer = new QTimer(this, "movement handler"); + connect(autoShootTimer, SIGNAL("timeout()"), + this, SLOT("moveShot()")); + shoot_ang = 0; + shoot_f = 0; + target = new QPoint(0, 0); + gameEnded = false; + barrelPressed = false; + + setPalette(new QPalette(new QColor(250, 250, 200))); + newTarget(); + } + + public int angle() { + return ang; + } + + public void setAngle(int degrees) { + if (degrees < 5) + degrees = 5; + if (degrees > 70) + degrees = 70; + if (ang == degrees) + return; + ang = degrees; + repaint(); + emit("angleChanged", ang); + } + + public int force() { + return f; + } + + public void setForce(int newton) { + if (newton < 0) + newton = 0; + if (f == newton) + return; + f = newton; + emit("forceChanged", f); + } + + public void shoot() { + if (autoShootTimer.isActive()) + return; + timerCount = 0; + shoot_ang = ang; + shoot_f = f; + autoShootTimer.start(50); + emit("canShoot", false); + } + + public void newTarget() { + QRegion r = new QRegion(targetRect()); + target = new QPoint((int) (200 + Math.random()*190), + (int) (10 + Math.random()*255)); + repaint(r.unite(new QRegion(targetRect()))); + } + + public void setGameOver() { + if (gameEnded) + return; + if (isShooting()) + autoShootTimer.stop(); + gameEnded = true; + repaint(); + } + + public boolean gameOver() { + return gameEnded; + } + + public void restartGame() { + if (isShooting()) + autoShootTimer.stop(); + gameEnded = false; + repaint(); + emit("canShoot", true); + } + + + public void moveShot() { + QRegion r = new QRegion(shotRect()); + timerCount++; + + QRect shotR = shotRect(); + + if (shotR.intersects(targetRect())) { + autoShootTimer.stop(); + emit("hit"); + emit("canShoot", true); + } else if (shotR.x() > width() || shotR.y() > height() || + shotR.intersects(barrierRect())) { + autoShootTimer.stop(); + emit("missed"); + emit("canShoot", true); + } else { + r = r.unite(new QRegion(shotR)); + } + + repaint(r); + } + + protected void mousePressEvent(QMouseEvent e) { + if (e.button() != LeftButton) + return; + if (barrelHit(e.pos())) + barrelPressed = true; + } + + protected void mouseMoveEvent(QMouseEvent e) { + if (!barrelPressed) + return; + QPoint pnt = e.pos(); + if (pnt.x() <= 0) + pnt.setX(1); + if (pnt.y() >= height()) + pnt.setY(height() - 1); + double rad = Math.atan(((double)rect().bottom()-pnt.y())/pnt.x()); + setAngle((int) (rad*180/3.14159265)); + } + + protected void mouseReleaseEvent(QMouseEvent e) { + if (e.button() == LeftButton) + barrelPressed = true; + } + + + protected void paintEvent(QPaintEvent e) { + QRect updateR = e.rect(); + QPainter p = new QPainter(this); + + if (gameEnded) { + p.setPen(black()); + p.setFont(new QFont("Courier", 48, QFont.Bold, false)); + p.drawText(rect(), AlignCenter, "Game Over"); + } + if (updateR.intersects(cannonRect())) + paintCannon(p); + if (updateR.intersects(barrierRect())) + paintBarrier(p); + if (isShooting() && updateR.intersects(shotRect())) + paintShot(p); + if (!gameEnded && updateR.intersects(targetRect())) + paintTarget(p); + } + + private void paintShot(QPainter p) { + p.setBrush(black()); + p.setPen(NoPen); + p.drawRect(shotRect()); + } + + private void paintTarget(QPainter p) { + p.setBrush(red()); + p.setPen(black()); + p.drawRect(targetRect()); + } + + private void paintBarrier(QPainter p) { + p.setBrush(yellow()); + p.setPen(black()); + p.drawRect(barrierRect()); + } + + private void paintCannon(QPainter p) { + QRect cr = cannonRect(); + QPixmap pix = new QPixmap(cr.size()); + pix.fill(new QColor(250, 250, 200)); + + QPainter tmp = new QPainter(pix); + tmp.setBrush(blue()); + tmp.setPen(NoPen); + + tmp.translate(0, pix.height() - 1); + tmp.drawPie(new QRect(-35,-35, 70, 70), 0, 90*16); + tmp.rotate(-ang); + tmp.drawRect(barrelRect); + tmp.end(); + + p.drawPixmap(cr.topLeft(), pix); + } + + private QRect cannonRect() { + QRect r = new QRect(0, 0, 50, 50); + r.moveBottomLeft(rect().bottomLeft()); + return r; + } + + private QRect shotRect() { + final double gravity = 4; + + double time = timerCount / 4.0; + double velocity = shoot_f; + double radians = shoot_ang*3.14159265/180; + + double velx = velocity*Math.cos(radians); + double vely = velocity*Math.sin(radians); + double x0 = (barrelRect.right() + 5)*Math.cos(radians); + double y0 = (barrelRect.right() + 5)*Math.sin(radians); + double x = x0 + velx*time; + double y = y0 + vely*time - 0.5*gravity*time*time; + + QRect r = new QRect(0, 0, 6, 6); + r.moveCenter(new QPoint((int) x, height() - 1 - (int) y)); + return r; + } + + private QRect targetRect() { + QRect r = new QRect(0, 0, 20, 10); + r.moveCenter(new QPoint(target.x(),height() - 1 - target.y())); + return r; + } + + private QRect barrierRect() { + return new QRect(145, height() - 100, 15, 100); + } + + private boolean barrelHit(QPoint p) { + QWMatrix mtx = new QWMatrix(); + mtx.translate(0, height() - 1); + mtx.rotate(-ang); + mtx = mtx.invert(new boolean[1]); + return barrelRect.contains(mtx.map(p)); + } + + public boolean isShooting() { + return autoShootTimer.isActive(); + } + + public QSize sizeHint() { + return new QSize(400, 300); + } + + public QSizePolicy sizePolicy() { + return new QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding); + } +} diff --git a/qtjava/javalib/tutorial/t14/GameBoard.java b/qtjava/javalib/tutorial/t14/GameBoard.java new file mode 100644 index 00000000..46efa2eb --- /dev/null +++ b/qtjava/javalib/tutorial/t14/GameBoard.java @@ -0,0 +1,118 @@ +import org.kde.qt.*; + +public class GameBoard extends QWidget { + private QLCDNumber hits; + private QLCDNumber shotsLeft; + private CannonField cannonField; + + public GameBoard() { + super(null, "gameboard"); + QPushButton quit = new QPushButton("&Quit", this, "quit"); + quit.setFont(new QFont("Times", 18, QFont.Bold, false)); + + connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()")); + + LCDRange angle = new LCDRange("ANGLE", this, "angle"); + angle.setRange(5, 70); + + LCDRange force = new LCDRange("FORCE", this, "force"); + force.setRange(10, 50); + + QVBox box = new QVBox(this, "cannonFrame"); + box.setFrameStyle(QFrame.WinPanel | QFrame.Sunken); + + cannonField = new CannonField(box, "cannonField"); + + connect(angle, SIGNAL("valueChanged(int)"), + cannonField, SLOT("setAngle(int)")); + connect(cannonField, SIGNAL("angleChanged(int)"), + angle, SLOT("setValue(int)")); + + connect(force, SIGNAL("valueChanged(int)"), + cannonField, SLOT("setForce(int)")); + connect(cannonField, SIGNAL("forceChanged(int)"), + force, SLOT("setValue(int)")); + + connect(cannonField, SIGNAL("hit()"), + this, SLOT("hit()")); + connect(cannonField, SIGNAL("missed()"), + this, SLOT("missed()")); + + QPushButton shoot = new QPushButton("&Shoot", this, "shoot"); + shoot.setFont(new QFont("Times", 18, QFont.Bold, false)); + + connect(shoot, SIGNAL("clicked()"), SLOT("fire()")); + + QPushButton restart = new QPushButton("&New Game", this, "newgame"); + restart.setFont(new QFont("Times", 18, QFont.Bold, false)); + + connect(restart, SIGNAL("clicked()"), this, SLOT("newGame()")); + + hits = new QLCDNumber(2, this, "hits"); + shotsLeft = new QLCDNumber(2, this, "shotsleft"); + QLabel hitsL = new QLabel("HITS", this, "hitsLabel", 0); + QLabel shotsLeftL = new QLabel("SHOTS LEFT", this, "shotsleftLabel", 0); + + QAccel accel = new QAccel(this); + accel.connectItem(accel.insertItem(new QKeySequence(Key_Enter)), this, SLOT("fire()")); + accel.connectItem(accel.insertItem(new QKeySequence(Key_Return)), this, SLOT("fire()")); + accel.connectItem(accel.insertItem(new QKeySequence(CTRL+Key_Q)), qApp(), SLOT("quit()")); +/*** + accel.connectItem(accel.insertItem(Key_Enter), this, SLOT("fire()")); + accel.connectItem(accel.insertItem(Key_Return), this, SLOT("fire()")); + accel.connectItem(accel.insertItem(CTRL+Key_Q), qApp(), SLOT("quit()")); +***/ + QGridLayout grid = new QGridLayout(this, 2, 2, 10, -1, null); + grid.addWidget(quit, 0, 0); + grid.addWidget(box, 1, 1); + grid.setColStretch(1, 10); + + QVBoxLayout leftBox = new QVBoxLayout(); + grid.addLayout(leftBox, 1, 0); + leftBox.addWidget(angle); + leftBox.addWidget(force); + + QHBoxLayout topBox = new QHBoxLayout(); + 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(); + } + + protected void fire() { + if (cannonField.gameOver() || cannonField.isShooting()) + return; + shotsLeft.display(shotsLeft.intValue() - 1); + cannonField.shoot(); + } + + protected void hit() { + hits.display(hits.intValue() + 1); + if (shotsLeft.intValue() == 0) + cannonField.setGameOver(); + else + cannonField.newTarget(); + } + + protected void missed() { + if (shotsLeft.intValue() == 0) + cannonField.setGameOver(); + } + + protected void newGame() { + shotsLeft.display(15); + hits.display(0); + cannonField.restartGame(); + cannonField.newTarget(); + } +} diff --git a/qtjava/javalib/tutorial/t14/LCDRange.java b/qtjava/javalib/tutorial/t14/LCDRange.java new file mode 100644 index 00000000..bf5001db --- /dev/null +++ b/qtjava/javalib/tutorial/t14/LCDRange.java @@ -0,0 +1,61 @@ +import org.kde.qt.*; + +public class LCDRange extends QWidget { + private QSlider slider; + private QLabel label; + + public LCDRange(QWidget parent, String name) { + super(parent, name); + init(); + } + + public LCDRange(String s, QWidget parent, String name) { + super(parent, name); + init(); + setText(s); + } + + private void init() { + QLCDNumber lcd = new QLCDNumber(2, this, "lcd"); + slider = new QSlider(Horizontal, this, "slider"); + slider.setRange(0, 99); + slider.setValue(0); + + label = new QLabel(" ", this, "label", 0); + label.setAlignment(AlignCenter); + + connect(slider, SIGNAL("valueChanged(int)"), + lcd, SLOT("display(int)")); + connect(slider, SIGNAL("valueChanged(int)"), + SIGNAL("valueChanged(int)")); + + setFocusProxy(slider); + + QVBoxLayout l = new QVBoxLayout(this); + l.addWidget(lcd, 1); + l.addWidget(slider); + l.addWidget(label); + } + + public int value() { + return slider.value(); + } + + public void setValue(int value) { + slider.setValue(value); + } + + public void setRange(int minVal, int maxVal) { + if (minVal < 0 || maxVal > 99 || minVal > maxVal) { + qWarning("LCDRange::setRange("+minVal+","+maxVal+")\n"+ + "\tRange must be 0..99\n"+ + "\tand minVal must not be greater than maxVal"); + return; + } + slider.setRange(minVal, maxVal); + } + + public void setText(String s) { + label.setText(s); + } +} diff --git a/qtjava/javalib/tutorial/t14/Tut14.java b/qtjava/javalib/tutorial/t14/Tut14.java new file mode 100644 index 00000000..ace919c3 --- /dev/null +++ b/qtjava/javalib/tutorial/t14/Tut14.java @@ -0,0 +1,24 @@ +import org.kde.qt.*; + +public class Tut14 extends QObject { + public static void main(String[] args) { + QApplication.setColorSpec(QApplication.CustomColor); + QApplication a = new QApplication(args); + + GameBoard gb = new GameBoard(); + gb.setGeometry(100, 100, 500, 355); + a.setMainWidget(gb); + gb.show(); + a.exec(); + return; + } + + static { + try { + Class c = Class.forName("org.kde.qt.qtjava"); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("Can't load qtjava class"); + } + } +} |