Benutzer-Werkzeuge

Webseiten-Werkzeuge


api:documentation:spiele:worldtransformations

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
api:documentation:spiele:worldtransformations [2021/05/30 23:03] – [Scrollen, Zoomen (Transformation des Welt-Koordinatensystems)] Martin Pabstapi:documentation:spiele:worldtransformations [2021/12/29 11:29] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 10: Zeile 10:
 Oft möchte man Anzeigen für Punkte, Leben usw. darstellen, die immer am selben Platz erscheinen sollen. Für diese Zwecke besitzt jedes graphische Element die Methode ''setStatic(boolean)''. Sie bewirkt, dass das graphische Element durch die obigen Methoden nicht verändert wird. Oft möchte man Anzeigen für Punkte, Leben usw. darstellen, die immer am selben Platz erscheinen sollen. Für diese Zwecke besitzt jedes graphische Element die Methode ''setStatic(boolean)''. Sie bewirkt, dass das graphische Element durch die obigen Methoden nicht verändert wird.
  
-\\ **Der Spielerfigur folgen** +\\ **Der Spielerfigur folgen:** \\ 
-Soll die Welt immer so scrollen, dass sie der Spielerfigur folgt, so erreicht man dies mit der Methode ''followShape'' des World-Objekts. Details siehe im Beispiel unten.+Soll die Welt immer so scrollen, dass sie der Spielerfigur folgt, so erreicht man dies mit der Methode ''followShape'' des World-Objekts. Details siehe im Beispiel ganz unten.
 </WRAP> </WRAP>
  
-===== Kleines Demo-Programm =====+===== Demo-Programm zu World-Transformationen und setStatic =====
 Steuere das Raumschiff mit den **Pfeiltasten nach links/rechts**! Steuere das Raumschiff mit den **Pfeiltasten nach links/rechts**!
  
Zeile 52: Zeile 52:
       pointsDisplay.setFillColor(Color.white);       pointsDisplay.setFillColor(Color.white);
       pointsDisplay.setBorderColor(Color.red);       pointsDisplay.setBorderColor(Color.red);
-      pointsDisplay.getWorld().addToShapesNotAffectedByWorldTransformations(pointsDisplay);+      pointsDisplay.setStatic(true);
    }    }
  
Zeile 99: Zeile 99:
  
 </HTML> </HTML>
 +
 +===== Demo-Programm zur Methode follow =====
 +
 +<WRAP center round info 60%>
 +Die Methode ''follow'' des World-Objekts bewirkt, dass das Welt-Koordinatensystem so verschoben wird, dass eine bestimmte Figur ins Zentrum gerückt wird. Sie benötigt folgende Parameterwerte:
 +  * Figur - Die Figur, die ins Zentrum gerückt werden soll
 +  * margin - Das Koordinatensystem wird nicht verschoben, wenn die Figur sichtbar und mindestens ''margin'' von allen Rändern entfernt ist.
 +  * xMin - Das Koordinatensystem wird höchstens so weit nach links verschoben, dass der linke Rand die x-Koordinate xMin hat.
 +  * xMax - Das Koordinatensystem wird höchstens so weit nach rechts verschoben, dass der rechte Rand die x-Koordinate xMax hat.
 +  * yMin - Das Koordinatensystem wird höchstens so weit nach oben verschoben, dass der obere Rand die y-Koordinate yMin hat.
 +  * yMax - Das Koordinatensystem wird höchstens so weit nach unten verschoben, dass der untere Rand die y-Koordinate yMax hat.
 +
 +\\ **VORSICHT:** \\ 
 +Die Methode verschiebt das Welt-Koordinatensystem **nur ein einziges Mal**. Soll die Welt einer Spielfigur folgen, so muss diese Methode immer wieder aufgerufen werden. Am besten platzierst Du sie dazu in der ''act''-Methode der Spielfigur.
 +\\ \\ **Tipp:** \\ Die Koordinaten der linken oberen Ecke des sichtbaren Bereichs bekommst Du mit den Methoden ''getTop'' und ''getLeft'' des world-Objekts, seine Breite mit ''getWidth'' und seine Höhe mit ''getHeight''.
 +</WRAP>
 +
 +
 +**Vielen Dank an Jürgen Horzella für die Programmvorlage!** \\ \\ 
 +Steuere den Helden mit den **Pfeiltasten**!
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 450px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'ScrollFollowDemo', 'speed': 'max'}">
 +
 +<script type="text/plain" title="ScrollFollowDemo.java">
 +Spiel s = new Spiel(); 
 +
 +public class Spiel extends Actor {
 +
 +   Text punkteAnzeige = new Text(20, 20, 60, "");
 +   double punkte = 0;
 +
 +   Sprite spielfigur;
 +   double vx;
 +   double vy;
 +   double ay;
 +   double gravity = 0.4;
 +   double jump = -12;
 +   double speed = 5;
 +   
 +
 +   Circle bombe;
 +   double mx = 300;  // Mittelpunkt der Kreisbahn
 +   double my = 300;
 +   double r = 100;   // Radius der Kreisbahn
 +   double t = 0;
 +   double w = 0.05;  // Winkelgeschwindigkeit
 +
 +   Shape standingOn;
 +
 +   Group plattforms = new Group();
 +   Group stars = new Group();
 +
 +   public Spiel() {
 +      
 +      Rectangle ground = new Rectangle(-5000, 580, 10000, 40);
 +      ground.setFillColor(Color.gray);
 +      plattforms.add(ground);
 +
 +      for(int i = 1; i < 6; i++) {
 +         plattforms.add(new Rectangle(100 + 250 * i, 600 - 120 * i, 200, 10));
 +      }
 +      
 +      for(int i = 0; i < 40; i++) {
 +         Sprite star = new Sprite(Random.randdouble(-500, 1500), Random.randint(300, 500), SpriteLibrary.Plattforms, 176); 
 +         stars.add(star);
 +      }
 +      
 +      spielfigur = new Sprite(500, 100, SpriteLibrary.Characters_1, 0);
 +      vx = 0;
 +      vy = 0;
 +      ay = gravity;
 +      
 +      mx = 300;
 +      my = 300;
 +      r = 100;
 +      t = 0;
 +      w = 0.05;
 +      bombe = new Circle(mx, my, 20);
 +      bombe.setFillColor(Color.red);
 +
 +      punkteAnzeige.setStatic(true);
 +      punkteAnzeige.setFillColor(Color.white);
 +      punkteAnzeige.setBorderColor(Color.darkcyan);
 +   }
 +   
 +   public void act() {
 +      getWorld().follow(spielfigur, 200, -1000, 2800, -10000, 600);
 +
 +      vy = vy + ay;
 +      spielfigur.move(vx, vy);
 +
 +      t = t + 1;
 +      bombe.moveTo(mx + r * Math.cos(w * t), my + r * Math.sin(w * t));
 +
 +      if(spielfigur.collidesWith(bombe)) {
 +         spielfigur.moveTo(500, 100);
 +      }
 +            
 +      Shape[] collidingStars = stars.getCollidingShapes(spielfigur);
 +      for(Shape star : collidingStars) {
 +         star.destroy();
 +         Sound.playSound(Sound.short_bell);
 +         punkte++;
 +         punkteAnzeige.setText(punkte);
 +      }
 +      
 +      if(isKeyDown(Key.ArrowUp) && standingOn != null) {
 +         vy = jump;
 +      }
 +
 +      if(isKeyDown(Key.ArrowRight)) {
 +         vx = speed;
 +      } else if(isKeyDown(Key.ArrowLeft)) {
 +         vx = -speed;
 +      } else {
 +         vx = 0;
 +      }
 +
 +      if(standingOn != null) {
 +         if(!spielfigur.collidesWith(standingOn)) {
 +            standingOn = null;
 +            ay = gravity;
 +         }
 +      }
 +
 +      Shape[] collidingPlatforms = plattforms.getCollidingShapes(spielfigur);
 +      for(Shape platform : collidingPlatforms) {
 +        
 +         if(platform != standingOn) {
 +            Direction d = spielfigur.directionRelativeTo(platform);
 +            switch(d) {
 +               case top : 
 +                  spielfigur.moveBackFrom(platform, true);
 +                  standingOn = platform;
 +                  vy = 0;
 +                  ay = 0;
 +                  break;
 +               case bottom : 
 +                  vy = 1;
 +                  spielfigur.moveBackFrom(platform, false);
 +               case left : 
 +                  vx = -4;
 +                  spielfigur.moveBackFrom(platform, false);
 +                  spielfigur.move(vx, vy);
 +                  break;
 +               case right : 
 +                  vx = 4;
 +                  spielfigur.moveBackFrom(platform, false);
 +                  spielfigur.move(vx, vy);
 +                  break;
 +            } 
 +         }
 +         
 +         
 +      }
 +
 +   }
 +}</script>
 +
 +</div>
 +
 +</HTML>
 +
 +
 +===== Zyklisch-parallaktisches Scrollen =====
 +{{ youtube>mRgC7BJcK78?large }}
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 450px; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'CyclicParalacticScroller', 'speed': 'max'}">
 +
 +<script type="text/plain" title="CyclicBackgroundTest.java">
 +new CyclicBackgroundTest();
 +
 +class CyclicBackgroundTest extends Actor {
 +   
 +   CyclicBackground cb1;
 +   CyclicBackground cb2;
 +   CyclicBackground cb3;
 +   
 +   int time = 0;
 +
 +   CyclicBackgroundTest() {
 +      cb1 = new CyclicBackground(new Sprite(0, 0, SpriteLibrary.Background, 2));
 +      cb2 = new CyclicBackground(new Sprite(0, 0, SpriteLibrary.Background, 1));
 +      cb3 = new CyclicBackground(new Sprite(0, 0, SpriteLibrary.Background, 0));
 +   }
 +
 +   public void act() {
 +      time++;
 +      cb1.setPosition(-time, 0);
 +      cb2.setPosition(-time * 2, 200);
 +      cb3.setPosition(-time * 4, 400);
 +   }
 +
 +}
 +</script>
 +<script type="text/plain" title="CyclicBackground.java">
 +class CyclicBackground extends Group {
 +   
 +   Sprite[] images;
 +   double spriteWidth;
 +
 +   CyclicBackground(Sprite image) {
 +      spriteWidth = image.getWidth();
 +      int count = Math.ceil(getWorld().getWidth() / spriteWidth) + 1;
 +      images = new Sprite[count];
 +      image.defineCenterRelative(0, 0);
 +      images[0] = image;
 +      add(image);
 +      for(int i = 1; i < count; i++) {
 +         images[i] = image.copy();
 +         add(images[i]);
 +      }
 +   }
 +
 +   void setPosition(double left, double top) {
 +      if(left > 0) {
 +         left -= Math.ceil(-left / spriteWidth) * spriteWidth;
 +      }
 +      
 +      double x = left + Math.floor(-left / spriteWidth) * spriteWidth;
 +      for(int i = 0; i < images.length; i++){
 +         images[i].moveTo(x, top);
 +         x += spriteWidth;
 +      }
 +   }
 +
 +
 +}
 +</script>
 +
 +</div>
 +
 +</HTML>
 +
 +
api/documentation/spiele/worldtransformations.1622408600.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki