Benutzer-Werkzeuge

Webseiten-Werkzeuge


wiederholung:eigeneklassen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
wiederholung:eigeneklassen [2023/06/11 13:53] – [Beispiel 3: Fliegende Rechtecke] Martin Pabstwiederholung:eigeneklassen [2023/06/11 15:01] (aktuell) – [Projekt: Einfaches Weltraumspiel (Variante Jgst. 10)] Martin Pabst
Zeile 150: Zeile 150:
 [[.baum:loesung|Hier geht's zur Lösung.]] [[.baum:loesung|Hier geht's zur Lösung.]]
  
 +<HTML><div style="clear: both"></div></HTML>
 ===== Beispiel 3: Fliegende Rechtecke ===== ===== Beispiel 3: Fliegende Rechtecke =====
 +{{ :wiederholung:pasted:20230611-155635.png}}
 <WRAP center round info 60%> <WRAP center round info 60%>
 Wir schreiben unser erstes eigenes [[https://en.wikipedia.org/wiki/Particle_system| particle system]]: Die Partikel sind kleine Rechtecke (30 x 50 Pixel groß), die von der Mitte der unteren Zeichenflächenkante aus mit einer zufälligen Anfangsgeschwindigkeit nach oben geschleudert werden. Ihre Geschwindigkeit soll je Zeiteinheit um 0.1 zunehmen, so dass es aussieht, als würden sie durch eine Gravitationskraft nach unten beschleunigt. \\  Wir schreiben unser erstes eigenes [[https://en.wikipedia.org/wiki/Particle_system| particle system]]: Die Partikel sind kleine Rechtecke (30 x 50 Pixel groß), die von der Mitte der unteren Zeichenflächenkante aus mit einer zufälligen Anfangsgeschwindigkeit nach oben geschleudert werden. Ihre Geschwindigkeit soll je Zeiteinheit um 0.1 zunehmen, so dass es aussieht, als würden sie durch eine Gravitationskraft nach unten beschleunigt. \\ 
Zeile 207: Zeile 208:
 </WRAP> </WRAP>
  
 +[[.particleloesung:start|Hier geht's zur Lösung!]]
  
  
-[[.particleloesung:start|Hier geht's zur Lösung!]]+===== Projekt: Einfaches Weltraumspiel (Variante Jgst9) ===== 
 +<HTML> 
 + 
 +<div class="java-online" style="height70vh; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'Spaceshooter'}"> 
 + 
 +<script type="text/plain" title="Spaceship.java"> 
 +//Hauptprogramm: 
 +new Spaceship(400, 550); 
 + 
 +class Spaceship extends Sprite { 
 + 
 +   int spaceLastPressedTime = 0; 
 + 
 +   public Spaceship(double x, double y) { 
 +      super(x, y, SpriteLibrary.Space_Shooter_2, 4); 
 +      scale(2); 
 +   } 
 + 
 +   public void act() { 
 +      if(isKeyDown(Key.ArrowLeft)) { 
 +         move(-5, 0); 
 +      } 
 + 
 +      if(isKeyDown(Key.ArrowRight)) { 
 +         move(5, 0); 
 +      } 
 + 
 +      int time = System.currentTimeMillis(); 
 + 
 +      if(isKeyDown(" ") && time - spaceLastPressedTime > 300) { 
 +         spaceLastPressedTime = time; 
 +         new Bullet(getCenterX(), getCenterY(), 0, -20); 
 +      } 
 + 
 +      if(Math.random() < 0.05) { 
 +         new Target(); 
 +      } 
 + 
 +      if(getFirstCollidingSprite(9) != null) { 
 +         println("Game over!"); 
 +         System.exit(0); 
 +      } 
 + 
 +   } 
 + 
 +
 +</script> 
 +<script type="text/plain" title="Bullet.java"> 
 +class Bullet extends Circle { 
 + 
 +   double vx; 
 +   double vy; 
 + 
 +   public Bullet(double x, double y, double vx, double vy) { 
 +      super(x, y, 10); 
 +      this.vx = vx; 
 +      this.vy = vy; 
 +      this.sendToBack(); 
 +      this.setFillColor(0xff0000); 
 +   } 
 + 
 +   public void act() { 
 +      move(vx, vy); 
 +      if(isOutsideView()) { 
 +         destroy(); 
 +      } 
 +   } 
 +   
 +
 +</script> 
 +<script type="text/plain" title="Target.java"> 
 +public class Target extends Sprite { 
 +    
 +   double vx; 
 +   double vy; 
 + 
 +   public Target() { 
 +      super(Random.randint(0, 800), -50, SpriteLibrary.Breakin, 9); 
 +      this.vx = Random.randint(-5, 5); 
 +      this.vy = Random.randint(3, 10); 
 +   } 
 + 
 +   public void act() { 
 + 
 +      move(vx, vy); 
 + 
 +      if(getCenterY() > 620) { 
 +         destroy(); 
 +         return; 
 +      }  
 + 
 +      if(collidesWithFillColor(0xff0000)) { 
 +         Sprite explosion = new Sprite(getCenterX(), getCenterY(), SpriteLibrary.Explosion_1); 
 +         explosion.playAnimation(0, 55, RepeatType.once, 30); 
 +         destroy(); 
 +      } 
 + 
 +   } 
 + 
 +
 + 
 +</script> 
 +</div> 
 + 
 +</HTML> 
 + 
 +<WRAP center round todo 60%> 
 +**Aufgaben:** \\ 
 +  * Die Bullets sind bisher nur einfache Kreise. Schöner wäre ein geeignetes Sprite! 
 +  * Trifft ein Bullet ein Target, so soll auch das Bullet vernichtet werden. 
 +  * Ersetze die Explosion der Targets durch ein Particle System (z.B. umherfliegende Dreiecke). Trifft ein Particle das Raumschiff, soll es zerstört werden. 
 +</WRAP> 
 + 
 +===== Projekt: Einfaches Weltraumspiel (Variante Jgst. 10) ===== 
 +<HTML> 
 + 
 +<div class="java-online" style="height: 70vh; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'Spaceshooter10'}"> 
 + 
 +<script type="text/plain" title="Main.java"> 
 +new Main(); 
 + 
 +class Main extends Actor { 
 +    
 +   Spaceship spaceship; 
 +   String state; 
 + 
 +   Text caption; 
 +    
 +   int score = 0; 
 +   Text scoreDisplay; 
 + 
 +   int lastTimeSpacePressed; 
 + 
 +   public Main() { 
 + 
 +      caption = new Text(400, 200, 60, "Space shooter"); 
 +      caption.setAlignment(Alignment.center); 
 + 
 +      scoreDisplay = new Text(10, 10, 32, "0"); 
 + 
 +      spaceship = new Spaceship(400, 550, this); 
 +       
 +      setState("startscreen"); 
 +   } 
 + 
 +   public void act() { 
 +      if(state == "gamerunning") { 
 +         if(Math.random() < 0.05) { 
 +            new Target(this); 
 +         } 
 +      } else if(isKeyDown(" ") && System.currentTimeMillis() - lastTimeSpacePressed > 700) { 
 +         lastTimeSpacePressed = System.currentTimeMillis(); 
 +         switch(state) { 
 +            case "gameoverscreen" :  
 +               setState("startscreen"); 
 +               break; 
 +            case "startscreen" :  
 +               setState("gamerunning"); 
 +               break; 
 +            default :  
 +                 
 +         } 
 +      } 
 +       
 +   } 
 + 
 +   public void setState(String newState) { 
 +       
 +      switch(newState) { 
 +         case "startscreen" :  
 +            caption.setVisible(true); 
 +            spaceship.setVisible(false); 
 +            caption.setText("Space shooter"); 
 +            break; 
 +         case "gamerunning" :  
 +            score = 0; 
 +            displayScore(); 
 +            caption.setVisible(false); 
 +            spaceship.setVisible(true); 
 +            break; 
 +         case "gameoverscreen" :  
 +            caption.setVisible(true); 
 +            spaceship.setVisible(false); 
 +            caption.setText("Game over"); 
 +            break; 
 +         default :  
 +              
 +      } 
 + 
 + 
 +      state = newState; 
 +   } 
 + 
 +   public void increaseScore(int delta) { 
 +      score += delta;  
 +      displayScore(); 
 +   } 
 +    
 +   public void displayScore() { 
 +      scoreDisplay.setText(score); 
 +   } 
 + 
 +}</script> 
 +<script type="text/plain" title="Spaceship.java"> 
 +class Spaceship extends Sprite { 
 + 
 +   int spaceLastPressedTime = 0; 
 +   Main main; 
 + 
 +   public Spaceship(double x, double y, Main main) { 
 +      super(x, y, SpriteLibrary.Space_Shooter_2, 4); 
 +      this.main = main; 
 +      scale(2); 
 +   } 
 + 
 +   public void act() { 
 +      if(main.state != "gamerunning") return; 
 +       
 +      if(isKeyDown(Key.ArrowLeft)) { 
 +         move(-5, 0); 
 +      } 
 + 
 +      if(isKeyDown(Key.ArrowRight)) { 
 +         move(5, 0); 
 +      } 
 + 
 +      int time = System.currentTimeMillis(); 
 + 
 +      if(isKeyDown(" ") && time - spaceLastPressedTime > 300) { 
 +         spaceLastPressedTime = time; 
 +         new Bullet(getCenterX(), getCenterY(), 0, -20); 
 +      } 
 + 
 +      if(getFirstCollidingSprite(9) != null) { 
 +         main.setState("gameoverscreen"); 
 +      } 
 + 
 +   } 
 + 
 +
 +</script> 
 +<script type="text/plain" title="Bullet.java"> 
 +class Bullet extends Circle { 
 + 
 +   double vx; 
 +   double vy; 
 + 
 +   public Bullet(double x, double y, double vx, double vy) { 
 +      super(x, y, 10); 
 +      this.vx = vx; 
 +      this.vy = vy; 
 +      this.sendToBack(); 
 +      this.setFillColor(0xff0000); 
 +   } 
 + 
 +   public void act() { 
 +      move(vx, vy); 
 +      if(isOutsideView()) { 
 +         destroy(); 
 +      } 
 +   } 
 +   
 +}</script> 
 +<script type="text/plain" title="Target.java"> 
 +public class Target extends Sprite { 
 +    
 +   double vx; 
 +   double vy; 
 +   Main main; 
 + 
 +   public Target(Main main) { 
 +      super(Random.randint(0, 800), -50, SpriteLibrary.Breakin, 9); 
 +      this.vx = Random.randint(-5, 5); 
 +      this.vy = Random.randint(3, 10); 
 +      this.main = main; 
 +   } 
 + 
 +   public void act() { 
 + 
 +      move(vx, vy); 
 + 
 +      if(getCenterY() > 620) { 
 +         destroy(); 
 +         return; 
 +      }  
 + 
 +      if(collidesWithFillColor(0xff0000)) { 
 +         Sprite explosion = new Sprite(getCenterX(), getCenterY(), SpriteLibrary.Explosion_1); 
 +         explosion.playAnimation(0, 55, RepeatType.once, 30); 
 +         destroy(); 
 +         main.increaseScore(10); 
 +      } 
 + 
 +   } 
 + 
 +
 +</script> 
 +</div> 
 + 
 +</HTML> 
 + 
 +<WRAP center round todo 60%> 
 +**Aufgaben:** \\ 
 +  * Die Bullets sind bisher nur einfache Kreise. Schöner wäre ein geeignetes Sprite! 
 +  * Trifft ein Bullet ein Target, so soll auch das Bullet vernichtet werden. 
 +  * Ersetze die Explosion der Targets durch ein Particle System (z.B. umherfliegende Dreiecke). Trifft ein Particle das Raumschiff, soll es zerstört werden. 
 +  * Das Raumschiff soll drei Leben haben. Schön wäre eine Lebensanzeige rechts unten, die aus drei kleinen Raumschiffen besteht... 
 +  * Es soll verschiedene Gegner geben, die sich verschieden verhalten! 
 +  * Es soll Powerups geben, die man aufsammeln kann. Sie bewirken, dass das Raumschiff bessere Fähigkeiten bekommt (verschiedene Kanonen, Schild, ...) 
 +</WRAP>
  
  
wiederholung/eigeneklassen.1686491635.txt.gz · Zuletzt geändert: 2023/06/11 13:53 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki