123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #include "Neuigkeiten.h"
- #include "../../Global/Variablen.h"
- #include "../../Global/Initialisierung.h"
- #include <Punkt.h>
- #include <Globals.h>
- // Inhalt der NewsThread Klasse aus Neuigkeiten.h
- // Konstruktor
- NewsThread::NewsThread( char *name, KSGScriptObj *obj, Neuigkeiten *n )
- {
- scriptName = new Text( name );
- this->obj = obj;
- news = n;
- start();
- }
- // Destruktor
- NewsThread::~NewsThread()
- {
- scriptName->release();
- obj->release();
- news->release();
- }
- // nicht constant
- void NewsThread::thread()
- {
- if( !newsClient )
- newsClient = mainClient->createNewsServerClient();
- if( !newsClient )
- {
- news->endLaden( mainClient->getLetzterFehler() );
- delete this;
- return;
- }
- if( !newsClient->verbinde() )
- {
- news->endLaden( newsClient->getLetzterFehler() );
- run = 0;
- delete this;
- return;
- }
- if( !newsClient->ladeSeite( scriptName->getText() ) )
- {
- news->endLaden( newsClient->getLetzterFehler() );
- run = 0;
- delete this;
- return;
- }
- newsClient->trenne( 0 );
- Text *pfad = new Text( "data/tmp/news/" );
- pfad->append( scriptName->getText() );
- pfad->append( "/seite.ksgs" );
- obj->setScriptDatei( pfad );
- if( !obj->neuLaden() )
- {
- news->endLaden( "Fehler beim laden der Seite." );
- run = 0;
- delete this;
- return;
- }
- news->endLaden( 0 );
- run = 0;
- delete this;
- }
- void KSGSRückruf( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
- {
- if( !p )
- return;
- ( (Neuigkeiten *)p )->rückruf( parameter, ret );
- }
- // Inhalt der Neuigkeiten Klasse aus Neuigkeiten.h
- // Konstruktor
- Neuigkeiten::Neuigkeiten( Schrift * zSchrift, Fenster * zNachLoginFenster, int x )
- {
- bildschirmGröße = BildschirmGröße();
- pos = Punkt( x, 67 );
- gr = Punkt( 102, 32 );
- rahmen = new LRahmen();
- rahmen->setFarbe( 0xFFFFFFFF );
- rahmen->setSize( 102, 32 );
- alpha = 0;
- animation = 0;
- wirdGeladen = 0;
- sichtbar = 0;
- tickVal = 0;
- prozent1 = 0;
- prozent2 = 0;
- begPos = Punkt( 0, 0 );
- begGröße = Punkt( 0, 0 );
- größe1 = Punkt( 102, 32 );
- pos1 = Punkt( x, 67 );
- größe2 = Punkt( 800, 500 );
- pos2 = bildschirmGröße / 2 - größe2 / 2;
- fehler = initTextFeld( 5, 5, 790, 490, zSchrift, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "" );
- laden = (Animation2D *)ladeAnimation->dublizieren();
- laden->setSichtbar( 0 );
- laden->setPosition( 375, 225 );
- zNachLoginFenster->addMember( getThis() );
- ksgsDLL = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
- if( !ksgsDLL )
- {
- fehler->setText( "Die DLL Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." );
- fehler->addStyle( TextFeld::Style::Sichtbar );
- script = 0;
- }
- else
- {
- KSGSGetZeichnung getKSGSZeichnung = (KSGSGetZeichnung)GetProcAddress( ksgsDLL, KSGS_START_FUNKTION );
- if( !getKSGSZeichnung )
- {
- fehler->setText( "Die Funktion '" KSGS_START_FUNKTION "' konnte in der DLL Datei 'data/bin/KSGScript.dll'\nnicht gefunden werden." );
- fehler->addStyle( TextFeld::Style::Sichtbar );
- script = 0;
- }
- else
- {
- script = getKSGSZeichnung();
- script->setSize( 800, 500 );
- script->setBildschirmZ( hauptScreen->getThis() );
- script->setSchriftZ( zSchrift->getThis() );
- script->setRückrufParam( this );
- script->setRückrufFunktion( KSGSRückruf );
- wirdGeladen = 1;
- laden->setSichtbar( 1 );
- new NewsThread( "Client/Start", dynamic_cast<KSGScriptObj *>( script->getThis() ), (Neuigkeiten *)getThis() );
- }
- }
- }
- // Destruktor
- Neuigkeiten::~Neuigkeiten()
- {
- rahmen->release();
- if( script )
- {
- script->zurücksetzen();
- script->release();
- }
- if( ksgsDLL )
- Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
- fehler->release();
- laden->release();
- }
- // nicht constant
- void Neuigkeiten::setSichtbar( bool sicht )
- {
- begPos = pos;
- begGröße = gr;
- animation |= ( sicht ? 0x1 : 0x2 );
- rend = 1;
- }
- void Neuigkeiten::endLaden( char *err )
- {
- laden->setSichtbar( 0 );
- wirdGeladen = 0;
- if( err )
- {
- fehler->setText( err );
- fehler->addStyle( TextFeld::Style::Sichtbar );
- }
- else
- {
- fehler->setText( "" );
- fehler->removeStyle( TextFeld::Style::Sichtbar );
- }
- }
- void Neuigkeiten::rückruf( RCArray< KSGSVariable > * parameter, KSGSVariable * *ret )
- {
- if( wirdGeladen )
- return;
- KSGSVariable * befehl = parameter->z( 0 );
- if( !befehl )
- return;
- Text * b = befehl->getText();
- if( !b || !b->getLength() )
- {
- if( b )
- b->release();
- return;
- }
- wirdGeladen = 1;
- laden->setSichtbar( 1 );
- new NewsThread( b->getText(), dynamic_cast<KSGScriptObj *>( script->getThis() ), (Neuigkeiten *)getThis() );
- }
- void Neuigkeiten::doMausEreignis( MausEreignis & me )
- {
- if( wirdGeladen )
- return;
- me.mx -= pos.x;
- me.my -= pos.y;
- if( script &&sichtbar )
- script->doMausEreignis( me );
- me.mx += pos.x;
- me.my += pos.y;
- }
- void Neuigkeiten::doTastaturEreignis( TastaturEreignis & te )
- {
- if( wirdGeladen )
- return;
- if( script &&sichtbar )
- script->doTastaturEreignis( te );
- }
- bool Neuigkeiten::tick( double z )
- {
- rend |= laden->tick( z );
- rend |= fehler->tick( z );
- if( wirdGeladen )
- {
- bool ret = rend;
- rend = 0;
- return ret;
- }
- if( script &&sichtbar )
- rend |= script->tick( z );
- tickVal += z * 150;
- int val = (int)tickVal;
- if( val < 1 )
- {
- bool ret = rend;
- rend = 0;
- return ret;
- }
- tickVal -= val;
- if( ( animation | 0x1 ) == animation ) // Einblenden
- {
- if( prozent1 != 100 )
- {
- prozent1 += val;
- if( prozent1 >= 100 )
- prozent1 = 100;
- pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
- gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
- }
- else if( alpha != 255 )
- {
- alpha += val * 2;
- if( alpha >= 255 || ( animation | 0x2 ) == animation )
- {
- alpha = 255;
- animation &= ~0x1;
- sichtbar = 1;
- prozent1 = 0;
- }
- }
- rend = 1;
- }
- if( ( animation | 0x2 ) == animation ) // ausblenden
- {
- if( alpha != 0 )
- {
- alpha -= val * 2;
- if( alpha < 0 )
- alpha = 0;
- }
- else
- {
- prozent2 += val;
- if( prozent2 > 100 )
- prozent2 = 100;
- pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
- gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
- if( prozent2 == 100 )
- {
- prozent2 = 0;
- animation &= ~0x2;
- sichtbar = 0;
- }
- }
- rend = 1;
- }
- bool ret = rend;
- rend = 0;
- return ret;
- }
- void Neuigkeiten::render( Bild & zRObj )
- {
- if( pos == pos1 )
- return;
- if( !zRObj.setDrawOptions( pos.x, pos.y, gr.x, gr.y ) )
- return;
- rahmen->setSize( gr );
- rahmen->render( zRObj );
- int rbr = rahmen->getRBreite();
- zRObj.setAlpha( (unsigned char)alpha );
- fehler->render( zRObj );
- if( script )
- script->render( zRObj );
- laden->render( zRObj );
- zRObj.releaseAlpha();
- zRObj.releaseDrawOptions();
- }
- // constant
- bool Neuigkeiten::istAnimiert() const
- {
- return animation != 0;
- }
- bool Neuigkeiten::istSichtbar() const
- {
- return sichtbar || prozent1 != 0;
- }
|