Benutzer-Werkzeuge

Webseiten-Werkzeuge


projects:spacedebris:aufgabe2:loesung:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
projects:spacedebris:aufgabe2:loesung:start [2021/03/20 22:21] – angelegt Martin Pabstprojects:spacedebris:aufgabe2:loesung:start [2021/12/29 11:29] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 3: Zeile 3:
   - **Freiwillig:** Mit fortschreitender Spieldauer sollen die Rechtecke und das Raumschiff schneller werden. Zudem sollen mehr Rechtecke je Zeiteinheit von rechts hereinfliegen.   - **Freiwillig:** Mit fortschreitender Spieldauer sollen die Rechtecke und das Raumschiff schneller werden. Zudem sollen mehr Rechtecke je Zeiteinheit von rechts hereinfliegen.
  
 +{{ youtube>rFhJp8ceEaU?large }}
  
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 400px; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'spacedebris4'}">
 +
 +<script type="text/plain" title="SpaceDebrisGame.java">
 +new SpaceDebrisGame();
 +
 +
 +class SpaceDebrisGame extends Actor {
 +   
 +   Spaceship spaceship;
 +
 +   Group debrisGroup = new Group();
 +
 +   Group bullets = new Group();
 +
 +   double debrisRate = 0.06;
 +
 +   int ships = 3;
 +   Text shipsText;
 +   Text bigText;
 +   
 +   Text punkteAnzeige;
 +   int punkte = 0;
 +
 +   String zustand = "";
 +   int lastTimeFired = 0;
 +
 +   int spielzeit = 0;   // spielzeit in 1/30 s
 +
 +
 +   SpaceDebrisGame() {
 +      super();
 +      spaceship = new Spaceship();
 +      shipsText = new Text(10, 10, 40, 3);
 +      bigText = new Text(400, 200, 80, "");
 +      bigText.setAlignment(Alignment.center);
 +
 +      punkteAnzeige = new Text(750, 10, 40, 0);
 +      punkteAnzeige.setAlignment(Alignment.right);
 +
 +      setZustand("startScreen");
 +   }
 +
 +   public void act() {
 +
 +      spielzeit++;
 +      
 +      spaceship.v = 4 + 4 * spielzeit / 9000.0;
 +
 +      if(isKeyDown(" ")) {
 +         if(zustand == "startScreen") {
 +            setZustand("gameRunning");
 +         } else if(zustand == "gameOver") {
 +            setZustand("startScreen");
 +         }
 +      }
 +
 +      if(zustand != "gameRunning") {
 +         return;
 +      }
 +
 +      if(Math.random() < debrisRate + debrisRate * (spielzeit / 6000.0)) {
 +
 +         double factor = 1 + spielzeit / 9000.0;
 +
 +         double vx = (-5 - Math.random() * 10) * factor;
 +         double vy = (Math.random() * 10 - 5) * factor;
 +
 +         Debris debris = new Debris(vx, vy);
 +         debrisGroup.add(debris);
 +      }
 +
 +      if(isKeyDown(" ") && System.currentTimeMillis() - lastTimeFired > 300) {
 +         Bullet b = new Bullet(spaceship.getCenterX(), spaceship.getCenterY());
 +         bullets.add(b);
 +         lastTimeFired = System.currentTimeMillis();
 +      }
 +
 +      CollisionPair[] pairs = bullets.getCollisionPairs(debrisGroup, true);
 +      for(int i = 0; i < pairs.length; i++) {
 +         CollisionPair pair = pairs[i];
 +         Debris debris = (Debris)pair.shapeB;
 +         debris.explode();
 +
 +         double fläche = debris.getWidth() * debris.getHeight();
 +         punkte = punkte - Math.round(0.0024 * (fläche - 2500)) + 100;
 +         punkteAnzeige.setText(punkte);
 +
 +         pair.shapeA.destroy();
 +         pair.shapeB.destroy();
 +      }
 +
 +      Shape[] collidingDebris = debrisGroup.getCollidingShapes(spaceship);
 +
 +      for(int i = 0; i < collidingDebris.length; i++) {
 +         Debris debris = (Debris)collidingDebris[i];
 +         debris.explode();
 +         debris.destroy();
 +         ships--;
 +         shipsText.setText(ships);
 +         if(ships == 0) {
 +            setZustand("gameOver");
 +         }
 +      }
 +
 +
 +
 +   }
 +
 +
 +   void setZustand(String neuerZustand) {
 +      
 +      if(neuerZustand == "startScreen") {
 +         debrisGroup.destroyAllChildren();
 +         spaceship.setVisible(false);
 +         bullets.destroyAllChildren();
 +         bigText.setVisible(true);
 +         bigText.setText("Space Debris-Game");
 +      } else if(neuerZustand == "gameRunning") {
 +         spielzeit = 0;
 +         punkte = 0;
 +         punkteAnzeige.setText(0);
 +         spaceship.setVisible(true);
 +         bigText.setVisible(false);
 +         ships = 3;
 +         shipsText.setText(ships); 
 +      } else if(neuerZustand == "gameOver") {
 +         debrisGroup.destroyAllChildren();
 +         spaceship.setVisible(false);
 +         bullets.destroyAllChildren();
 +         bigText.setVisible(true);
 +         bigText.setText("Game Over");
 +      }
 +
 +
 +      zustand = neuerZustand;
 +   }
 +
 +
 +
 +}
 +
 +</script>
 +<script type="text/plain" title="Bullet.java">
 +class Bullet extends Circle {
 +
 +   Bullet(double x, double y) {
 +      super(x, y, 5);
 +   }
 +
 +   public void act() {
 +      move(30, 0);
 +      if(isOutsideView()) {
 +         destroy();
 +      }
 +   }
 +   
 +}
 +</script>
 +<script type="text/plain" title="Debris.java">
 +class Debris extends Rectangle {
 +   
 +   double w = Math.random() * 10 - 5;
 +   double vx;
 +   double vy;
 +
 +   Debris(double vx, double vy) {
 +      
 +      super(830, Math.random() * 500 + 50, Math.random() * 150 + 50, Math.random() * 150 + 50);
 +
 +      this.vx = vx;
 +      this.vy = vy;
 +
 +      setFillColor(Color.randomColor(50));
 +      setAlpha(Math.random() * 0.5 + 0.5);
 +
 +   }
 +
 +   
 +   public void act() {
 +      move(vx, vy);
 +      rotate(w);
 +
 +      if(getCenterX() < 100 && isOutsideView()) {
 +         destroy();
 +      }
 +   }
 +
 +   void explode() {
 +      Sprite explosion = new Sprite(getCenterX(), getCenterY(), SpriteLibrary.Explosion_1, 0, ScaleMode.linear);
 +      explosion.scale(8 * getWidth() * getHeight() / 40000);
 +      explosion.playAnimation(0, 55, RepeatType.once, 30);
 +      Sound.playSound(Sound.far_bomb);
 +   }
 +
 +}
 +</script>
 +<script type="text/plain" title="Spaceship.java">
 +new Spaceship();
 +
 +
 +class Spaceship extends Sprite {
 +   
 +   double v = 4.0;
 +
 +   Spaceship() {
 +      super(50, 300, SpriteLibrary.Ship_Adrian, 0, ScaleMode.nearest_neighbour);
 +      scale(1.5);
 +   }
 +
 +   public void act() {
 +      
 +      double vx = 0;
 +      double vy = 0;
 +
 +      if(isKeyDown(Key.ArrowUp) && getCenterY() > 20) {
 +         vy = -v;
 +      }
 +      if(isKeyDown(Key.ArrowDown) && getCenterY() < getWorld().getHeight() - 20) {
 +         vy = v;
 +      }
 +      if(isKeyDown(Key.ArrowLeft) && getCenterX() > 45) {
 +         vx = -v;
 +      }
 +      if(isKeyDown(Key.ArrowRight) && getCenterX() < getWorld().getWidth() / 2) {
 +         vx = v;
 +      }
 +
 +      double l = Math.sqrt(vx * vx + vy * vy);
 +      if(l > 0) {
 +         vx = vx / l * v;
 +         vy = vy / l * v;
 +         move(vx, vy);
 +      }
 +
 +   }
 +
 +
 +}
 +</script>
 +
 +</div>
 +
 +</HTML>
projects/spacedebris/aufgabe2/loesung/start.1616275316.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki