Browse Source

Projektdateien hinzufügen.

Kolja Strohm 6 years ago
parent
commit
9630f6b3f5
13 changed files with 2074 additions and 0 deletions
  1. 28 0
      Blöcke.sln
  2. 203 0
      Blöcke/Blöcke.vcxproj
  3. 48 0
      Blöcke/Blöcke.vcxproj.filters
  4. 9 0
      Blöcke/Einstieg.cpp
  5. 106 0
      Blöcke/Game.cpp
  6. 36 0
      Blöcke/Game.h
  7. 184 0
      Blöcke/Initialisierung.cpp
  8. 28 0
      Blöcke/Initialisierung.h
  9. 374 0
      Blöcke/Map.cpp
  10. 45 0
      Blöcke/Map.h
  11. 844 0
      Blöcke/Menü.cpp
  12. 165 0
      Blöcke/Menü.h
  13. 4 0
      build.bat

+ 28 - 0
Blöcke.sln

@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.22823.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Blöcke", "Blöcke\Blöcke.vcxproj", "{1CED0788-41C6-463C-8D29-C7AF41EE6357}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{1CED0788-41C6-463C-8D29-C7AF41EE6357}.Debug|Win32.ActiveCfg = Debug|Win32
+		{1CED0788-41C6-463C-8D29-C7AF41EE6357}.Debug|Win32.Build.0 = Debug|Win32
+		{1CED0788-41C6-463C-8D29-C7AF41EE6357}.Debug|x64.ActiveCfg = Debug|x64
+		{1CED0788-41C6-463C-8D29-C7AF41EE6357}.Debug|x64.Build.0 = Debug|x64
+		{1CED0788-41C6-463C-8D29-C7AF41EE6357}.Release|Win32.ActiveCfg = Release|Win32
+		{1CED0788-41C6-463C-8D29-C7AF41EE6357}.Release|Win32.Build.0 = Release|Win32
+		{1CED0788-41C6-463C-8D29-C7AF41EE6357}.Release|x64.ActiveCfg = Release|x64
+		{1CED0788-41C6-463C-8D29-C7AF41EE6357}.Release|x64.Build.0 = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

+ 203 - 0
Blöcke/Blöcke.vcxproj

@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{1CED0788-41C6-463C-8D29-C7AF41EE6357}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>Blöcke</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\x64\Debug;$(LibraryPath)</LibraryPath>
+    <CustomBuildBeforeTargets>
+    </CustomBuildBeforeTargets>
+    <TargetName>Bloecke</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\Release;$(LibraryPath)</LibraryPath>
+    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>
+    <TargetName>Bloecke</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\x64\Release;$(LibraryPath)</LibraryPath>
+    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>
+    <TargetName>Bloecke</TargetName>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BLCKE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BLCKE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>Framework.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuild>
+      <Command>
+      </Command>
+    </CustomBuild>
+    <CustomBuild>
+      <Outputs>
+      </Outputs>
+    </CustomBuild>
+    <CustomBuildStep>
+      <Outputs>kopieren...;%(Outputs)</Outputs>
+      <Command>copy "..\x64\Debug\Bloecke.dll" "..\..\..\Fertig\Debug\Minigames\x64\Blöcke\bin\game.dll"</Command>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BLCKE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>Framework.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuildStep>
+      <Outputs>kopieren...;%(Outputs)</Outputs>
+      <Command>copy "..\Release\bloecke.dll" "..\..\..\Fertig\Minigames\x32\Blöcke\bin\game.dll"</Command>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BLCKE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>Framework.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuild>
+      <Command>
+      </Command>
+    </CustomBuild>
+    <CustomBuild>
+      <Outputs>
+      </Outputs>
+    </CustomBuild>
+    <CustomBuildStep>
+      <Outputs>kopieren...;%(Outputs)</Outputs>
+      <Command>copy "..\x64\Release\bloecke.dll" "..\..\..\Fertig\Minigames\x64\Blöcke\bin\game.dll"</Command>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="Game.h" />
+    <ClInclude Include="Initialisierung.h" />
+    <ClInclude Include="Map.h" />
+    <ClInclude Include="Menü.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Einstieg.cpp" />
+    <ClCompile Include="Game.cpp" />
+    <ClCompile Include="Initialisierung.cpp" />
+    <ClCompile Include="Map.cpp" />
+    <ClCompile Include="Menü.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 48 - 0
Blöcke/Blöcke.vcxproj.filters

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Quelldateien">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Headerdateien">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Ressourcendateien">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Game.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Menü.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Initialisierung.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Map.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Menü.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Game.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Initialisierung.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Einstieg.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Map.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+  </ItemGroup>
+</Project>

+ 9 - 0
Blöcke/Einstieg.cpp

@@ -0,0 +1,9 @@
+#include "Game.h"
+
+extern "C"
+{
+	__declspec( dllexport ) MiniGameV *GetMiniGame()
+	{
+		return new Game();
+	}
+}

+ 106 - 0
Blöcke/Game.cpp

@@ -0,0 +1,106 @@
+#include "Game.h"
+#include <Bild.h>
+
+// Inhalt der Game Klasse aus Game.h
+// Konstruktor
+Game::Game()
+{
+	schrift = 0;
+	screen = 0;
+	alpha = 0;
+	menü = 0;
+	ref = 1;
+}
+
+// Destruktor
+Game::~Game()
+{
+	if( schrift )
+		schrift->release();
+	if( screen )
+		screen->release();
+	if( menü )
+		menü->release();
+}
+
+// nicht constant
+bool Game::laden()
+{
+	return 1;
+}
+
+void Game::doMausEreignis( MausEreignis &me )
+{
+	if( menü )
+		menü->doMausEreignis( me );
+}
+
+void Game::doTastaturEreignis( TastaturEreignis &te )
+{
+	if( menü )
+		menü->doTastaturEreignis( te );
+}
+
+bool Game::tick( double zeit )
+{
+	int val = (int)( zeit * 150 );
+	if( menü && !menü->istBeendet() && alpha != 255 )
+	{
+		alpha += val;
+		if( alpha > 255 )
+			alpha = 255;
+		return 1;
+	}
+	if( menü && menü->istBeendet() && alpha )
+	{
+		alpha -= val;
+		if( alpha < 255 )
+			alpha = 0;
+	}
+	if( menü )
+		return menü->tick( zeit );
+	return 0;
+}
+
+void Game::render( Bild &zRObj )
+{
+	zRObj.setAlpha( alpha );
+	if( menü )
+		menü->render( zRObj );
+	zRObj.releaseAlpha();
+}
+
+void Game::setSchriftZ( Schrift *schrift )
+{
+	this->schrift = schrift;
+	if( !menü && this->schrift && screen )
+		menü = new Menü( schrift, screen );
+}
+
+void Game::setBildschirmZ( Bildschirm *screen )
+{
+	this->screen = screen;
+	if( !menü && schrift && screen )
+		menü = new Menü( schrift, screen );
+}
+
+// constant
+bool Game::istEnde() const
+{
+	return menü ? ( menü->istBeendet() && !alpha ) : 0;
+}
+
+// Reference Counting
+MiniGameV *Game::getThis()
+{
+	ref++;
+	return this;
+}
+
+MiniGameV *Game::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 36 - 0
Blöcke/Game.h

@@ -0,0 +1,36 @@
+#ifndef Game_H
+#define Game_H
+
+#include <MiniGameV.h>
+#include "Menü.h"
+
+class Game : public MiniGameV
+{
+private:
+	Schrift *schrift;
+	Bildschirm *screen;
+	Menü *menü;
+	int alpha;
+	int ref;
+
+public:
+	// Konstruktor
+	Game();
+	// Destruktor
+	~Game();
+	// nicht constant
+	virtual bool laden() override;
+	virtual void doMausEreignis( MausEreignis &me ) override;
+	virtual void doTastaturEreignis( TastaturEreignis &te ) override;
+	virtual bool tick( double zeit ) override;
+	virtual void render( Bild &zRObj ) override;
+	virtual void setSchriftZ( Schrift *schrift ) override;
+	virtual void setBildschirmZ( Bildschirm * screen ) override;
+	// constant
+	virtual bool istEnde() const override;
+	// Reference Counting
+	virtual MiniGameV *getThis() override;
+	virtual MiniGameV *release() override;
+};
+
+#endif

+ 184 - 0
Blöcke/Initialisierung.cpp

@@ -0,0 +1,184 @@
+#include "Initialisierung.h"
+#include <Schrift.h>
+#include <Textfeld.h>
+#include <MausEreignis.h>
+
+Knopf *initKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *titel )
+{
+	Knopf *ret = new Knopf();
+	ret->addStyle( style );
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	if( zSchrift )
+		ret->setSchriftZ( zSchrift->getThis() );
+	ret->setText( titel );
+	return ret;
+}
+
+KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt )
+{
+	KontrollKnopf *ret = new KontrollKnopf();
+	ret->setMausEreignis( _ret1ME );
+	ret->setStyle( style );
+	ret->setSchriftZ( zSchrift->getThis() );
+	ret->setText( txt );
+	ret->setSText( txt );
+	ret->setSFarbe( 0xFFFFFFFF );
+	ret->setSSize( 12 );
+	if( ret->hatStyle( TextFeld::Style::Buffered ) )
+	{
+		ret->setAlphaFeldFarbe( 0x5500FF00 );
+		ret->setAlphaFeldStrength( -5 );
+	}
+	if( ret->hatStyle( TextFeld::Style::Rahmen ) )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFF00FF00 );
+	}
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	ret->loadData( "data/bilder/system.ltdb" );
+	return ret;
+}
+
+TextFeld *initTextFeld( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt )
+{
+	TextFeld *ret = new TextFeld();
+	ret->setStyle( style );
+	ret->setSchriftZ( zSchrift->getThis() );
+	ret->setText( txt );
+	ret->setSchriftFarbe( 0xFFFFFFFF );
+	ret->setSchriftSize( 12 );
+	if( ret->hatStyle( TextFeld::Style::Buffered ) )
+	{
+		ret->setAlphaFeldFarbe( 0x5500FF00 );
+		ret->setAlphaFeldStrength( -5 );
+	}
+	if( ret->hatStyle( TextFeld::Style::Rahmen ) )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFF00FF00 );
+	}
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	return ret;
+}
+
+AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< char * > values )
+{
+	AuswahlBox *ret = new AuswahlBox();
+	ret->setStyle( style );
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	if( ( style | AuswahlBox::Style::Hintergrund ) == style )
+		ret->setHintergrundFarbe( 0xFF000000 );
+	if( ( style | AuswahlBox::Style::Erlaubt ) == style )
+		ret->setMausEreignis( _ret1ME );
+	if( zSchrift )
+		ret->setSchriftZ( zSchrift->getThis() );
+	if( ( style | AuswahlBox::Style::Rahmen ) == style )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
+	}
+	if( ( style | AuswahlBox::Style::MaxHeight ) == style )
+		ret->setMaxAuskappHeight( 100 );
+	if( ( style | AuswahlBox::Style::MausRahmen ) == style )
+	{
+		ret->setMausRahmenBreite( 1 );
+		ret->setMausRahmenFarbe( 0xFF005500 );
+	}
+	if( ( style | AuswahlBox::Style::MausBuffer ) == style )
+	{
+		ret->setMausAlphaFeldFarbe( 0x00008700 );
+		ret->setMausAlphaFeldStrength( -8 );
+	}
+	if( ( style | AuswahlBox::Style::AuswahlRahmen ) == style )
+	{
+		ret->setAuswRahmenBreite( 1 );
+		ret->setAuswRahmenFarbe( 0xFF00FF00 );
+	}
+	if( ( style | AuswahlBox::Style::AuswahlBuffer ) == style )
+	{
+		ret->setAuswAlphaFeldFarbe( 0x0000FF00 );
+		ret->setAuswAlphaFeldStrength( -8 );
+	}
+	for( auto i = values.begin(); i != values.end(); i++ )
+	{
+		ret->addEintrag( *i );
+	}
+	return ret;
+}
+
+ObjTabelle *initObjTabelle( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHeight )
+{
+	ObjTabelle *ret = new ObjTabelle();
+	ret->setStyle( style );
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	if( ( style | ObjTabelle::Style::Erlaubt ) == style )
+		ret->setMausEreignis( _ret1ME );
+	if( ( style | ObjTabelle::Style::Rahmen ) == style )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
+	}
+	if( ( style | ObjTabelle::Style::Raster ) == style )
+	{
+		ret->setRasterBreite( 1 );
+		ret->setRasterFarbe( 0xFFFFFFFF );
+	}
+	if( ( style | ObjTabelle::Style::VScroll ) == style )
+		ret->setVertikalKlickScroll( 5 );
+	if( ( style | ObjTabelle::Style::HScroll ) == style )
+		ret->setHorizontalKlickScroll( 5 );
+	for( auto i = spalten.begin(); i != spalten.end(); i++ )
+	{
+		ret->addSpalte( i->name );
+		ret->setSpaltenBreite( i->name, i->breite );
+		if( ( style | ObjTabelle::Style::SpaltenBreiteMin ) == style )
+			ret->setMinSpaltenBreite( i->name, i->minBreite );
+		if( ( style | ObjTabelle::Style::SpaltenBreiteMax ) == style )
+			ret->setMaxSpaltenBreite( i->name, i->maxBreite );
+		if( überschriftHeight )
+		{
+			if( ret->getZeilenNummer( "Überschrift" ) < 0 )
+			{
+				ret->addZeile( 0, "Überschrift" );
+				ret->setZeilenHeight( 0, 20 );
+			}
+			ret->setZeichnungZ( i->name, "Überschrift", initTextFeld( 0, 0, i->breite, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, i->name ) );
+		}
+	}
+	return ret;
+}
+
+LDiag *initLinienDiagramm( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, DiagDaten *data )
+{
+	LDiag *ret = new LDiag();
+	ret->setStyle( style );
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	if( zSchrift )
+	{
+		ret->setSchriftZ( zSchrift->getThis() );
+		ret->setSchriftSize( 12 );
+	}
+	if( data )
+		ret->setDiagDatenZ( data );
+	if( ret->hatStyle( LDiag::Style::Rahmen ) )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
+	}
+	if( ret->hatStyle( LDiag::Style::DatenRahmen ) )
+	{
+		ret->setDatenRahmenBreite( 1 );
+		ret->setDatenRahmenFarbe( 0xFFFFFFFF );
+	}
+	if( ret->hatStyle( LDiag::Style::Hintergrund ) )
+		ret->setHintergrundFarbe( 0xFF000000 );
+	if( ret->hatStyle( LDiag::Style::DatenHintergrund ) )
+		ret->setHintergrundFarbe( 0xFF000000 );
+	return ret;
+}

+ 28 - 0
Blöcke/Initialisierung.h

@@ -0,0 +1,28 @@
+#ifndef Initialisierung_H
+#define Initialisierung_H
+
+#include <Knopf.h>
+#include <Bild.h>
+#include <AuswahlBox.h>
+#include <Tabelle.h>
+#include <Diagramm.h>
+#include <initializer_list>
+
+using namespace Framework;
+
+struct OBJTabelleSpalteIni
+{
+	char *name;
+	int breite;
+	int minBreite;
+	int maxBreite;
+};
+
+Knopf *initKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *titel );
+KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt );
+TextFeld *initTextFeld( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt );
+AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< char * > values );
+ObjTabelle *initObjTabelle( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHeight );
+LDiag *initLinienDiagramm( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, DiagDaten *data );
+
+#endif

+ 374 - 0
Blöcke/Map.cpp

@@ -0,0 +1,374 @@
+#include "Map.h"
+#include <InitDatei.h>
+#include <Datei.h>
+#include <KSGTDatei.h>
+#include <Zeit.h>
+#include <Text.h>
+#include <TastaturEreignis.h>
+#include <MausEreignis.h>
+
+// Inhalt der Map Klasse aus Map.h
+// Konstruktor
+Map::Map()
+{
+	map = new RCArray< Array< int > >();
+	score = 0;
+	breite = 0;
+	höhe = 0;
+	geschwindigkeit = 0;
+	bAnzahl = 0;
+	next = 0;
+	beendet = 1;
+	sr = 1;
+	rend = 0;
+	ref = 1;
+}
+
+// Destruktor
+Map::~Map()
+{
+	speichern();
+	map->release();
+}
+
+// private
+void Map::remove( int x, int y )
+{
+	if( !map->z( x ) || !map->z( x )->hat( y ) || !map->z( x )->get( y ) )
+		return;
+	int f = map->z( x )->get( y );
+	map->z( x )->set( 0, y );
+	if( !f )
+		return;
+	if( map->z( x - 1 ) && map->z( x - 1 )->hat( y ) && map->z( x - 1 )->get( y ) == f )
+		remove( x - 1, y );
+	if( map->z( x + 1 ) && map->z( x + 1 )->hat( y ) && map->z( x + 1 )->get( y ) == f )
+		remove( x + 1, y );
+	if( map->z( x ) && map->z( x )->hat( y - 1 ) && map->z( x )->get( y - 1 ) == f )
+		remove( x, y - 1 );
+	if( map->z( x ) && map->z( x )->hat( y + 1 ) && map->z( x )->get( y + 1 ) == f )
+		remove( x, y + 1 );
+}
+
+// nicht constant
+void Map::reset()
+{
+	next = 0;
+	beendet = 0;
+	score = 0;
+	map->leeren();
+	InitDatei *opd = new InitDatei( "data/Minigames/Blöcke/data/optionen.ini" );
+	if( !opd->laden() )
+		DateiPfadErstellen( "data/Minigames/Blöcke/data/optionen.ini" );
+	breite = 20;
+	if( opd->wertExistiert( "Breite" ) )
+		breite = (int)*opd->zWert( "Breite" );
+	else
+		opd->addWert( "Breite", "20" );
+	höhe = 12;
+	if( opd->wertExistiert( "Height" ) )
+		höhe = (int)*opd->zWert( "Height" );
+	else
+		opd->addWert( "Height", "12" );
+	bAnzahl = 5;
+	if( opd->wertExistiert( "Farben" ) )
+		bAnzahl = (int)*opd->zWert( "Farben" );
+	else
+		opd->addWert( "Farben", "5" );
+	geschwindigkeit = 4000;
+	if( opd->wertExistiert( "Geschwindigkeit" ) )
+		geschwindigkeit = (int)*opd->zWert( "Geschwindigkeit" );
+	else
+		opd->addWert( "Geschwindigkeit", "4000" );
+	bool fortsetzen = 0;
+	if( opd->wertExistiert( "Fortsetzen" ) )
+		fortsetzen = (int)*opd->zWert( "Fortsetzen" ) != 0;
+	else
+		opd->addWert( "Fortsetzen", "0" );
+	opd->speichern();
+	opd->release();
+	if( fortsetzen && DateiExistiert( "data/Minigames/Blöcke/data/game.save" ) )
+	{
+		Datei *save = new Datei();
+		save->setDatei( "data/Minigames/Blöcke/data/game.save" );
+		save->open( Datei::Style::lesen );
+		int br = 0;
+		int hö = 0;
+		save->lese( (char*)&br, 4 );
+		save->lese( (char*)&hö, 4 );
+		if( br == breite && hö == höhe )
+		{
+			save->lese( (char*)&score, 4 );
+			for( int x = 0; x < breite; x++ )
+			{
+				map->set( new Array< int >(), x );
+				for( int y = 0; y < höhe; y++ )
+				{
+					int f = 0;
+					save->lese( (char*)&f, 4 );
+					map->z( x )->set( f, y );
+				}
+			}
+			next = geschwindigkeit / 1000.0;
+		}
+		save->close();
+		save->release();
+		int xOff = 0;
+		for( int x = 0; x < breite; x++ )
+		{
+			if( !map->z( x - xOff ) )
+				continue;
+			Array< int > *row = map->z( x - xOff );
+			int yOff = 0;
+			for( int y = 0; y < höhe; y++ )
+			{
+				if( row->hat( y - yOff ) && !row->get( y - yOff ) )
+				{
+					row->remove( y - yOff );
+					yOff++;
+				}
+			}
+			bool del = 1;
+			for( int y = 0; y < höhe; y++ )
+				del &= !row->hat( y - yOff ) || !row->get( y - yOff );
+			if( del )
+			{
+				map->remove( x - xOff );
+				xOff++;
+			}
+		}
+	}
+}
+
+void Map::doMausEreignis( MausEreignis &me )
+{
+	if( beendet )
+		return;
+	if( me.id == ME_RRechts )
+		next = 0;
+	if( me.id != ME_RLinks )
+		return;
+	int x = (int)( me.mx / ( 800.0 / breite ) );
+	int y = (int)( höhe - ( me.my / ( 500.0 / höhe ) ) );
+	if( !map->z( x ) || !map->z( x )->hat( y ) || !map->z( x )->get( y ) )
+		return;
+	bool remove = 0;
+	int f = map->z( x )->get( y );
+	if( map->z( x - 1 ) && map->z( x - 1 )->hat( y ) && map->z( x - 1 )->get( y ) == f )
+		remove = 1;
+	if( map->z( x + 1 ) && map->z( x + 1 )->hat( y ) && map->z( x + 1 )->get( y ) == f )
+		remove = 1;
+	if( map->z( x ) && map->z( x )->hat( y - 1 ) && map->z( x )->get( y - 1 ) == f )
+		remove = 1;
+	if( map->z( x ) && map->z( x )->hat( y + 1 ) && map->z( x )->get( y + 1 ) == f )
+		remove = 1;
+	if( !remove )
+		return;
+	rend = 1;
+	this->remove( x, y );
+	int xOff = 0;
+	for( int x = 0; x < breite; x++ )
+	{
+		if( !map->z( x - xOff ) )
+			continue;
+		Array< int > *row = map->z( x - xOff );
+		int yOff = 0;
+		for( int y = 0; y < höhe; y++ )
+		{
+			if( row->hat( y - yOff ) && !row->get( y - yOff ) )
+			{
+				row->remove( y - yOff );
+				yOff++;
+			}
+		}
+		bool del = 1;
+		for( int y = 0; y < höhe; y++ )
+			del &= !row->hat( y - yOff ) || !row->get( y - yOff );
+		if( del )
+		{
+			score++;
+			map->remove( x - xOff );
+			xOff++;
+		}
+	}
+}
+
+void Map::doTastaturEreignis( TastaturEreignis &te )
+{
+	if( te.id == TE_Release )
+		next = 0;
+}
+
+bool Map::tick( double tickVal )
+{
+	bool ret = rend;
+	rend = 0;
+	if( beendet )
+		return ret;
+	if( sr )
+		srand( (int)time( 0 ) );
+	sr = 0;
+	next -= tickVal;
+	if( next < 0 )
+	{
+		next = geschwindigkeit / 1000.0;
+		Array< int > *n = new Array< int >();
+		for( int i = 0; i < höhe; i++ )
+		{
+			int val = rand() % bAnzahl;
+			switch( val )
+			{
+			case 0:
+				n->set( 0xFFFF0000, i );
+				break;
+			case 1:
+				n->set( 0xFF00FF00, i );
+				break;
+			case 2:
+				n->set( 0xFF0000FF, i );
+				break;
+			case 3:
+				n->set( 0xFFFFFF00, i );
+				break;
+			case 4:
+				n->set( 0xFF00FFFF, i );
+				break;
+			case 5:
+				n->set( 0xFFFF00FF, i );
+				break;
+			case 6:
+				n->set( 0xFFFFFFFF, i );
+				break;
+			case 7:
+				n->set( 0xFFFF5555, i );
+				break;
+			case 8:
+				n->set( 0xFF55FF55, i );
+				break;
+			case 9:
+				n->set( 0xFF5555FF, i );
+				break;
+			default:
+				n->set( 0xFF000000, i );
+				break;
+			}
+		}
+		map->add( n, 0 );
+		if( map->z( breite ) )
+		{
+			Array< int > *row = map->z( breite );
+			for( int i = 0; i < höhe; i++ )
+			{
+				if( row->hat( i ) )
+					beendet |= row->get( i ) != 0;
+			}
+			if( beendet )
+			{
+				KSGTDatei *stb = new KSGTDatei( "data/Minigames/Blöcke/data/score.ksgt" );
+				if( !stb->laden() )
+					DateiPfadErstellen( "data/Minigames/Blöcke/data/score.ksgt" );
+				RCArray< Text > *zeile = new RCArray< Text >();
+				Zeit *zeit = getZeit();
+				zeile->add( zeit->getZeit( "y-m-d h:i:s" ) );
+				zeit->release();
+				Text *scoreT = new Text();
+				scoreT->append( score );
+				zeile->add( scoreT );
+				Text *breiteT = new Text();
+				breiteT->append( breite );
+				zeile->add( breiteT );
+				Text *höheT = new Text();
+				höheT->append( höhe );
+				zeile->add( höheT );
+				Text *geschwindigkeitT = new Text();
+				geschwindigkeitT->append( geschwindigkeit );
+				zeile->add( geschwindigkeitT );
+				Text *bAnzahlT = new Text();
+				bAnzahlT->append( bAnzahl );
+				zeile->add( bAnzahlT );
+				stb->addZeile( 6, zeile );
+				zeile->release();
+				stb->speichern();
+				stb->release();
+                DateiRemove( "data/Minigames/Blöcke/data/game.save" );
+			}
+		}
+		map->remove( breite );
+		ret = 1;
+	}
+	return ret;
+}
+
+void Map::render( Bild &zRObj )
+{
+	for( int x = 0; x < breite; x++ )
+	{
+		if( !map->z( x ) )
+			continue;
+		Array< int > *row = map->z( x );
+		for( int y = 0; y < höhe; y++ )
+		{
+			if( !row->hat( y ) )
+				continue;
+			int xs = (int)( x * ( 800.0 / breite ) );
+			int ys = (int)( ( höhe - y - 1 ) * ( 500.0 / höhe ) );
+			int xe = (int)( ( x + 1 ) * ( 800.0 / breite ) );
+			int ye = (int)( ( höhe - y ) * ( 500.0 / höhe ) );
+			zRObj.fillRegion( xs, ys, xe - xs, ye - ys, row->get( y ) );
+		}
+	}
+}
+
+// constant
+void Map::speichern() const
+{
+	if( !beendet )
+	{
+		Datei *d = new Datei();
+		d->setDatei( "data/Minigames/Blöcke/data/game.save" );
+		d->erstellen();
+		d->open( Datei::Style::schreiben );
+		d->schreibe( (char*)&breite, 4 );
+		d->schreibe( (char*)&höhe, 4 );
+		d->schreibe( (char*)&score, 4 );
+		for( int x = 0; x < breite; x++ )
+		{
+			for( int y = 0; y < höhe; y++ )
+			{
+				int f = 0;
+				if( map->z( x ) && map->z( x )->hat( y ) )
+					f = map->z( x )->get( y );
+				d->schreibe( (char*)&f, 4 );
+			}
+		}
+		d->close();
+		d->release();
+	}
+	else
+		DateiRemove( "data/Minigames/Blöcke/data/game.save" );
+}
+
+int Map::getScore() const
+{
+	return score;
+}
+
+bool Map::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+Map *Map::getThis()
+{
+	ref++;
+	return this;
+}
+
+Map *Map::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 45 - 0
Blöcke/Map.h

@@ -0,0 +1,45 @@
+#ifndef Map_H
+#define Map_H
+
+#include <Bild.h>
+
+using namespace Framework;
+
+class Map
+{
+private:
+	RCArray< Array< int > > *map;
+	int score;
+	int breite;
+	int höhe;
+	int geschwindigkeit;
+	int bAnzahl;
+	double next;
+	bool beendet;
+	bool sr;
+	bool rend;
+	int ref;
+	// private
+	void remove( int x, int y );
+
+public:
+	// Konstruktor
+	Map();
+	// Destruktor
+	~Map();
+	// nicht constant
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	void doTastaturEreignis( TastaturEreignis &te );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// constant
+	void speichern() const;
+	int getScore() const;
+	bool istBeendet() const;
+	// Reference Counting
+	Map *getThis();
+	Map *release();
+};
+
+#endif

+ 844 - 0
Blöcke/Menü.cpp

@@ -0,0 +1,844 @@
+#include "Menü.h"
+#include "Initialisierung.h"
+#include <MausEreignis.h>
+#include <Textfeld.h>
+#include <InitDatei.h>
+#include <Text.h>
+#include <Datei.h>
+#include <TastaturEreignis.h>
+#include <KSGTDatei.h>
+#include <Schrift.h>
+#include <DateiSystem.h>
+#include <Rahmen.h>
+
+// Inhalt der MenüVerloren Klasse aus Menü.h
+// Kontruktor
+MenüVerloren::MenüVerloren( Schrift *zSchrift )
+{
+	ram = new LRahmen();
+	ram->setSize( 160, 100 );
+	ram->setPosition( 320, 200 );
+	ram->setFarbe( 0xFFFFFFFF );
+	verloren = initTextFeld( 325, 210, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Du hast verloren." );
+	neu = initKnopf( 350, 240, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Neues Spiel" );
+	beenden = initKnopf( 350, 270, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Zurück" );
+	ref = 1;
+}
+
+// Destruktor
+MenüVerloren::~MenüVerloren()
+{
+	verloren->release();
+	neu->release();
+	beenden->release();
+	ram->release();
+}
+
+// nicht constant
+int MenüVerloren::doMausEreignis( MausEreignis &me )
+{
+	bool vera = me.verarbeitet;
+	int ret = 0;
+	neu->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+		ret = 1;
+	beenden->doMausEreignis( me );
+	if( !vera && me.verarbeitet && !ret && me.id == ME_RLinks )
+		ret = 2;
+	return ret;
+}
+
+bool MenüVerloren::tick( double tickVal )
+{
+	bool ret = verloren->tick( tickVal );
+	ret |= neu->tick( tickVal );
+	ret |= beenden->tick( tickVal );
+	return ret;
+}
+
+void MenüVerloren::render( Bild &zRObj )
+{
+	zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
+	verloren->render( zRObj );
+	neu->render( zRObj );
+	beenden->render( zRObj );
+	ram->render( zRObj );
+}
+
+// Reference Counting
+MenüVerloren *MenüVerloren::getThis()
+{
+	ref++;
+	return this;
+}
+
+MenüVerloren *MenüVerloren::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}
+
+
+// Inhalt der MenüSpiel Klasse aus Menü.h
+// Konstruktor
+MenüSpiel::MenüSpiel( Schrift *zSchrift, Bildschirm *zScreen )
+{
+	scoreT = initTextFeld( 690, 10, 100, 20, zSchrift, TextFeld::Style::Text, "Score: 0" );
+	beenden = initKnopf( 690, 40, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
+	map = new Map();
+	verloren = new MenüVerloren( zSchrift );
+	beendet = 0;
+	ref = 1;
+}
+
+// Destruktor
+MenüSpiel::~MenüSpiel()
+{
+	scoreT->release();
+	beenden->release();
+	map->release();
+	verloren->release();
+}
+
+// nicht constant
+void MenüSpiel::reset()
+{
+	map->reset();
+	beendet = 0;
+	scoreT->setText( "Score: " );
+	scoreT->zText()->append( map->getScore() );
+}
+
+void MenüSpiel::doMausEreignis( MausEreignis &me )
+{
+	bool vera = me.verarbeitet;
+	beenden->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+	{
+		map->speichern();
+		beendet = 1;
+	}
+	map->doMausEreignis( me );
+	scoreT->setText( "Score: " );
+	scoreT->zText()->append( map->getScore() );
+	if( map->istBeendet() )
+	{
+		int ak = verloren->doMausEreignis( me );
+		if( ak == 1 )
+			reset();
+		if( ak == 2 )
+			beendet = 1;
+	}
+}
+
+void MenüSpiel::doTastaturEreignis( TastaturEreignis &te )
+{
+	if( map->istBeendet() )
+	{
+		if( te.id == TE_Release && te.taste == T_Enter )
+			reset();
+		if( te.id == TE_Release && te.taste == T_BackSpace )
+			beendet = 1;
+		return;
+	}
+	map->doTastaturEreignis( te );
+}
+
+bool MenüSpiel::tick( double tickVal )
+{
+	bool ret = beenden->tick( tickVal );
+	ret |= map->tick( tickVal );
+	if( map->istBeendet() )
+		ret |= verloren->tick( tickVal );
+	return ret;
+}
+
+void MenüSpiel::render( Bild &zRObj )
+{
+	map->render( zRObj );
+	scoreT->render( zRObj );
+	beenden->render( zRObj );
+	if( map->istBeendet() )
+		verloren->render( zRObj );
+}
+
+// constant
+bool MenüSpiel::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+MenüSpiel *MenüSpiel::getThis()
+{
+	ref++;
+	return this;
+}
+
+MenüSpiel *MenüSpiel::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}
+
+
+// Inhalt der MenüStatistik Klasse aus Menü.h
+// Konstruktor
+MenüStatistik::MenüStatistik( Schrift *zSchrift, Bildschirm *zScreen )
+{
+	ansichtT = initTextFeld( 245, 10, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Ansicht:" );
+	ansicht = initAuswahlBox( 295, 10, 120, 20, zSchrift, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Tabelle", "Diagramm" } );
+	optionen = initKontrollKnopf( 425, 10, 130, 20, zSchrift, KontrollKnopf::Style::Normal, "Optionen beachten" );
+	gesammtT = initObjTabelle( 150, 40, 500, 420, zSchrift, ObjTabelle::Style::normal, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Height", 70, 0, 0 }, { "Farben", 70, 0, 0 }, { "Tempo", 70, 0, 0 } }, 20 );
+	optionenT = initObjTabelle( 150, 40, 500, 420, zSchrift, ObjTabelle::Style::normal, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Height", 70, 0, 0 }, { "Farben", 70, 0, 0 }, { "Tempo", 70, 0, 0 } }, 20 );
+	gesammtD = initLinienDiagramm( 100, 40, 600, 420, zSchrift, LDiag::Style::DatenRahmen, 0 );
+	optionenD = initLinienDiagramm( 100, 40, 600, 420, zSchrift, LDiag::Style::DatenRahmen, 0 );
+	removen = initKnopf( 10, 470, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Zurücksetzen" );
+	zurück = initKnopf( 350, 470, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Zurück" );
+	schrift = zSchrift->getThis();
+}
+
+// Destruktor
+MenüStatistik::~MenüStatistik()
+{
+	int anz = gesammtT->getZeilenAnzahl();
+	for( int i = 0; i < anz; i++ )
+	{
+		for( int j = 0; j < 6; j++ )
+			( (TextFeld*)gesammtT->zZeichnung( j, 0 ) )->release();
+		gesammtT->removeZeile( 0 );
+	}
+	for( int j = 0; j < 6; j++ )
+		( (TextFeld*)optionenT->zZeichnung( j, 0 ) )->release();
+	ansichtT->release();
+	ansicht->release();
+	optionen->release();
+	gesammtT->release();
+	optionenT->release();
+	gesammtD->release();
+	optionenD->release();
+	removen->release();
+	zurück->release();
+	schrift->release();
+}
+
+// nicht constant
+void MenüStatistik::reset()
+{
+	int anz = gesammtT->getZeilenAnzahl();
+	for( int i = 1; i < anz; i++ )
+	{
+		for( int j = 0; j < 6; j++ )
+			( (TextFeld*)gesammtT->zZeichnung( j, 1 ) )->release();
+		gesammtT->removeZeile( 1 );
+	}
+	anz = optionenT->getZeilenAnzahl();
+	for( int i = 1; i < anz; i++ )
+		optionenT->removeZeile( 1 );
+	InitDatei *opd = new InitDatei( "data/Minigames/Blöcke/data/optionen.ini" );
+	opd->laden();
+	if( !opd->wertExistiert( "Breite" ) )
+		opd->addWert( "Breite", "20" );
+	if( !opd->wertExistiert( "Height" ) )
+		opd->addWert( "Height", "12" );
+	if( !opd->wertExistiert( "Farben" ) )
+		opd->addWert( "Farben", "5" );
+	if( !opd->wertExistiert( "Geschwindigkeit" ) )
+		opd->addWert( "Geschwindigkeit", "4000" );
+	if( !opd->wertExistiert( "Fortsetzen" ) )
+		opd->addWert( "Fortsetzen", "0" );
+	opd->speichern();
+	KSGTDatei *stb = new KSGTDatei( "data/Minigames/Blöcke/data/score.ksgt" );
+	stb->laden();
+	anz = stb->getZeilenAnzahl();
+	bool *fertig = new bool[ anz ];
+	ZeroMemory( fertig, anz );
+	int mS = 0;
+	int omS = 0;
+	int oAnz = 0;
+	for( int i = 0; i < anz; i++ )
+	{
+		int maxScore = -1;
+		int p = -1;
+		for( int j = 0; j < anz; j++ )
+		{
+			if( !fertig[ j ] && maxScore < (int)*stb->zFeld( j, 1 ) )
+			{
+				p = j;
+				maxScore = (int)*stb->zFeld( j, 1 );
+			}
+		}
+		if( p >= 0 )
+		{
+			fertig[ p ] = 1;
+			TextFeld *scoreT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 1 )->getText() );
+			TextFeld *datumT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 0 )->getText() );
+			TextFeld *breiteT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 2 )->getText() );
+			TextFeld *höheT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 3 )->getText() );
+			TextFeld *farbenT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 5 )->getText() );
+			TextFeld *tempoT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 4 )->getText() );
+			gesammtT->addZeile( Text() += p );
+			gesammtT->setZeichnungZ( 0, i + 1, scoreT );
+			gesammtT->setZeichnungZ( 1, i + 1, datumT );
+			gesammtT->setZeichnungZ( 2, i + 1, breiteT );
+			gesammtT->setZeichnungZ( 3, i + 1, höheT );
+			gesammtT->setZeichnungZ( 4, i + 1, farbenT );
+			gesammtT->setZeichnungZ( 5, i + 1, tempoT );
+			if( breiteT->zText()->istGleich( opd->zWert( "Breite" )->getText() ) &&
+				höheT->zText()->istGleich( opd->zWert( "Height" )->getText() ) &&
+				farbenT->zText()->istGleich( opd->zWert( "Farben" )->getText() ) &&
+				tempoT->zText()->istGleich( opd->zWert( "Geschwindigkeit" )->getText() ) )
+			{
+				optionenT->addZeile( Text() += p );
+				int n = optionenT->getZeilenNummer( Text() += p );
+				optionenT->setZeichnungZ( 0, n, scoreT );
+				optionenT->setZeichnungZ( 1, n, datumT );
+				optionenT->setZeichnungZ( 2, n, breiteT );
+				optionenT->setZeichnungZ( 3, n, höheT );
+				optionenT->setZeichnungZ( 4, n, farbenT );
+				optionenT->setZeichnungZ( 5, n, tempoT );
+				if( !omS )
+					omS = maxScore;
+				oAnz++;
+			}
+		}
+		if( !mS )
+			mS = maxScore;
+	}
+	delete[] fertig;
+	DiagDaten *gd = new DiagDaten();
+	gd->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar;
+	gd->hIntervallFarbe = 0xFFFFFFFF;
+	gd->hIntervallName->setText( "Spiel" );
+	gd->rasterDicke = 1;
+	gd->rasterFarbe = 0xFF505050;
+	gd->vIntervallFarbe = 0xFFFFFFFF;
+	gd->vIntervallName->setText( "Score" );
+	gesammtD->setDiagDatenZ( gd );
+	gesammtD->addVIntervallText( mS + 1, Text() += ( mS + 1 ) );
+	gesammtD->addVIntervallText( 0, "0" );
+	gesammtD->addHIntervallText( 0, "1" );
+	if( anz > 1 )
+		gesammtD->addHIntervallText( anz - 1, Text() += anz );
+	gesammtD->addWert( "Score" );
+	gesammtD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund );
+	gesammtD->setWertFarbe( 0, 0xFF00FF00 );
+	gesammtD->zDiagWert( 0 )->hintergrund = 0xFF205050;
+	DiagDaten *od = new DiagDaten();
+	od->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar;
+	od->hIntervallFarbe = 0xFFFFFFFF;
+	od->hIntervallName->setText( "Spiel" );
+	od->rasterDicke = 1;
+	od->rasterFarbe = 0xFF505050;
+	od->vIntervallFarbe = 0xFFFFFFFF;
+	od->vIntervallName->setText( "Score" );
+	optionenD->setDiagDatenZ( od );
+	optionenD->addVIntervallText( omS + 1, Text() += ( omS + 1 ) );
+	optionenD->addVIntervallText( 0, "0" );
+	optionenD->addHIntervallText( 0, "1" );
+	if( oAnz > 1 )
+		optionenD->addHIntervallText( oAnz - 1, Text() += oAnz );
+	optionenD->addWert( "Score" );
+	optionenD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund );
+	optionenD->setWertFarbe( 0, 0xFF00FF00 );
+	optionenD->zDiagWert( 0 )->hintergrund = 0xFF205050;
+	int j = 0;
+	for( int i = 0; i < anz; i++ )
+	{
+		gesammtD->addPunkt( 0, i, (int)*stb->zFeld( i, 1 ) );
+		if( (int)*stb->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) &&
+			(int)*stb->zFeld( i, 3 ) == (int)*opd->zWert( "Height" ) &&
+			(int)*stb->zFeld( i, 5 ) == (int)*opd->zWert( "Farben" ) &&
+			(int)*stb->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) )
+		{
+			optionenD->addPunkt( 0, j, (int)*stb->zFeld( i, 1 ) );
+			j++;
+		}
+	}
+	stb->release();
+	opd->release();
+	beendet = 0;
+}
+
+void MenüStatistik::doMausEreignis( MausEreignis &me )
+{
+	ansicht->doMausEreignis( me );
+	optionen->doMausEreignis( me );
+	bool vera = me.verarbeitet;
+	removen->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+	{ // Statistik removen
+		if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
+		{ // nur bestimmte Statistik removen
+			InitDatei *opd = new InitDatei( "data/Minigames/Blöcke/data/optionen.ini" );
+			opd->laden();
+			KSGTDatei *score = new KSGTDatei( "data/Minigames/Blöcke/data/score.ksgt" );
+			score->laden();
+			int zeilen = score->getZeilenAnzahl();
+			for( int i = 0; i < zeilen; i++ )
+			{
+				if( (int)*score->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) &&
+					(int)*score->zFeld( i, 3 ) == (int)*opd->zWert( "Height" ) &&
+					(int)*score->zFeld( i, 5 ) == (int)*opd->zWert( "Farben" ) &&
+					(int)*score->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) )
+				{
+					score->removeZeile( i );
+					i--;
+					zeilen--;
+				}
+			}
+			score->speichern();
+			score->release();
+			opd->release();
+		}
+		else // alles removen
+			DateiRemove( "data/Minigames/Blöcke/data/score.ksgt" );
+		reset();
+	}
+	vera = me.verarbeitet;
+	zurück->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+		beendet = 1;
+}
+
+bool MenüStatistik::tick( double tickVal )
+{
+	bool ret = ansicht->tick( tickVal );
+	ret |= optionen->tick( tickVal );
+	ret |= removen->tick( tickVal );
+	ret |= zurück->tick( tickVal );
+	ret |= gesammtT->tick( tickVal );
+	ret |= optionenT->tick( tickVal );
+	ret |= gesammtD->tick( tickVal );
+	ret |= optionenD->tick( tickVal );
+	return ret;
+}
+
+void MenüStatistik::render( Bild &zRObj )
+{
+	if( !ansicht->getAuswahl() )
+	{
+		if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
+			optionenT->render( zRObj );
+		else
+			gesammtT->render( zRObj );
+	}
+	else
+	{
+		if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
+			optionenD->render( zRObj );
+		else
+			gesammtD->render( zRObj );
+	}
+	ansichtT->render( zRObj );
+	ansicht->render( zRObj );
+	optionen->render( zRObj );
+	removen->render( zRObj );
+	zurück->render( zRObj );
+}
+
+// constant
+bool MenüStatistik::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+MenüStatistik *MenüStatistik::getThis()
+{
+	ref++;
+	return this;
+}
+
+MenüStatistik *MenüStatistik::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}
+
+
+// Inhalt der MenüOptionen aus Menü.h
+// Konstruktor
+MenüOptionen::MenüOptionen( Schrift *zSchrift, Bildschirm *zScreen )
+{
+	breiteT = initTextFeld( 310, 140, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Breite:" );
+	breite = initTextFeld( 440, 140, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	breite->setTastaturEreignis( _nurNummernTE );
+	höheT = initTextFeld( 310, 180, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Height:" );
+	höhe = initTextFeld( 440, 180, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	höhe->setTastaturEreignis( _nurNummernTE );
+	bAnzahlT = initTextFeld( 310, 220, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Verschiedene Farben:" );
+	bAnzahl = initTextFeld( 440, 220, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	bAnzahl->setTastaturEreignis( _nurNummernTE );
+	tempoT = initTextFeld( 310, 260, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Zeit Abstände:" );
+	tempo = initTextFeld( 440, 260, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	tempo->setTastaturEreignis( _nurNummernTE );
+	fortsetzen = initKontrollKnopf( 310, 300, 180, 20, zSchrift, KontrollKnopf::Style::Normal, "Letztes Spiel fortsetzen" );
+	fortsetzen->setMausEreignis( _ret1ME );
+	abbrechen = initKnopf( 310, 340, 85, 20, zSchrift, Knopf::Style::Sichtbar, "Abbrechen" );
+	ok = initKnopf( 405, 340, 85, 20, zSchrift, Knopf::Style::Sichtbar, "Ok" );
+	beendet = 0;
+	ref = 1;
+}
+
+// Destruktor
+MenüOptionen::~MenüOptionen()
+{
+	breiteT->release();
+	breite->release();
+	höheT->release();
+	höhe->release();
+	bAnzahlT->release();
+	bAnzahl->release();
+	tempoT->release();
+	tempo->release();
+	fortsetzen->release();
+	abbrechen->release();
+	ok->release();
+}
+
+// nicht constant
+void MenüOptionen::reset()
+{
+	InitDatei *opd = new InitDatei( "data/Minigames/Blöcke/data/optionen.ini" );
+	if( !opd->laden() )
+		DateiPfadErstellen( "data/Minigames/Blöcke/data/optionen.ini" );
+	breite->setText( "20" );
+	if( opd->wertExistiert( "Breite" ) )
+		breite->setText( Text() += (int)*opd->zWert( "Breite" ) );
+	else
+		opd->addWert( "Breite", "20" );
+	höhe->setText( "12" );
+	if( opd->wertExistiert( "Height" ) )
+		höhe->setText( Text() += (int)*opd->zWert( "Height" ) );
+	else
+		opd->addWert( "Height", "12" );
+	bAnzahl->setText( "5" );
+	if( opd->wertExistiert( "Farben" ) )
+		bAnzahl->setText( Text() += (int)*opd->zWert( "Farben" ) );
+	else
+		opd->addWert( "Farben", "5" );
+	tempo->setText( "4000" );
+	if( opd->wertExistiert( "Geschwindigkeit" ) )
+		tempo->setText( Text() += (int)*opd->zWert( "Geschwindigkeit" ) );
+	else
+		opd->addWert( "Geschwindigkeit", "4000" );
+	fortsetzen->removeStyle( KontrollKnopf::Style::Selected );
+	if( opd->wertExistiert( "Fortsetzen" ) )
+		fortsetzen->setStyle( KontrollKnopf::Style::Selected, (int)*opd->zWert( "Fortsetzen" ) != 0 );
+	else
+		opd->addWert( "Fortsetzen", "0" );
+	beendet = 0;
+	opd->speichern();
+	opd->release();
+}
+
+void MenüOptionen::doMausEreignis( MausEreignis &me )
+{
+	breite->doMausEreignis( me );
+	höhe->doMausEreignis( me );
+	bAnzahl->doMausEreignis( me );
+	tempo->doMausEreignis( me );
+	fortsetzen->doMausEreignis( me );
+	bool vera = me.verarbeitet;
+	abbrechen->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+		beendet = 1;
+	vera = me.verarbeitet;
+	ok->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+	{
+		InitDatei *opd = new InitDatei( "data/Minigames/Blöcke/data/optionen.ini" );
+		if( !opd->laden() )
+			DateiPfadErstellen( "data/Minigames/Blöcke/data/optionen.ini" );
+		if( (int)*breite->zText() > 100 )
+			breite->setText( "100" );
+		if( (int)*breite->zText() < 10 )
+			breite->setText( "10" );
+		if( opd->wertExistiert( "Breite" ) )
+			opd->setWert( "Breite", Text() += (int)*breite->zText() );
+		else
+			opd->addWert( "Breite", Text() += (int)*breite->zText() );
+		if( (int)*höhe->zText() > 100 )
+			höhe->setText( "100" );
+		if( (int)*höhe->zText() < 10 )
+			höhe->setText( "10" );
+		if( opd->wertExistiert( "Height" ) )
+			opd->setWert( "Height", Text() += (int)*höhe->zText() );
+		else
+			opd->addWert( "Height", Text() += (int)*höhe->zText() );
+		if( (int)*bAnzahl->zText() > 10 )
+			bAnzahl->setText( "10" );
+		if( (int)*bAnzahl->zText() < 3 )
+			bAnzahl->setText( "3" );
+		if( opd->wertExistiert( "Farben" ) )
+			opd->setWert( "Farben", Text() += (int)*bAnzahl->zText() );
+		else
+			opd->addWert( "Farben", Text() += (int)*bAnzahl->zText() );
+		if( (int)*tempo->zText() < 100 )
+			tempo->setText( "100" );
+		if( opd->wertExistiert( "Geschwindigkeit" ) )
+			opd->setWert( "Geschwindigkeit", Text() += (int)*tempo->zText() );
+		else
+			opd->addWert( "Geschwindigkeit", Text() += (int)*tempo->zText() );
+		if( opd->wertExistiert( "Fortsetzen" ) )
+			opd->setWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) );
+		else
+			opd->addWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) );
+		opd->speichern();
+		opd->release();
+		beendet = 1;
+	}
+}
+
+void MenüOptionen::doTastaturEreignis( TastaturEreignis &te )
+{
+	breite->doTastaturEreignis( te );
+	höhe->doTastaturEreignis( te );
+	bAnzahl->doTastaturEreignis( te );
+	tempo->doTastaturEreignis( te );
+}
+
+bool MenüOptionen::tick( double tickVal )
+{
+	bool ret = breite->tick( tickVal );
+	ret |= höhe->tick( tickVal );
+	ret |= bAnzahl->tick( tickVal );
+	ret |= tempo->tick( tickVal );
+	ret |= fortsetzen->tick( tickVal );
+	ret |= abbrechen->tick( tickVal );
+	ret |= ok->tick( tickVal );
+	return ret;
+}
+
+void MenüOptionen::render( Bild &zRObj )
+{
+	breiteT->render( zRObj );
+	breite->render( zRObj );
+	höheT->render( zRObj );
+	höhe->render( zRObj );
+	bAnzahlT->render( zRObj );
+	bAnzahl->render( zRObj );
+	tempoT->render( zRObj );
+	tempo->render( zRObj );
+	fortsetzen->render( zRObj );
+	abbrechen->render( zRObj );
+	ok->render( zRObj );
+}
+
+// constant
+bool MenüOptionen::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+MenüOptionen *MenüOptionen::getThis()
+{
+	ref++;
+	return this;
+}
+
+MenüOptionen *MenüOptionen::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}
+
+
+// Inhalt der Menü Klasse aus Menü.h
+// Konstruktor
+Menü::Menü( Schrift *zSchrift, Bildschirm *zScreen )
+{
+	spielen = initKnopf( 350, 180, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Spielen" );
+	spielenF = new MenüSpiel( zSchrift, zScreen );
+	optionen = initKnopf( 350, 220, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Optionen" );
+	optionenF = new MenüOptionen( zSchrift, zScreen );
+	statistik = initKnopf( 350, 260, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Statistik" );
+	statistikF = new MenüStatistik( zSchrift, zScreen );
+	beenden = initKnopf( 350, 300, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
+	ram = new LRahmen();
+	ram->setFarbe( 0xFFFFFFFF );
+	beendet = 0;
+	status = 0;
+	LTDBDatei *bgd = new LTDBDatei();
+	bgd->setDatei( new Text( "data/Minigames/Blöcke/bilder/hintergrund.ltdb" ) );
+	bgd->leseDaten( 0 );
+	hintergrund = bgd->laden( 0, new Text( "bg.jpg" ) );
+	bgd->release();
+	ref = 1;
+}
+
+// Destruktor
+Menü::~Menü()
+{
+	spielen->release();
+	spielenF->release();
+	optionen->release();
+	optionenF->release();
+	statistik->release();
+	statistikF->release();
+	beenden->release();
+	if( hintergrund )
+		hintergrund->release();
+	ram->release();
+}
+
+// nicht constant
+void Menü::reset()
+{
+	status = 0;
+	beendet = 0;
+}
+
+void Menü::doMausEreignis( MausEreignis &me )
+{
+	switch( status )
+	{
+	case 0:
+		if( 1 )
+		{
+			bool vera = me.verarbeitet;
+			spielen->doMausEreignis( me );
+			if( !vera && me.verarbeitet && me.id == ME_RLinks )
+			{
+				spielenF->reset();
+				status = 3;
+			}
+			vera = me.verarbeitet;
+			optionen->doMausEreignis( me );
+			if( !vera && me.verarbeitet && me.id == ME_RLinks )
+			{
+				optionenF->reset();
+				status = 1;
+			}
+			vera = me.verarbeitet;
+			statistik->doMausEreignis( me );
+			if( !vera && me.verarbeitet && me.id == ME_RLinks )
+			{
+				statistikF->reset();
+				status = 2;
+			}
+			vera = me.verarbeitet;
+			beenden->doMausEreignis( me );
+			if( !vera && me.verarbeitet && me.id == ME_RLinks )
+				beendet = 1;
+		}
+		break;
+	case 1:
+		optionenF->doMausEreignis( me );
+		break;
+	case 2:
+		statistikF->doMausEreignis( me );
+		break;
+	case 3:
+		spielenF->doMausEreignis( me );
+	}
+}
+
+void Menü::doTastaturEreignis( TastaturEreignis &te )
+{
+	if( status == 1 )
+		optionenF->doTastaturEreignis( te );
+	if( status == 3 )
+		spielenF->doTastaturEreignis( te );
+}
+
+bool Menü::tick( double z )
+{
+	switch( status )
+	{
+	case 0:
+		if( 1 )
+		{
+			bool ret = spielen->tick( z );
+			ret |= statistik->tick( z );
+			ret |= optionen->tick( z );
+			ret |= beenden->tick( z );
+			return ret;
+		}
+	case 1:
+		if( optionenF->istBeendet() )
+		{
+			status = 0;
+			return 1;
+		}
+		return optionenF->tick( z );
+	case 2:
+		if( statistikF->istBeendet() )
+		{
+			status = 0;
+			return 1;
+		}
+		return statistikF->tick( z );
+	case 3:
+		if( spielenF->istBeendet() )
+		{
+			status = 0;
+			return 1;
+		}
+		return spielenF->tick( z );
+	}
+	return 0;
+}
+
+void Menü::render( Bild &zRObj )
+{
+	if( status != 3 )
+		zRObj.drawBild( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), *hintergrund );
+	switch( status )
+	{
+	case 0:
+		ram->setPosition( 300, 170 );
+		ram->setSize( 200, 160 );
+		zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
+		ram->render( zRObj );
+		spielen->render( zRObj );
+		statistik->render( zRObj );
+		optionen->render( zRObj );
+		beenden->render( zRObj );
+		break;
+	case 1:
+		ram->setPosition( 300, 130 );
+		ram->setSize( 200, 240 );
+		zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
+		ram->render( zRObj );
+		optionenF->render( zRObj );
+		break;
+	case 2:
+		zRObj.alphaRegion( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), 0xD0000000 );
+		statistikF->render( zRObj );
+		break;
+	case 3:
+		spielenF->render( zRObj );
+	}
+}
+
+// constant
+bool Menü::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+Menü *Menü::getThis()
+{
+	ref++;
+	return this;
+}
+
+Menü *Menü::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 165 - 0
Blöcke/Menü.h

@@ -0,0 +1,165 @@
+#ifndef Menü_H
+#define Menü_H
+
+#include <Knopf.h>
+#include <Tabelle.h>
+#include <Diagramm.h>
+#include <AuswahlBox.h>
+#include "Map.h"
+
+using namespace Framework;
+
+class MenüVerloren
+{
+private:
+	LRahmen *ram;
+	TextFeld *verloren;
+	Knopf *neu;
+	Knopf *beenden;
+	int ref;
+
+public:
+	// Kontruktor
+	MenüVerloren( Schrift *zSchrift );
+	// Destruktor
+	~MenüVerloren();
+	// nicht constant
+	int doMausEreignis( MausEreignis &me );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// Reference Counting
+	MenüVerloren *getThis();
+	MenüVerloren *release();
+};
+
+class MenüSpiel
+{
+private:
+	TextFeld *scoreT;
+	Knopf *beenden;
+	Map *map;
+	MenüVerloren *verloren;
+	bool beendet;
+	int ref;
+
+public:
+	// Konstruktor
+	MenüSpiel( Schrift *zSchrift, Bildschirm *zScreen );
+	// Destruktor
+	~MenüSpiel();
+	// nicht constant
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	void doTastaturEreignis( TastaturEreignis &te );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// constant
+	bool istBeendet() const;
+	// Reference Counting
+	MenüSpiel *getThis();
+	MenüSpiel *release();
+};
+
+class MenüStatistik
+{
+private:
+	TextFeld *ansichtT;
+	AuswahlBox *ansicht;
+	KontrollKnopf *optionen;
+	ObjTabelle *gesammtT;
+	ObjTabelle *optionenT;
+	LDiag *gesammtD;
+	LDiag *optionenD;
+	Knopf *removen;
+	Knopf *zurück;
+	Schrift *schrift;
+	bool beendet;
+	int ref = 1;
+
+public:
+	// Konstruktor
+	MenüStatistik( Schrift *zSchrift, Bildschirm *zScreen );
+	// Destruktor
+	~MenüStatistik();
+	// nicht constant
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// constant
+	bool istBeendet() const;
+	// Reference Counting
+	MenüStatistik *getThis();
+	MenüStatistik *release();
+};
+
+class MenüOptionen
+{
+private:
+	TextFeld *breiteT;
+	TextFeld *breite;
+	TextFeld *höheT;
+	TextFeld *höhe;
+	TextFeld *bAnzahlT;
+	TextFeld *bAnzahl;
+	TextFeld *tempoT;
+	TextFeld *tempo;
+	KontrollKnopf *fortsetzen;
+	Knopf *abbrechen;
+	Knopf *ok;
+	bool beendet;
+	int ref;
+
+public:
+	// Konstruktor
+	MenüOptionen( Schrift *zSchrift, Bildschirm *zScreen );
+	// Destruktor
+	~MenüOptionen();
+	// nicht constant
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	void doTastaturEreignis( TastaturEreignis &te );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// constant
+	bool istBeendet() const;
+	// Reference Counting
+	MenüOptionen *getThis();
+	MenüOptionen *release();
+};
+
+class Menü
+{
+private:
+	Knopf *spielen;
+	MenüSpiel *spielenF;
+	Knopf *optionen;
+	MenüOptionen *optionenF;
+	Knopf *statistik;
+	MenüStatistik *statistikF;
+	Knopf *beenden;
+	Bild *hintergrund;
+	LRahmen *ram;
+	bool beendet;
+	int status;
+	int ref;
+
+public:
+	// Konstruktor
+	Menü( Schrift *zSchrift, Bildschirm *zScreen );
+	// Destruktor
+	~Menü();
+	// nicht constant
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	void doTastaturEreignis( TastaturEreignis &te );
+	bool tick( double z );
+	void render( Bild &zRObj );
+	// constant
+	bool istBeendet() const;
+	// Reference Counting
+	Menü *getThis();
+	Menü *release();
+};
+
+#endif

+ 4 - 0
build.bat

@@ -0,0 +1,4 @@
+chcp 1252
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "blöcke.sln" /p:configuration=release /p:platform=win32
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "blöcke.sln" /p:configuration=release /p:platform=x64
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "blöcke.sln" /p:configuration=debug /p:platform=x64