/* * Engine Alpha ist eine anfängerorientierte 2D-Gaming Engine. * * Copyright (c) 2011 - 2014 Michael Andonie and contributors. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package ea.internal.ani; import ea.*; /** * Beschreiben Sie hier die Klasse KreisAnimierer. Er animiert vorlaeufig nur im Urzeigersinn. * * @author Michael Andonie */ @SuppressWarnings ("serial") public class KreisAnimierer extends Animierer { /** * Der Schritt, der bei einem Aufruf gemacht wird */ private final double winkelProAnimationsschritt; /** * Der Radius des Kreises, der die Bewegung beschreibt. */ private final double radius; /** * Das Zentrum des die Drehbewegung beschreibenden Kreises. */ private final Punkt zentrum; /** * Der aktuelle Winkel im Gradmass zur Vertikalen.<br /> Im <b>Bogenmass</b> */ private double winkel; /** * Der Endpunkt des letzten Animationsschrittes */ private Punkt letzter; /** * Gibt an, ob die Drehung im Uhrzeigersinn laufen soll. */ private boolean uhrzeigersinn; /** * Konstruktor fuer Objekte der Klasse KreisAnimierer * * @param ziel * Das zu animierende Objekt * @param umlaufzeit * Dauer einer 360°-Drehung in ms * @param loop * Ob die Animation dauerhaft wiederholt (geloopt) werden soll. * @param m * Der Manager, an dem spaeter animiert werden soll. * @param listener * Der AnimationsEndeReagierbar-Listener, der am Ende der Animation aufgerufen wird. * @param uhrzeigersinn Ob im oder gegen Uhrzeigersinn animiert werden soll. */ public KreisAnimierer (Raum ziel, Punkt zentrum, int umlaufzeit, boolean loop, Manager m, AnimationsEndeReagierbar listener, boolean uhrzeigersinn) { super(ziel, loop, m, listener); this.zentrum = zentrum; this.letzter = ziel.zentrum(); this.uhrzeigersinn = uhrzeigersinn; this.winkelProAnimationsschritt = 2*Math.PI / (umlaufzeit / Animierer.MILLISPERTICK); Punkt zielMitte = ziel.zentrum(); radius = zentrum.abstand(zielMitte); winkel = new Gerade(zielMitte, zentrum).winkel(); if (zentrum.realX() < zielMitte.realX() && zentrum.realY() < zielMitte.realY()) { winkel = Math.PI - winkel; } } private int stepCount = 0; public void animationsSchritt () { if(uhrzeigersinn) winkel += winkelProAnimationsschritt; else winkel -= winkelProAnimationsschritt; float x, y; x = (float) ((-Math.sin(winkel)) * radius) + zentrum.realX(); y = (float) ((Math.cos(winkel)) * radius) + zentrum.realY(); Vektor v = new Vektor(x - letzter.realX(), y - letzter.realY()); ziel.bewegen(v); letzter = letzter.verschobenerPunkt(v); if(!loop && ++stepCount == 200) { super.anhalten(); } } }