Forráskód Böngészése

Spieler GUI und Feuerball Treffer werden gezeichnet

Kolja Strohm 4 éve
szülő
commit
66824caa97

+ 44 - 0
StickmanWorldOnline/Gegenstand.cpp

@@ -1,6 +1,50 @@
 #include "Gegenstand.h"
 
 
+Resource *zResourceOfItem( GegenstandTyp typ, ResourceRegistry *zResources )
+{
+    switch( typ )
+    {
+    case PFEIL:
+        return zResources->zResource( R_PFEIL, 0 );
+    case LEBEN:
+        return zResources->zResource( R_LEBEN, 0 );
+    case SCHILD:
+        return zResources->zResource( R_SCHILD, 0 );
+    case SCHUH:
+        return zResources->zResource( R_SCHUH, 0 );
+    case GEIST:
+        return zResources->zResource( R_GEIST, 0 );
+    case KUGEL:
+        return zResources->zResource( R_KUGEL, 0 );
+    case ROLLE:
+        return zResources->zResource( R_ROLLE, 0 );
+    case STURM:
+        return zResources->zResource( R_STURM, 0 );
+    case DRACHENAUGE:
+        return zResources->zResource( R_DRACHENAUGE, 0 );
+    case FEUERBALL:
+        return zResources->zResource( R_FEUERBALL, 0 );
+    case ENTERHAKEN:
+        return zResources->zResource( R_ENTERHAKEN_ITEM, 0 );
+    case MINE:
+        return zResources->zResource( R_MINE, 0 );
+    case RWEISHEIT:
+        return zResources->zResource( R_RWEISHEIT, 0 );
+    case RSTRENGTH:
+        return zResources->zResource( R_RSTRENGTH, 0 );
+    case RBOSHEIT:
+        return zResources->zResource( R_RBOSHEIT, 0 );
+    case RLEBEN:
+        return zResources->zResource( R_RLEBEN, 0 );
+    case RTEMPO:
+        return zResources->zResource( R_RTEMPO, 0 );
+    default:
+        break;
+    }
+    return 0;
+}
+
 bool consumable( GegenstandTyp typ )
 {
     switch( typ )

+ 2 - 0
StickmanWorldOnline/Gegenstand.h

@@ -26,6 +26,8 @@ enum GegenstandTyp
     ITEMANZAHL
 };
 
+Resource *zResourceOfItem( GegenstandTyp typ, ResourceRegistry *zResources );
+
 bool consumable( GegenstandTyp typ );
 
 float abklingzeit( GegenstandTyp typ );

+ 17 - 1
StickmanWorldOnline/Geschoss.cpp

@@ -200,24 +200,40 @@ Richtung Geschoss::getRichtung() const
 }
 
 
-FeuerballTreffer::FeuerballTreffer( int id, int x, int y, Spieler *besitzer, int maxZeit )
+FeuerballTreffer::FeuerballTreffer( ResourceRegistry *zResources, int id, int x, int y, Spieler *besitzer, int maxZeit )
     : GameObject( FEUERBALL_TREFFER, x - 75, y - 75, 150, 150 )
 {
     this->id = id;
     this->besitzer = besitzer;
     this->timeLeft = (float)maxZeit;
     count = 0;
+    animation = zResources->getResource( R_FEUERBALL_TREFFER, 0 );
+    currentImage = 0;
+    texturScale = 1;
+    nextImage = 0.075;
+    textur = animation->getImage( currentImage );
 }
 
 FeuerballTreffer::~FeuerballTreffer()
 {
     besitzer->release();
+    animation->release();
 }
 
 void FeuerballTreffer::tick( double zeit )
 {
     timeLeft -= (float)zeit;
     count++;
+    nextImage -= zeit;
+    if( nextImage <= 0 )
+    {
+        nextImage += 0.075;
+        currentImage++;
+        if( currentImage >= animation->getImageCount() )
+            currentImage = 0;
+        textur->release();
+        textur = animation->getImage( currentImage );
+    }
 }
 
 bool FeuerballTreffer::isOver() const

+ 4 - 1
StickmanWorldOnline/Geschoss.h

@@ -51,9 +51,12 @@ private:
     Spieler *besitzer;
     int count;
     float timeLeft;
+    Resource *animation;
+    int currentImage;
+    double nextImage;
 
 public:
-    FeuerballTreffer( int id, int x, int y, Spieler *besitzer, int maxZeit );
+    FeuerballTreffer( ResourceRegistry *zResources, int id, int x, int y, Spieler *besitzer, int maxZeit );
     ~FeuerballTreffer();
     void tick( double zeit );
     bool isOver() const;

+ 23 - 0
StickmanWorldOnline/Resource.cpp

@@ -128,6 +128,29 @@ ResourceRegistry::ResourceRegistry( Text spielPfad, Text mapPfad )
     ref = 1;
 }
 
+ResourceRegistry::~ResourceRegistry()
+{
+    if( schrift )
+        schrift->release();
+}
+
+void ResourceRegistry::setSchrift( Schrift *schrift )
+{
+    if( this->schrift )
+        this->schrift->release();
+    this->schrift = schrift;
+}
+
+Schrift *ResourceRegistry::zSchrift() const
+{
+    return schrift;
+}
+
+Schrift *ResourceRegistry::getSchrift() const
+{
+    return schrift ? schrift->getThis() : 0;
+}
+
 Resource *ResourceRegistry::getResource( ResourceIds id, int color, ColorMode *mode, Text path )
 {
     Resource *r = zResource( id, color, mode, path );

+ 15 - 1
StickmanWorldOnline/Resource.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include <Bild.h>
+#include <Schrift.h>
 
 using namespace Framework;
 
@@ -89,7 +90,15 @@ enum ResourceIds
     R_RTEMPO_EFFECT,
     R_RSTRENGTH_EFFECT,
     R_KUGEL_GESCHOSS,
-    R_KUGEL
+    R_KUGEL,
+    R_GUI_SPIELER,
+    R_GUI_ERF_RAND,
+    R_GUI_ERF,
+    R_GUI_INVENTAR_AUSWAHL,
+    R_GUI_INVENTAR_HINTERGRUND,
+    R_GUI_INVENTAR_HINTERGRUND_BENUTZT,
+    R_GUI_LEBEN_RAND,
+    R_GUI_LEVEL_RAND
 };
 
 class ResourceRegistry;
@@ -122,10 +131,15 @@ private:
     RCArray< Resource > resources;
     Text spielPfad;
     Text mapPfad;
+    Schrift *schrift;
     int ref;
 
 public:
     ResourceRegistry( Text spielPfad, Text mapPfad );
+    ~ResourceRegistry();
+    void setSchrift( Schrift *schrift );
+    Schrift *zSchrift() const;
+    Schrift *getSchrift() const;
     Resource *getResource( ResourceIds id, int color, ColorMode *mode = 0, Text path = "" );
     Resource *zResource( ResourceIds id, int color, ColorMode *mode = 0, Text path = "" );
     ResourceRegistry *getThis();

+ 74 - 6
StickmanWorldOnline/Spiel.cpp

@@ -13,7 +13,7 @@ Spiel::Spiel()
     zScreen = 0;
     chat = new SpielChat();
     end = 0;
-    spielerGUI = new SpielerGUI();
+    spielerGUI = 0;
     deads = new RCArray< DeadPlayer >();
     nextId = 0;
     rendern = 0;
@@ -78,7 +78,8 @@ Spiel::~Spiel()
     chat->relese();
     if( end )
         end->release();
-    spielerGUI->release();
+    if( spielerGUI )
+        spielerGUI->release();
     deads->release();
     if( lastRunnedTrigger )
         lastRunnedTrigger->release();
@@ -213,7 +214,7 @@ void Spiel::tick()
             case GESCHOSS_FEUERBALL:
                 if( intersectsWithBariere )
                 {
-                    feuer.add( new FeuerballTreffer( ++nextId, (int)g->getX() - 70, (int)g->getY() - 70, g->getBesitzer(), 10 ) );
+                    feuer.add( new FeuerballTreffer( resources, ++nextId, (int)g->getX() - 70, (int)g->getY() - 70, g->getBesitzer(), 10 ) );
                     shots.remove( i );
                     i--;
                     removed = 1;
@@ -329,7 +330,7 @@ void Spiel::tick()
                                 s->addEffekt( new DrachenAugeEffect( g->zBesitzer(), s._ ) );
                                 break;
                             case GESCHOSS_FEUERBALL:
-                                feuer.add( new FeuerballTreffer( ++nextId, (int)g->getX() - 70, (int)g->getY() - 70, g->getBesitzer(), 10 ) );
+                                feuer.add( new FeuerballTreffer( resources, ++nextId, (int)g->getX() - 70, (int)g->getY() - 70, g->getBesitzer(), 10 ) );
                                 break;
                             case GESCHOSS_MINE:
                                 for( auto s2 = spieler.getIterator(); s2; s2++ )
@@ -422,6 +423,7 @@ void Spiel::setSchrift( Schrift *schrift )
     if( this->schrift )
         this->schrift->release();
     this->schrift = schrift;
+    chat->setSchrift( schrift );
 }
 
 // call 3
@@ -520,6 +522,14 @@ void Spiel::ladeDaten()
     resources->zResource( R_RSTRENGTH_EFFECT, 0, new ColorMode(), "spiel:/bilder/rstrength.ltdb" );
     resources->zResource( R_KUGEL_GESCHOSS, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/kugelg.png" );
     resources->zResource( R_KUGEL, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/kugel.png" );
+    resources->zResource( R_GUI_ERF, 0, new ColorMode(), "spiel:/bilder/gui.ltdb/erfleiste.png" );
+    resources->zResource( R_GUI_ERF_RAND, 0, new ColorMode(), "spiel:/bilder/gui.ltdb/erfrand.png" );
+    resources->zResource( R_GUI_INVENTAR_AUSWAHL, 0, new ColorMode(), "spiel:/bilder/gui.ltdb/invausw.png" );
+    resources->zResource( R_GUI_INVENTAR_HINTERGRUND, 0, new ColorMode(), "spiel:/bilder/gui.ltdb/invbg.png" );
+    resources->zResource( R_GUI_INVENTAR_HINTERGRUND_BENUTZT, 0, new ColorMode(), "spiel:/bilder/gui.ltdb/invbgdark.png" );
+    resources->zResource( R_GUI_LEBEN_RAND, 0, new ColorMode(), "spiel:/bilder/gui.ltdb/lebenrand.png" );
+    resources->zResource( R_GUI_LEVEL_RAND, 0, new ColorMode(), "spiel:/bilder/gui.ltdb/levelrand.png" );
+    resources->zResource( R_GUI_SPIELER, 0, new ColorMode(), "spiel:/bilder/gui.ltdb/spieler.png" );
     spielKlient->setLadenProzent( 70 );
     // apply team color filters
     AlphaColorMode *alphaMode = new AlphaColorMode( 0x77 );
@@ -547,6 +557,8 @@ void Spiel::ladeDaten()
         resources->zResource( R_SPIELER_RECHTS, s->getFarbe(), maskMode->getThis() );
         resources->zResource( R_SPIELER_LINKS, s->getFarbe(), maskMode->getThis() );
     }
+    resources->setSchrift( schrift->getThis() );
+    spielerGUI = new SpielerGUI( resources );
     maskMode->release();
     spielKlient->setLadenProzent( 100 );
     gamePath->release();
@@ -625,6 +637,11 @@ void Spiel::stknVerarbeitung()
             break;
         case 2: // spielernummer
             spielerNummer = *(int *)( msg + 1 );
+            for( auto s = spieler.getIterator(); s; s++ )
+            {
+                if( s->getId() == spielerNummer )
+                    spielerGUI->setSpieler( (Spieler *)s->getThis() );
+            }
             n->setVerarbeitet();
             break;
         case 3: // spiel start
@@ -697,7 +714,46 @@ bool Spiel::tick( double zeit )
 
 void Spiel::render( Bild &zRObj )
 {
-
+    if( spielerGUI )
+        spielerGUI->render( zRObj );
+    Spieler *i = 0;
+    for( auto s = spieler.getIterator(); s; s++ )
+    {
+        if( s->getId() == spielerNummer )
+            i = s;
+    }
+    if( !i )
+        return;
+    if( zRObj.setDrawOptions( 300, 0, zRObj.getBreite() - 300, zRObj.getHeight() ) )
+    {
+        zRObj.addScrollOffset( i->getX() - ( zRObj.getBreite() - 300 ) / 2, i->getY() - zRObj.getHeight() / 2 );
+        for( auto f = feuer.getIterator(); f; f++ )
+            f->render( zRObj );
+        for( auto s = schalter.getIterator(); s; s++ )
+            s->render( zRObj );
+        for( auto t = tunnel.getIterator(); t; t++ )
+            t->render( zRObj );
+        for( auto b = basen.getIterator(); b; b++ )
+            b->render( zRObj );
+        for( auto u = umlenkungen.getIterator(); u; u++ )
+            u->render( zRObj );
+        for( auto s = schienen.getIterator(); s; s++ )
+            s->render( zRObj );
+        for( auto i = items.getIterator(); i; i++ )
+            i->render( zRObj );
+        for( auto b = barieren.getIterator(); b; b++ )
+            b->render( zRObj );
+        // TODO: render deads
+        for( auto s = spieler.getIterator(); s; s++ )
+            s->render( zRObj );
+        for( auto s = shots.getIterator(); s; s++ )
+            s->render( zRObj );
+        // TODO: render timer
+        zRObj.releaseDrawOptions();
+    }
+    chat->render( zRObj );
+    if( end )
+        end->render( zRObj );
 }
 
 void Spiel::setMapSize( int width, int height )
@@ -1055,7 +1111,14 @@ int Spiel::getTickCount() const
 void Spiel::setEnde( Team *zGewinner )
 {
     zWinner = zGewinner;
-    // TODO initialize ende dialog
+    Spieler *i = 0;
+    for( auto s = spieler.getIterator(); s; s++ )
+    {
+        if( s->getId() == spielerNummer )
+            i = s;
+    }
+    end = new Ende( schrift );
+    end->setGewonnen( ( zGewinner && i ) ? ( i->zTeam() == zGewinner ) : -1 );
 }
 
 Trigger *Spiel::getRandomTrigger()
@@ -1518,6 +1581,11 @@ ResourceRegistry *Spiel::zResources() const
     return resources;
 }
 
+int Spiel::läuft() const
+{
+    return !end || !end->getWeiter();
+}
+
 // Reference Counting 
 SpielV *Spiel::getThis()
 {

+ 15 - 0
StickmanWorldOnline/Spieler.cpp

@@ -156,6 +156,16 @@ void Inventar::removeItem( GegenstandTyp typ, int anzahl )
     }
 }
 
+int Inventar::getSelectedIndex() const
+{
+    return selected;
+}
+
+float Inventar::getAbklingzeit( int index ) const
+{
+    return abklingzeit[ index ];
+}
+
 
 Spieler::Spieler( ResourceRegistry *zResources, int id, Team *team, int spawnX, int spawnY, int farbe )
     : GameObject( SPIELER, spawnX, spawnY, 40, 50 )
@@ -1056,3 +1066,8 @@ const char *Spieler::getName() const
 {
     return name;
 }
+
+const Inventar &Spieler::getInventory() const
+{
+    return inv;
+}

+ 3 - 0
StickmanWorldOnline/Spieler.h

@@ -30,6 +30,8 @@ public:
     int getItemAnzahl( GegenstandTyp typ ) const;
     GegenstandTyp getItemTyp( int index ) const;
     void removeItem( GegenstandTyp typ, int anzahl );
+    int getSelectedIndex() const;
+    float getAbklingzeit( int index ) const;
 };
 
 class Spieler : public GameObject
@@ -172,6 +174,7 @@ public:
     int getGeschossen() const;
     GegenstandTyp getInventorySlot( int index ) const;
     const char *getName() const;
+    const Inventar &getInventory() const;
 };
 
 class DeadPlayer : public GameObject

+ 129 - 0
StickmanWorldOnline/SpielerGUI.cpp

@@ -0,0 +1,129 @@
+#include "SpielerGUI.h"
+
+SpielerGUI::SpielerGUI( ResourceRegistry *zResources )
+{
+    resources = zResources->getThis();
+    spieler = 0;
+    schrift = zResources->getSchrift();
+    erf = zResources->zResource( R_GUI_ERF, 0 )->getImage( 0 );
+    erfRand = zResources->zResource( R_GUI_ERF_RAND, 0 )->getImage( 0 );
+    ausw = zResources->zResource( R_GUI_INVENTAR_AUSWAHL, 0 )->getImage( 0 );
+    invBg = zResources->zResource( R_GUI_INVENTAR_HINTERGRUND, 0 )->getImage( 0 );
+    invBgUsed = zResources->zResource( R_GUI_INVENTAR_HINTERGRUND_BENUTZT, 0 )->getImage( 0 );
+    lebenRand = zResources->zResource( R_GUI_LEBEN_RAND, 0 )->getImage( 0 );
+    levelRand = zResources->zResource( R_GUI_LEVEL_RAND, 0 )->getImage( 0 );
+    spielerBild = zResources->zResource( R_GUI_SPIELER, 0 )->getImage( 0 );
+    levelT = new TextFeld();
+    levelT->setStyle( TextFeld::Style::Text | TextFeld::Style::Center );
+    levelT->setSchriftZ( schrift->getThis() );
+    levelT->setText( "0" );
+    levelT->setSchriftFarbe( 0xFFFFFFFF );
+    levelT->setSize( 75, 20 );
+    levelT->setPosition( 162, 0 );
+    lebenB = new FBalken();
+    lebenB->setStyle( FBalken::Style::Sichtbar | FBalken::Style::FFarbe | FBalken::Style::L_R | FBalken::Style::Aktionen );
+    lebenB->setSize( 178, 18 );
+    lebenB->setFBgFarbe( 0xFF00FF00 );
+    lebenB->setSchriftZ( schrift->getThis() );
+    lebenB->setSFarbe( 0xFFFFFFFF );
+    lebenB->setSSize( 12 );
+    lebenB->setPosition( 111, 31 );
+    itemAnzahlT = new TextFeld();
+    itemAnzahlT->setStyle( TextFeld::Style::Text );
+    itemAnzahlT->setSchriftZ( schrift->getThis() );
+    itemAnzahlT->setSize( 40, 20 );
+    spielerInfo = new TextFeld();
+    spielerInfo->setStyle( TextFeld::Style::Text );
+    spielerInfo->setSchriftZ( schrift->getThis() );
+    spielerInfo->setSchriftFarbe( 0xFFA0A0A0 );
+    spielerInfo->setSize( 290, 150 );
+    spielerInfo->setPosition( 5, 225 );
+}
+
+SpielerGUI::~SpielerGUI()
+{
+    if( spieler )
+        spieler->release();
+    schrift->release();
+    erf->release();
+    erfRand->release();
+    ausw->release();
+    invBg->release();
+    invBgUsed->release();
+    lebenRand->release();
+    levelRand->release();
+    spielerBild->release();
+    levelT->release();
+    lebenB->release();
+    resources->release();
+    itemAnzahlT->release();
+    spielerInfo->release();
+}
+
+void SpielerGUI::setSpieler( Spieler *spieler )
+{
+    if( this->spieler )
+        this->spieler->release();
+    this->spieler = spieler;
+    int *buffer = spielerBild->getBuffer();
+    for( int i = 0; i < spielerBild->getBreite() * spielerBild->getHeight(); i++ )
+    {
+        if( buffer[ i ] == 0xFF202020 )
+            buffer[ i ] = spieler->getFarbe();
+        if( buffer[ i ] == 0xFF404040 && spieler->zTeam() )
+            buffer[ i ] = spieler->zTeam()->getFarbe();
+    }
+}
+
+void SpielerGUI::render( Bild &rObj )
+{
+    rObj.drawBild( 0, 0, 100, 100, *spielerBild );
+    rObj.drawBild( 162, 0, 75, 20, *levelRand );
+    levelT->setText( Text( spieler->getLevel() ) );
+    levelT->render( rObj );
+    rObj.drawBild( 105, 25, 190, 30, *lebenRand );
+    lebenB->reset();
+    lebenB->setAktionAnzahl( spieler->getMaxLeben() );
+    lebenB->aktionPlus( (int)spieler->getLeben() );
+    lebenB->render( rObj );
+    rObj.drawBild( 120, 60, 160, 25, *erfRand );
+    int erfBreite = (int)( ( 150.f / spieler->getMaxErfahrung() ) * spieler->getErfahrung() );
+    rObj.drawBildSkall( 125, 65, erfBreite, 15, *erf );
+    rObj.fillRegion( 37, 105, 225, 115, 0xA36629 );
+    for( int i = 0; i < 8; i++ )
+    {
+        int x = 42 + 55 * ( i % 4 );
+        int y = 110 + 55 * ( i / 4 );
+        if( spieler->getInventory().getSelectedIndex() == i )
+            rObj.drawBild( x - 5, y - 5, 60, 60, *ausw );
+        if( spieler->getInventory().getItemTyp( i ) == KEIN_GEGENSTAND )
+            rObj.drawBild( x, y, 50, 50, *invBg );
+        else
+        {
+            rObj.drawBild( x, y, 50, 50, *invBgUsed );
+            rObj.alphaBild( x, y, 50, 50, *zResourceOfItem( spieler->getInventory().getItemTyp( i ), resources )->zImage( 0 ) );
+            if( spieler->getInventory().getAbklingzeit( i ) > 0 )
+            {
+                itemAnzahlT->setSchriftFarbe( 0xFFFF0000 );
+                itemAnzahlT->setText( Text( (int)( spieler->getInventory().getAbklingzeit( i ) * 100 ) / 100.f ) );
+            }
+            else
+            {
+                itemAnzahlT->setSchriftFarbe( 0xFFFFFFFF );
+                itemAnzahlT->setText( Text( spieler->getInventory().getItemAnzahl( spieler->getInventory().getItemTyp( i ) ) ) );
+            }
+            itemAnzahlT->setPosition( x + 5, y );
+            itemAnzahlT->render( rObj );
+        }
+    }
+    Text info = Text( "Eigenschaften:\n" ) +
+        "Lauftempo: " + (int)spieler->getLaufTempo() + " pixel/s\n" +
+        "Geschosstempo: " + (int)spieler->getGeschossTempo() + " pixel/s\n" +
+        "Rüstung: " + (int)spieler->getArmor() + " %\n" +
+        "Bonusschaden: " + (int)spieler->getSchadenBonus() + " %\n" +
+        "Lebensraub: " + (int)spieler->getLebensRaub() + " %\n" +
+        "Lebensregeneration: " + ((int)(spieler->getLebensRegenneration() * 100) / 100.f) + " /s\n" +
+        "Abklingzeitverringerung: " + (int)spieler->getAbklingZeitVerringerung();
+    spielerInfo->setText( info );
+    spielerInfo->render( rObj );
+}

+ 25 - 0
StickmanWorldOnline/SpielerGUI.h

@@ -1,10 +1,35 @@
 #pragma once
 
 #include <Zeichnung.h>
+#include <TextFeld.h>
+#include <Fortschritt.h>
+#include "Spieler.h"
+#include "Resource.h"
 
 using namespace Framework;
 
 class SpielerGUI : public Zeichnung
 {
+private:
+    Spieler *spieler;
+    Schrift *schrift;
+    TextFeld *levelT;
+    TextFeld *itemAnzahlT;
+    TextFeld *spielerInfo;
+    FBalken *lebenB;
+    Bild *erf;
+    Bild *erfRand;
+    Bild *ausw;
+    Bild *invBg;
+    Bild *invBgUsed;
+    Bild *lebenRand;
+    Bild *levelRand;
+    Bild *spielerBild;
+    ResourceRegistry *resources;
 
+public:
+    SpielerGUI( ResourceRegistry *zResources );
+    ~SpielerGUI();
+    void setSpieler( Spieler *spieler );
+    void render( Bild &rObj ) override;
 };

+ 1 - 0
StickmanWorldOnline/StickmanWorldOnline.vcxproj

@@ -48,6 +48,7 @@
     <ClCompile Include="Spiel.cpp" />
     <ClCompile Include="SpielChat.cpp" />
     <ClCompile Include="Spieler.cpp" />
+    <ClCompile Include="SpielerGUI.cpp" />
     <ClCompile Include="StatistikChat.cpp" />
     <ClCompile Include="StatistikTabelle.cpp" />
     <ClCompile Include="STKNachricht.cpp" />

+ 3 - 0
StickmanWorldOnline/StickmanWorldOnline.vcxproj.filters

@@ -149,6 +149,9 @@
     <ClCompile Include="Resource.cpp">
       <Filter>Resources</Filter>
     </ClCompile>
+    <ClCompile Include="SpielerGUI.cpp">
+      <Filter>Spiel</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Aufzeichnung.h">