/***************************************************************************
cactusmanager.cpp - description
-------------------
begin : Mon Apr 10 2000
copyright : (C) 2000 by Markus Gebhard & Alexander Theel
idea & java
implementation : Markus Gebhard
implementation c++ : Alexander Theel
email : ukgh@rz.uni-karlsruhe.de
alex.theel@gmx.net
***************************************************************************/
/***************************************************************************
* *
* 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 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
/**
Der Hauptteil, der alles steuert und als Thread geringer Priorität
die einzelnen Wachstumsschritte anstößt.
Wacht ausserdem über Maus-Aktivität.
Das Auftreten von Easter-Eggs wird durch das Konfigurationsfile "cactus.egg" gesteuert.
Das Format für dieses Skript ist in jenem File erläutert.
*-------------------------------------------------------------------------------------*
* Verwendung der Idee, des Algorithmus und Teile des Quelltexts vorerst nur mit meiner
* persönlichen Genehmigung und unter der Bedingung, dass die Erweiterbarkeit um
* zusätzliche Blüten oder Easter-eggs gewährleistet ist - nach Möglichkeit in der
* Form wie hier, also durch GIF-Bilder und durch einn kompatibles Skript.
*
* Known Bugs: -
*
* Missing Features:
* - Parameter zum Wachstum auch noch in ein Konfigurationsfile auslagern
*
* @version 0.5 04/09/00
*
* @author Markus Gebhard ukgh@rz.uni-karlsruhe.de
*/
#include "../../global.h"
#include "cactus.h"
#include "CCactusBar.h"
#include
Cactus::Cactus(QWidget* pDisplayComponent)
: mpImageManager( NULLPTR )
, mpTimer( NULLPTR )
, mpDisplayComponent( pDisplayComponent )
, mpCactusRootShoot( NULLPTR )
{
//from 'CactusParameters' wird in ImageManager noch mal deklariert
// IMAGE_DIR=QString("./flowers/");
// CACTUS_EGG_CONFIGURATION_FILE=QString("cactus.egg");
//super();
// mpDisplayComponent = pDisplayComponent;
//mpDisplayComponent.addMouseListener(this);
//mpDisplayComponent.addMouseMotionListener(this);
//setPriority(MIN_PRIORITY);
//ImageManager initialisieren
mpImageManager = new ImageManager(mpDisplayComponent);
//Nach Bildern für die Blüten suchen
//Laden des EasterEgg description files
//ImageManager.loadEasterEggConfiguration();
}
Cactus::~Cactus()
{
DELETE( mpImageManager );
DELETE( mpTimer );
mpDisplayComponent = NULLPTR;
DELETE( mpCactusRootShoot );
}
void Cactus::setFlowerDirectory(QString dir){
mpImageManager->setFlowerDirectory(dir);
}
void Cactus::paint(QPainter* p, QRect region){
if (mpCactusRootShoot!=0){
QPoint point(region.x()+region.width()/2, region.y()+region.height());
mpCactusRootShoot->paint(p, /*mpDisplayComponent,*/ &point);
}
}
/**
* Der eigentliche Thread-ablauf.
* Es werden kontinuierlich neue Kakteen erzeugt, Wachstumsimpulse gegeben, etc.
* Bei Mausaktivität wird ggf. der wartende Thread unterbrochen, damit der
* nächste vorgesehene Wachstumsschritt durchgeführt wird.
*/
void Cactus::run(){
createNewPlant();
mpTimer=new QTimer(this);
connect(mpTimer, SIGNAL(timeout()), SLOT(simulate()) );
mpTimer->start(THREAD_SLEEP_TIME_GROWING, FALSE);
// while (!shallStop){
// yield();------------------------------------------------------------------------
///* try{
//;// sleep(sleepTime);------------------------------------------------
// }catch (InterruptedException e) {}
//*/
// //einen Wachstumsschritt simulieren
// simulate();
// }
}
/**
* Ein nicht-notwendiges Feature ist das Easter-egg.
* Hier wird zum Beispiel dem Kaktus ein Gesicht aufgesetzt oder ähnliches...
*/
void Cactus::drawEasterEgg(){
//schon vorhanden? dann nicht!
if (easterEgg)
return;
// boolean success=mpImageManager.applyEasterEgg(mpCactusRootShoot);-----------------------------
//Wenn erfolgreich angebracht, dann neu darstellen
if (true/*success*/){//------------------------------------------------
((CCactusBar*)mpDisplayComponent)->paint();
easterEgg=true;
}
//ansonsten halt kein Osterei diesmal :(
}
/**
* Eine neue Pflanze erzeugen
*/
void Cactus::createNewPlant(){
if(mpCactusRootShoot != 0)
DELETE( mpCactusRootShoot );
mpCactusRootShoot=new CactusShoot();
mpImageManager->applyFlower(mpCactusRootShoot);
easterEgg=false;
state=GROWING;
}
/**
* Ein einzelner Wachstumsschritt wird simuliert.
*/
void Cactus::simulate(){
if (mpCactusRootShoot==0)
return;
switch (state){
case GROWING:
//solange versuchen zu wachsen, bis mindestens eine Stufe gewachsen
while(mpCactusRootShoot->grow()==0){};
((CCactusBar*)mpDisplayComponent)->paint();
//Fertig mit wachsen? Dann ab jetzt Zustand blühend
if(mpCactusRootShoot->isFinishedGrowing())
state=FLOWERING;
break;
case FLOWERING:
mpCactusRootShoot->flower();
((CCactusBar*)mpDisplayComponent)->paint();
//Blühen beendet? Dann fertig.
if (mpCactusRootShoot->isFinishedFlowering())
state=FINISHED;
break;
case FINISHED:
createNewPlant();
((CCactusBar*)mpDisplayComponent)->paint();
state=GROWING;
break;
}
// Timer anpassen (diese Routine steht im Ursprünglichen Programm
// in der Methode 'run()' )
// -> aktuelle Pausenlänge bestimmen
int sleepTime=0;
switch (state){
case GROWING:
sleepTime=THREAD_SLEEP_TIME_GROWING;
break;
case FLOWERING:
sleepTime=THREAD_SLEEP_TIME_FLOWERING;
break;
case FINISHED:
sleepTime=THREAD_SLEEP_TIME_FINISHED;
break;
}
//Pause vor dem nächsten Simulationsschritt; Timer anpassen
mpTimer->changeInterval(sleepTime);
}