import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.applet.AudioClip; public class JavaVijf extends Applet implements ActionListener { private TextField passwordEdit, xEdit, yEdit, breedteEdit, hoogteEdit; private Button autoButton; private AudioClip sound, sound2; private int x, y, breedte, hoogte; private Color lightBlue = new Color(173, 216, 230); private boolean unlocked = false, showAuto = false; public void init() { this.setBackground(Color.red); setLayout(null); autoButton = new Button("Toon auto"); passwordEdit = new TextField(""); xEdit = new TextField(""); yEdit = new TextField(""); breedteEdit = new TextField(""); hoogteEdit = new TextField(""); this.add(autoButton); this.add(passwordEdit); this.add(xEdit); this.add(yEdit); this.add(breedteEdit); this.add(hoogteEdit); autoButton .setVisible(false); xEdit .setVisible(false); yEdit .setVisible(false); breedteEdit.setVisible(false); hoogteEdit .setVisible(false); autoButton .addActionListener(this); passwordEdit.addActionListener(this); autoButton .setBounds(390, 470, 100, 19); passwordEdit.setBounds(200, 240, 100, 19); xEdit .setBounds(10, 470, 80, 19); yEdit .setBounds(100, 470, 80, 19); breedteEdit .setBounds(190, 470, 80, 19); hoogteEdit .setBounds(280, 470, 80, 19); passwordEdit.setBackground(Color.yellow); xEdit .setBackground(Color.orange); yEdit .setBackground(Color.cyan); breedteEdit .setBackground(Color.orange); hoogteEdit .setBackground(Color.cyan); passwordEdit.setEchoChar('*'); sound = getAudioClip(getDocumentBase(), "gong.au"); sound2 = getAudioClip(getDocumentBase(), "drip.au"); } public void paint(Graphics pen) { if (unlocked) { pen.setColor(lightBlue); // fill3DRect LIJKT beter te werken dan draw3DRect... pen.fill3DRect(0, 0, 500, 500, true); if (showAuto) { xEdit .setText("x=" + x); yEdit .setText("y=" + y); breedteEdit.setText("breedte=" + breedte); hoogteEdit .setText("hoogte=" + hoogte); pen.setColor(Color.magenta); this.tekenAuto(pen, x, y, breedte, hoogte); } } else { pen.setColor(Color.red); // fill3DRect LIJKT beter te werken dan draw3DRect... pen.fill3DRect(0, 0, 500, 500, true); pen.setColor(Color.black); pen.drawString("Typ a.u.b. het wachtwoord:", 180, 230); pen.setColor(Color.lightGray); pen.drawString("Het juiste wachtwoord is \"code\"!", 170, 280); } } private void tekenAuto(Graphics pen, int x, int y, int breedte, int hoogte) { /* multiBreedte en multiHoogte zijn de kleinste hoogte en breedte die * gebruikt gaan worden en als basis gaan dienen voor alle andere hoogtes * en breedten (de "multipliers"). * De originele en aanbevolen verhouding (anders zijn de wielen niet meer * rond maar ovaal) is: * breedte : hoogte * 6 : 5 * In dit geval was het niet meer mogelijk om de auto's een opschrift te * geven, omdat alleen de hoogte en niet de breedte aangegeven kan worden. */ double multiBreedte = (double) breedte / 12.0; double multiHoogte = (double) hoogte / 10.0; // teken het bovenstuk pen.drawLine((int) ((double) x + multiBreedte * 5.0), y, (int) ((double) x + multiBreedte * 3.0) , (int) ((double) y + multiHoogte * 4.0)); pen.drawLine((int) ((double) x + multiBreedte * 9.0), y, (int) ((double) x + multiBreedte * 11.0), (int) ((double) y + multiHoogte * 4.0)); pen.drawRect((int) ((double) x + multiBreedte * 5.0), y, (int) (multiBreedte * 4.0), (int) (multiHoogte * 4.0)); pen.fillRoundRect(x, (int) ((double) y + multiHoogte * 4.0), (int) (multiBreedte * 12.0), (int) (multiHoogte * 4.0), (int) multiBreedte, (int) multiHoogte); // teken de wielen this.tekenWiel(pen, (int) ((double) x + multiBreedte), (int) ((double) y + multiHoogte * 6.0), (int) (multiBreedte * 4.0), (int) (multiHoogte * 4.0)); this.tekenWiel(pen, (int) ((double) x + multiBreedte * 7.0), (int) ((double) y + multiHoogte * 6.0), (int) (multiBreedte * 4.0), (int) (multiHoogte * 4.0)); } private void tekenWiel(Graphics pen, int x, int y, int breedte, int hoogte) { // bewaar de oude kleur om die later te kunnen herstellen Color oudeKleur = pen.getColor(); // buitenste cirkel pen.setColor(Color.black); pen.fillOval(x, y, breedte, hoogte); // binnenste cirkel pen.setColor(Color.white); pen.fillOval(x + breedte / 4, y + hoogte / 4, breedte / 2, hoogte / 2); pen.setColor(oudeKleur); } public void actionPerformed(ActionEvent e) { Object sender = e.getSource(); if (sender == passwordEdit) this.passwordEditAction(); else if (sender == autoButton) this.autoButtonAction(); this.repaint(); } private void passwordEditAction() { if (passwordEdit.getText().equals("code")) { unlocked = true; passwordEdit.setVisible(false); autoButton .setVisible(true); this.setBackground(lightBlue); this.repaint(); } else passwordEdit.setText(""); } private void autoButtonAction() { showAuto = !showAuto; xEdit .setVisible(showAuto); yEdit .setVisible(showAuto); breedteEdit.setVisible(showAuto); hoogteEdit .setVisible(showAuto); if (showAuto) { sound .play(); sound2.stop(); autoButton.setLabel("Verberg auto"); x = (int) (Math.random() * 500.0); breedte = (int) (Math.random() * (500.0 - x)); y = (int) (Math.random() * 460.0); hoogte = (int) (Math.random() * (460.0 - y)); } else { sound .stop(); sound2.play(); autoButton.setLabel("Toon auto"); } } }