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
Nächste ÜberarbeitungBeide Seiten der Revision
api:documentation:spiele:worldtransformations [2021/05/30 23:03] – [Scrollen, Zoomen (Transformation des Welt-Koordinatensystems)] Martin Pabstapi:documentation:spiele:worldtransformations [2021/05/30 23:45] Martin Pabst
Zeile 14: Zeile 14:
 </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 93: Zeile 93:
    }    }
  
 +}
 +</script>
 +
 +</div>
 +
 +</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 grünen 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 {
 +   Rectangle [] plattform;
 +   
 +   Circle [] star;
 +   double punkte = 0;
 +
 +   Rectangle spielfigur;
 +   double vx;
 +   double vy;
 +   double ay;
 +   double gravity = 0.4;
 +   double jump = -12;
 +   double speed = 3;
 +   
 +
 +   Circle bombe;
 +   double mx;
 +   double my;
 +   double r;
 +   double t;
 +   double w;
 +
 +   Shape standingOn;
 +
 +   Group plattforms = new Group();
 +
 +   public Spiel() {
 +      
 +      Rectangle ground = new Rectangle(-5000, 580, 10000, 40);
 +      ground.setFillColor(Color.gray);
 +      plattforms.add(ground);
 +
 +      for(int i = 1; i < 10; i++) {
 +         plattforms.add(new Rectangle(100 + 250 * i, 600 - 70 * i, 200, 10));
 +      }
 +      
 +      star = new Circle[4];
 +      star[0] = new Circle(300, 400, 10);
 +      star[1] = new Circle(400, 300, 10);
 +      star[2] = new Circle(500, 300, 10);
 +      star[3] = new Circle(100, 450, 10);
 +      for(int i = 0; i <= 3; i++) {
 +         star[i].setFillColor(Color.yellow);
 +      }
 +      
 +      spielfigur = new Rectangle(200, 400, 20, 40);
 +      spielfigur.setFillColor(Color.green);
 +      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);
 +   }
 +   
 +   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(200, 400);
 +      }
 +      
 +
 +      if(standingOn != null) {
 +         if(!spielfigur.collidesWith(standingOn)) {
 +            standingOn = null;
 +         }
 +      }
 +
 +      if(standingOn == null) {
 +         Shape[] collidingPlatforms = plattforms.getCollidingShapes(spielfigur);
 +         for(Shape platform : collidingPlatforms) {
 +            
 +            spielfigur.moveBackFrom(platform, true);
 +   
 +            Direction d = spielfigur.directionRelativeTo(platform);
 +            switch(d) {
 +               case top : 
 +                  standingOn = platform;
 +                  break;
 +               case bottom : 
 +                  vy = 1;
 +                  spielfigur.moveBackFrom(platform, false);
 +               case left : 
 +               case right : 
 +                  vx *= -1;
 +                  spielfigur.moveBackFrom(platform, false);
 +                  spielfigur.move(0, vy);
 +                  break;
 +            }
 +         }
 +
 +      }
 +
 +      if(standingOn != null) { 
 +         vy = 0;
 +         ay = 0;
 +      }
 +      else {
 +         ay = gravity;
 +      }
 +      
 +      for(int i = 0; i <= 3; i++) {
 +         if(spielfigur.collidesWith(star[i])) {
 +            punkte++;
 +            star[i].moveTo(5, 5);
 +         }
 +      }
 +      
 +      if(isKeyDown(Key.ArrowUp) && standingOn != null) {
 +         vy = jump;
 +      }
 +
 +      if(isKeyDown(Key.ArrowRight)) {
 +         vx = speed;
 +      } else if(isKeyDown(Key.ArrowLeft)) {
 +         vx = -speed;
 +      } else {
 +         vx = 0;
 +      }
 +
 +   }
 } }
 </script> </script>
api/documentation/spiele/worldtransformations.txt · Zuletzt geändert: 2021/12/29 11:29 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki