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 11: Zeile 11:
  
 \\ **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.1622408615.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki