diff options
Diffstat (limited to 'qtjava/javalib/tutorial/t12')
-rw-r--r-- | qtjava/javalib/tutorial/t12/CannonField.java | 173 | ||||
-rw-r--r-- | qtjava/javalib/tutorial/t12/LCDRange.java | 56 | ||||
-rw-r--r-- | qtjava/javalib/tutorial/t12/Tut12.java | 74 |
3 files changed, 303 insertions, 0 deletions
diff --git a/qtjava/javalib/tutorial/t12/CannonField.java b/qtjava/javalib/tutorial/t12/CannonField.java new file mode 100644 index 00000000..28077c15 --- /dev/null +++ b/qtjava/javalib/tutorial/t12/CannonField.java @@ -0,0 +1,173 @@ +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 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); + + 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); + } + + 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 moveShot() { + QRegion r = new QRegion(shotRect()); + timerCount++; + + QRect shotR = shotRect(); + + if (shotR.intersects(targetRect())) { + autoShootTimer.stop(); + emit("hit"); + } else if (shotR.x() > width() || shotR.y() > height()) { + autoShootTimer.stop(); + emit("missed"); + } else { + r = r.unite(new QRegion(shotR)); + } + + repaint(r); + } + + public void paintEvent(QPaintEvent e) { + QRect updateR = e.rect(); + QPainter p = new QPainter(this); + + if (updateR.intersects(cannonRect())) + paintCannon(p); + if (autoShootTimer.isActive() && updateR.intersects(shotRect())) + paintShot(p); + if (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 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; + } + + public QSizePolicy sizePolicy() { + return new QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding); + } +} diff --git a/qtjava/javalib/tutorial/t12/LCDRange.java b/qtjava/javalib/tutorial/t12/LCDRange.java new file mode 100644 index 00000000..3211120b --- /dev/null +++ b/qtjava/javalib/tutorial/t12/LCDRange.java @@ -0,0 +1,56 @@ +import org.kde.qt.*; + +public class LCDRange extends QVBox { + 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); + } + + 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/t12/Tut12.java b/qtjava/javalib/tutorial/t12/Tut12.java new file mode 100644 index 00000000..eb0dc917 --- /dev/null +++ b/qtjava/javalib/tutorial/t12/Tut12.java @@ -0,0 +1,74 @@ +import org.kde.qt.*; + +public class Tut12 extends QWidget { + public Tut12() { + 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); + + CannonField cannonField = new CannonField(this, "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)")); + + + QPushButton shoot = new QPushButton("&Shoot", this, "shoot"); + shoot.setFont(new QFont("Times", 18, QFont.Bold, false)); + + connect(shoot, SIGNAL("clicked()"), cannonField, SLOT("shoot()")); + + QGridLayout grid = new QGridLayout(this, 2, 2, 10, -1, null); + grid.addWidget(quit, 0, 0); + grid.addWidget(cannonField, 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.addStretch(1); + + angle.setValue(60); + force.setValue(25); + angle.setFocus(); + } + + public static void main(String[] args) { + QApplication.setColorSpec(QApplication.CustomColor); + QApplication a = new QApplication(args); + Tut12 w = new Tut12(); + w.setGeometry( 100, 100, 500, 355 ); + + a.setMainWidget(w); + w.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"); + } + } +} |