api:documentation:spiele:worldtransformations
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungNächste ÜberarbeitungBeide Seiten der Revision | ||
api:documentation:spiele:worldtransformations [2021/05/30 23:03] – [Scrollen, Zoomen (Transformation des Welt-Koordinatensystems)] Martin Pabst | api:documentation:spiele:worldtransformations [2021/06/06 22:13] – Martin Pabst | ||
---|---|---|---|
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 '' | 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 '' | ||
- | \\ **Der Spielerfigur folgen** | + | \\ **Der Spielerfigur folgen:** \\ |
- | Soll die Welt immer so scrollen, dass sie der Spielerfigur folgt, so erreicht man dies mit der Methode '' | + | Soll die Welt immer so scrollen, dass sie der Spielerfigur folgt, so erreicht man dies mit der Methode '' |
</ | </ | ||
- | ===== Kleines | + | ===== Demo-Programm |
Steuere das Raumschiff mit den **Pfeiltasten nach links/ | Steuere das Raumschiff mit den **Pfeiltasten nach links/ | ||
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: | ||
</ | </ | ||
+ | |||
+ | ===== Demo-Programm zur Methode follow ===== | ||
+ | |||
+ | <WRAP center round info 60%> | ||
+ | Die Methode '' | ||
+ | * Figur - Die Figur, die ins Zentrum gerückt werden soll | ||
+ | * margin - Das Koordinatensystem wird nicht verschoben, wenn die Figur sichtbar und mindestens '' | ||
+ | * 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 '' | ||
+ | \\ \\ **Tipp:** \\ Die Koordinaten der linken oberen Ecke des sichtbaren Bereichs bekommst Du mit den Methoden '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Vielen Dank an Jürgen Horzella für die Programmvorlage!** \\ \\ | ||
+ | Steuere den Helden mit den **Pfeiltasten**! | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Spiel s = new Spiel(); | ||
+ | |||
+ | public class Spiel extends Actor { | ||
+ | |||
+ | Text punkteAnzeige = new Text(20, 20, 60, "" | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Shape standingOn; | ||
+ | |||
+ | Group plattforms = new Group(); | ||
+ | Group stars = new Group(); | ||
+ | |||
+ | | ||
+ | | ||
+ | Rectangle ground = new Rectangle(-5000, | ||
+ | ground.setFillColor(Color.gray); | ||
+ | plattforms.add(ground); | ||
+ | |||
+ | for(int i = 1; i < 6; i++) { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | for(int i = 0; i < 40; i++) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | spielfigur = new Sprite(500, 100, SpriteLibrary.Characters_1, | ||
+ | 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); | ||
+ | } | ||
+ | |||
+ | | ||
+ | getWorld().follow(spielfigur, | ||
+ | |||
+ | vy = vy + ay; | ||
+ | spielfigur.move(vx, | ||
+ | |||
+ | t = t + 1; | ||
+ | bombe.moveTo(mx + r * Math.cos(w * t), my + r * Math.sin(w * t)); | ||
+ | |||
+ | if(spielfigur.collidesWith(bombe)) { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | Shape[] collidingStars = stars.getCollidingShapes(spielfigur); | ||
+ | for(Shape star : collidingStars) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | 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) { | ||
+ | | ||
+ | standingOn = null; | ||
+ | ay = gravity; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Shape[] collidingPlatforms = plattforms.getCollidingShapes(spielfigur); | ||
+ | for(Shape platform : collidingPlatforms) { | ||
+ | | ||
+ | | ||
+ | Direction d = spielfigur.directionRelativeTo(platform); | ||
+ | switch(d) { | ||
+ | case top : | ||
+ | spielfigur.moveBackFrom(platform, | ||
+ | standingOn = platform; | ||
+ | vy = 0; | ||
+ | ay = 0; | ||
+ | break; | ||
+ | case bottom : | ||
+ | vy = 1; | ||
+ | spielfigur.moveBackFrom(platform, | ||
+ | case left : | ||
+ | vx = -4; | ||
+ | spielfigur.moveBackFrom(platform, | ||
+ | spielfigur.move(vx, | ||
+ | break; | ||
+ | case right : | ||
+ | vx = 4; | ||
+ | spielfigur.moveBackFrom(platform, | ||
+ | spielfigur.move(vx, | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | }</ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Zyklisch-parallaktisches Scrollen ===== | ||
+ | {{ youtube> | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new CyclicBackgroundTest(); | ||
+ | |||
+ | class CyclicBackgroundTest extends Actor { | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | int time = 0; | ||
+ | |||
+ | | ||
+ | cb1 = new CyclicBackground(new Sprite(0, 0, SpriteLibrary.Background, | ||
+ | cb2 = new CyclicBackground(new Sprite(0, 0, SpriteLibrary.Background, | ||
+ | cb3 = new CyclicBackground(new Sprite(0, 0, SpriteLibrary.Background, | ||
+ | } | ||
+ | |||
+ | | ||
+ | time++; | ||
+ | cb1.setPosition(-time, | ||
+ | cb2.setPosition(-time * 2, 200); | ||
+ | cb3.setPosition(-time * 4, 400); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | <script type=" | ||
+ | class CyclicBackground extends Group { | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | spriteWidth = image.getWidth(); | ||
+ | int count = Math.ceil(getWorld().getWidth() / spriteWidth) + 1; | ||
+ | images = new Sprite[count]; | ||
+ | image.defineCenterRelative(0, | ||
+ | images[0] = image; | ||
+ | add(image); | ||
+ | for(int i = 1; i < count; 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; | ||
+ | | ||
+ | x += spriteWidth; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ |
api/documentation/spiele/worldtransformations.txt · Zuletzt geändert: 2021/12/29 11:29 von 127.0.0.1