Browse Source

Projektdateien hinzufügen.

Kolja Strohm 6 years ago
parent
commit
54890e3a79

+ 28 - 0
Asteroids.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}") = "Asteroids", "Asteroids\Asteroids.vcxproj", "{AD3BC355-BDAD-47D9-8A60-96399F56F750}"
+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
+		{AD3BC355-BDAD-47D9-8A60-96399F56F750}.Debug|Win32.ActiveCfg = Debug|Win32
+		{AD3BC355-BDAD-47D9-8A60-96399F56F750}.Debug|Win32.Build.0 = Debug|Win32
+		{AD3BC355-BDAD-47D9-8A60-96399F56F750}.Debug|x64.ActiveCfg = Debug|x64
+		{AD3BC355-BDAD-47D9-8A60-96399F56F750}.Debug|x64.Build.0 = Debug|x64
+		{AD3BC355-BDAD-47D9-8A60-96399F56F750}.Release|Win32.ActiveCfg = Release|Win32
+		{AD3BC355-BDAD-47D9-8A60-96399F56F750}.Release|Win32.Build.0 = Release|Win32
+		{AD3BC355-BDAD-47D9-8A60-96399F56F750}.Release|x64.ActiveCfg = Release|x64
+		{AD3BC355-BDAD-47D9-8A60-96399F56F750}.Release|x64.Build.0 = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

+ 122 - 0
Asteroids/Asteroid.cpp

@@ -0,0 +1,122 @@
+#include "Asteroid.h"
+#include <Text.h>
+#include <Globals.h>
+#include <TastaturEreignis.h>
+#include "Schuss.h"
+
+// Inhalt der Asteroid Klasse aus Asteroid.h
+// Konstruktor
+Asteroid::Asteroid( Model2DData *data, Bild *textur, Vec2< float > p, Vec2< float > s, float rS, float r, float gr, char num )
+{
+	asteroid = new Model2D();
+	asteroid->setStyle( Model2D::Style::Sichtbar | Model2D::Style::Textur );
+	asteroid->setModel( data );
+	asteroid->setTextur( textur );
+	asteroid->setDrehung( r );
+	asteroid->setSize( gr );
+	mGröße = 0;
+	pos = p;
+	speed = s;
+	rSpeed = rS;
+	id = num;
+	ref = 1;
+}
+
+// Destruktor
+Asteroid::~Asteroid()
+{
+	asteroid->release();
+}
+
+// nicht constant
+bool Asteroid::tick( double zeit, int breite, int höhe )
+{
+	Vertex minP = (Vertex)asteroid->zModel()->minP * asteroid->getSize() + asteroid->getPosition();
+	Vertex maxP = (Vertex)asteroid->zModel()->maxP * asteroid->getSize() + asteroid->getPosition();
+	if( maxP.x < 0 && speed.x < 0 )
+		pos.x = breite + asteroid->zModel()->maxP.x * asteroid->getSize();
+	if( maxP.y < 0 && speed.y < 0 )
+		pos.y = höhe + asteroid->zModel()->maxP.y * asteroid->getSize();
+	if( minP.x > breite && speed.x > 0 )
+		pos.x = 0 - asteroid->zModel()->maxP.x * asteroid->getSize();
+	if( minP.y > höhe && speed.y > 0 )
+		pos.y = 0 - asteroid->zModel()->maxP.y * asteroid->getSize();
+	asteroid->setPosition( pos );
+	if( mGröße )
+	{
+		float gr = mGröße > zeit ? (float)zeit : mGröße;
+		if( asteroid->getSize() < gr )
+			asteroid->setSize( 0 );
+		else
+			asteroid->addSize( -gr );
+		mGröße -= gr;
+	}
+	if( rSpeed )
+		asteroid->addDrehung( rSpeed * (float)zeit );
+	if( speed.x || speed.y )
+	{
+		pos += speed * (float)zeit;
+		asteroid->setPosition( pos );
+	}
+	return asteroid->tick( zeit );
+}
+
+void Asteroid::render( Bild &zRObj )
+{
+	asteroid->render( zRObj );
+}
+
+bool Asteroid::istGetroffen( Schuss *zSchuss )
+{
+	if( zSchuss->istInM2( *asteroid ) )
+	{
+		mGröße += 0.4f;
+		return 1;
+	}
+	return 0;
+}
+
+// constant
+void Asteroid::save( Datei *zD ) const
+{
+	zD->schreibe( (char*)&id, 1 );
+	zD->schreibe( (char*)&pos.x, 4 );
+	zD->schreibe( (char*)&pos.y, 4 );
+	zD->schreibe( (char*)&speed.x, 4 );
+	zD->schreibe( (char*)&speed.y, 4 );
+	zD->schreibe( (char*)&rSpeed, 4 );
+	float r = asteroid->getDrehung();
+	zD->schreibe( (char*)&r, 4 );
+	float gr = asteroid->getSize();
+	zD->schreibe( (char*)&gr, 4 );
+}
+
+bool Asteroid::amLeben() const
+{
+	return asteroid->getSize() != 0;
+}
+
+Model2D *Asteroid::zModel() const
+{
+	return asteroid;
+}
+
+Punkt Asteroid::getPos() const
+{
+	return (Punkt)pos;
+}
+
+// Refernece Counting
+Asteroid *Asteroid::getThis()
+{
+	ref++;
+	return this;
+}
+
+Asteroid *Asteroid::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 41 - 0
Asteroids/Asteroid.h

@@ -0,0 +1,41 @@
+#ifndef Asteroid_H
+#define Asteroid_H
+
+#include <Model2D.h>
+#include <Datei.h>
+
+using namespace Framework;
+
+class Schuss;
+
+class Asteroid
+{
+private:
+	Model2D *asteroid;
+	Vec2< float > pos;
+	Vec2< float > speed;
+	float mGröße;
+	float rSpeed;
+	char id;
+	int ref;
+
+public:
+	// Konstruktor
+	Asteroid( Model2DData *data, Bild *textur, Vec2< float > p, Vec2< float > s, float rS, float r = 0, float gr = 0, char num = 0 );
+	// Destruktor
+	~Asteroid();
+	// nicht constant
+	bool tick( double zeit, int breite, int höhe );
+	void render( Bild &zRObj );
+	bool istGetroffen( Schuss *zSchuss );
+	// constant
+	void save( Datei *zD ) const;
+	bool amLeben() const;
+	Model2D *zModel() const;
+	Punkt getPos() const;
+	// Refernece Counting
+	Asteroid *getThis();
+	Asteroid *release();
+};
+
+#endif

+ 192 - 0
Asteroids/Asteroids.vcxproj

@@ -0,0 +1,192 @@
+<?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>{AD3BC355-BDAD-47D9-8A60-96399F56F750}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>Asteroids</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>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</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>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\x64\Debug;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\Release;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\x64\Release;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASTEROIDS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>Framework.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuildStep>
+      <Outputs>
+      </Outputs>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASTEROIDS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>Framework.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuildStep>
+      <Command>copy "..\x64\Debug\Asteroids.dll" "..\..\..\Fertig\Debug\Minigames\x64\Asteroids\bin\game.dll"</Command>
+      <Outputs>kopieren...;%(Outputs)</Outputs>
+    </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;ASTEROIDS_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\Asteroids.dll" "..\..\..\Fertig\Minigames\x32\Asteroids\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;ASTEROIDS_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 "..\x64\Release\Asteroids.dll" "..\..\..\Fertig\Minigames\x64\Asteroids\bin\game.dll"</Command>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="Asteroid.h" />
+    <ClInclude Include="Game.h" />
+    <ClInclude Include="Initialisierung.h" />
+    <ClInclude Include="Map.h" />
+    <ClInclude Include="Menü.h" />
+    <ClInclude Include="Schuss.h" />
+    <ClInclude Include="Ship.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Asteroid.cpp" />
+    <ClCompile Include="Einstieg.cpp" />
+    <ClCompile Include="Game.cpp" />
+    <ClCompile Include="Initialisierung.cpp" />
+    <ClCompile Include="Map.cpp" />
+    <ClCompile Include="Menü.cpp" />
+    <ClCompile Include="Schuss.cpp" />
+    <ClCompile Include="Ship.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 66 - 0
Asteroids/Asteroids.vcxproj.filters

@@ -0,0 +1,66 @@
+<?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="Map.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Initialisierung.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Ship.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Asteroid.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Schuss.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Game.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Initialisierung.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Menü.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Map.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Ship.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Asteroid.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Schuss.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Einstieg.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+  </ItemGroup>
+</Project>

+ 9 - 0
Asteroids/Einstieg.cpp

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

+ 106 - 0
Asteroids/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
Asteroids/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
Asteroids/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 überschriftHöhe )
+{
+	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( überschriftHöhe )
+		{
+			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
Asteroids/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 überschriftHöhe );
+LDiag *initLinienDiagramm( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, DiagDaten *data );
+
+#endif

+ 412 - 0
Asteroids/Map.cpp

@@ -0,0 +1,412 @@
+#include "Map.h"
+#include <InitDatei.h>
+#include <Datei.h>
+#include <Text.h>
+#include <M2Datei.h>
+#include <DateiSystem.h>
+#include <TastaturEreignis.h>
+#include <KSGTDatei.h>
+#include <Zeit.h>
+#include <Rahmen.h>
+#include <Globals.h>
+
+// Inhalt der Map Klasse aus Map.h
+// Konstruktor
+Map::Map()
+{
+	schuss = new RCArray< Schuss >();
+	ship = 0;
+	asteroid = new RCArray< Asteroid >();
+	aData = new Model2DData*[ 7 ]();
+	aTextur = new Bild*[ 7 ]();
+	sData = new Model2DData*[ 2 ]();
+	sTextur = new Bild*[ 2 ]();
+	M2Datei m2d( "data/Minigames/Asteroids/models/asteroids.m2" );
+	m2d.leseDaten();
+	LTDBDatei td;
+	td.setDatei( new Text( "data/Minigames/Asteroids/bilder/asteroids.ltdb" ) );
+	td.leseDaten( 0 );
+	for( int i = 0; i < 7; i++ )
+	{
+		Text name = "";
+		name.append( (char)( 'a' + i ) );
+		aData[ i ] = m2d.ladeModel( name );
+		aTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
+	}
+	m2d.setPfad( "data/Minigames/Asteroids/models/ship.m2" );
+	m2d.leseDaten();
+	td.setDatei( new Text( "data/Minigames/Asteroids/bilder/ship.ltdb" ) );
+	td.leseDaten( 0 );
+	for( int i = 0; i < 2; i++ )
+	{
+		Text name = "";
+		name.append( (char)( 'a' + i ) );
+		sData[ i ] = m2d.ladeModel( name );
+		sTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
+	}
+	kam = new LRahmen();
+	kam->setFarbe( 0xFF777777 );
+	map = new LRahmen();
+	map->setFarbe( 0xFFFFFFFF );
+	map->setPosition( 10, 10 );
+	map->setSize( 200, 200 );
+	shipN = 0;
+	score = 0;
+	breite = 0;
+	höhe = 0;
+	aGröße = 0;
+	maxTimer = 0;
+	mTimer = 0;
+	timer = 0;
+	beendet = 1;
+	rend = 0;
+	sr = 1;
+	ref = 1;
+}
+
+// Destruktor
+Map::~Map()
+{
+	speichern();
+	schuss->release();
+	if( ship )
+		ship->release();
+	asteroid->release();
+	for( int i = 0; i < 7; i++ )
+	{
+		aData[ i ]->release();
+		aTextur[ i ]->release();
+	}
+	for( int i = 0; i < 2; i++ )
+	{
+		sData[ i ]->release();
+		sTextur[ i ]->release();
+	}
+	delete[] aData;
+	delete[] aTextur;
+	delete[] sData;
+	delete[] sTextur;
+	kam->release();
+	map->release();
+}
+
+// nicht constant
+void Map::reset()
+{
+	timer = 0;
+	beendet = 0;
+	score = 0;
+	if( ship )
+		ship = ship->release();
+	schuss->leeren();
+	asteroid->leeren();
+	InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" );
+	if( !opd->laden() )
+		DateiPfadErstellen( "data/Minigames/Asteroids/data/optionen.ini" );
+	breite = 800;
+	if( opd->wertExistiert( "Breite" ) )
+		breite = (int)*opd->zWert( "Breite" );
+	else
+		opd->addWert( "Breite", "800" );
+	höhe = 500;
+	if( opd->wertExistiert( "Höhe" ) )
+		höhe = (int)*opd->zWert( "Höhe" );
+	else
+		opd->addWert( "Höhe", "500" );
+	aGröße = 1000;
+	if( opd->wertExistiert( "Größe" ) )
+		aGröße = (int)*opd->zWert( "Größe" );
+	else
+		opd->addWert( "Größe", "1000" );
+	maxTimer = 5000;
+	if( opd->wertExistiert( "Timer" ) )
+		maxTimer = (int)*opd->zWert( "Timer" );
+	else
+		opd->addWert( "Timer", "5000" );
+	mTimer = maxTimer;
+	shipN = 0;
+	if( opd->wertExistiert( "Ship" ) )
+		shipN = (int)*opd->zWert( "Ship" );
+	else
+		opd->addWert( "Ship", "0" );
+	bool fortsetzen = 0;
+	if( opd->wertExistiert( "Fortsetzen" ) )
+		fortsetzen = (int)*opd->zWert( "Fortsetzen" ) != 0;
+	else
+		opd->addWert( "Fortsetzen", "0" );
+	opd->speichern();
+	opd->release();
+	Vec2< float > shipPos( (float)( breite / 2 ), (float)( höhe / 2 ) );
+	Vec2< float > shipSpeed( 0, 0 );
+	float shipR = (float)-PI / 2;
+	if( fortsetzen && DateiExistiert( "data/Minigames/Asteroids/data/game.save" ) )
+	{
+		Datei *save = new Datei();
+		save->setDatei( "data/Minigames/Asteroids/data/game.save" );
+		save->open( Datei::Style::lesen );
+		int br = 0;
+		int hö = 0;
+		int gr = 0;
+		int shn = 0;
+		save->lese( (char*)&br, 4 );
+		save->lese( (char*)&hö, 4 );
+		save->lese( (char*)&gr, 4 );
+		save->lese( (char*)&shn, 4 );
+		if( br == breite && hö == höhe && gr == aGröße && shn == shipN )
+		{
+			save->lese( (char*)&score, 4 );
+			save->lese( (char*)&mTimer, 4 );
+			// Schiff laden
+			save->lese( (char*)&shipPos.x, 4 );
+			save->lese( (char*)&shipPos.y, 4 );
+			save->lese( (char*)&shipSpeed.x, 4 );
+			save->lese( (char*)&shipSpeed.y, 4 );
+			save->lese( (char*)&shipR, 4 );
+			int anz = 0;
+			save->lese( (char*)&anz, 4 );
+			for( int i = 0; i < anz; i++ )
+			{ // Asteroiden Laden
+				char n = 0;
+				float x = 0;
+				float y = 0;
+				float xs = 0;
+				float ys = 0;
+				float rs = 0;
+				float r = 0;
+				float gr = 0;
+				save->lese( &n, 1 );
+				save->lese( (char*)&x, 4 );
+				save->lese( (char*)&y, 4 );
+				save->lese( (char*)&xs, 4 );
+				save->lese( (char*)&ys, 4 );
+				save->lese( (char*)&rs, 4 );
+				save->lese( (char*)&r, 4 );
+				save->lese( (char*)&gr, 4 );
+				asteroid->add( new Asteroid( aData[ n ]->getThis(), aTextur[ n ]->getThis(),
+							   Vec2< float >( x, y ), Vec2< float >( xs, ys ), rs, r, gr, n ) );
+			}
+			save->lese( (char*)&anz, 4 );
+			for( int i = 0; i < anz; i++ )
+			{ // Schüsse Laden
+				float x = 0;
+				float y = 0;
+				float xs = 0;
+				float ys = 0;
+				save->lese( (char*)&x, 4 );
+				save->lese( (char*)&y, 4 );
+				save->lese( (char*)&xs, 4 );
+				save->lese( (char*)&ys, 4 );
+				schuss->add( new Schuss( Vec2< float >( x, y ), Vec2< float >( xs, ys ) ) );
+			}
+		}
+		save->close();
+		save->release();
+	}
+	ship = new Ship( sData[ shipN ]->getThis(), sTextur[ shipN ]->getThis(), shipPos, shipSpeed, shipR );
+}
+
+void Map::doMausEreignis( MausEreignis &me )
+{
+
+}
+
+void Map::doTastaturEreignis( TastaturEreignis &te )
+{
+	if( te.taste == T_Space && te.id == TE_Press )
+		schuss->add( ship->getSchuss() );
+}
+
+bool Map::tick( double tickVal )
+{
+	if( beendet )
+	{
+		bool ret = rend;
+		rend = 0;
+		return ret;
+	}
+	if( sr )
+		srand( (int)time( 0 ) );
+	sr = 0;
+	// Timer
+	timer -= tickVal;
+	if( timer <= 0 )
+	{
+		mTimer -= 25;
+		if( mTimer < 500 )
+			mTimer = 500;
+		timer = mTimer / 1000.0;
+		for( int i = 0; i < rand() % 4 + 1; i++ )
+		{
+			int num = rand() % 7;
+			double sw = ( rand() % 360 ) / 180.0 * PI;
+			Vec2< float > speed( (float)cos( sw ), (float)sin( sw ) );
+			speed *= (float)( rand() % 40 );
+			Vec2< float > pos( -200.f, höhe / 2.f );
+			if( speed.x < 0 )
+				pos.x = (float)( breite + 200 );
+			asteroid->add( new Asteroid( aData[ num ]->getThis(), aTextur[ num ]->getThis(), pos, speed, ( rand() % 100 ) / 75.f, (float)sw, aGröße / 1000.f, num ) );
+		}
+	}
+	// Update
+	int aAnz = asteroid->getEintragAnzahl();
+	for( int i = 0; i < aAnz; i++ )
+		asteroid->z( i )->tick( tickVal, breite, höhe );
+	int sAnz = schuss->getEintragAnzahl();
+	for( int i = 0; i < sAnz; i++ )
+		schuss->z( i )->tick( tickVal );
+	ship->tick( tickVal, breite, höhe );
+	for( int i = aAnz - 1; i >= 0; i-- )
+	{
+		if( !asteroid->z( i )->amLeben() )
+		{
+			score++;
+			asteroid->remove( i );
+			aAnz--;
+		}
+	}
+	for( int i = sAnz - 1; i >= 0; i-- )
+	{
+		Vec2< float > pos = schuss->z( i )->getPos();
+		if( pos.x < 0 || pos.y < 0 || pos.x > breite || pos.y > höhe )
+		{
+			sAnz--;
+			schuss->remove( i );
+		}
+	}
+	// Collision
+	for( int i = sAnz - 1; i >= 0; i-- )
+	{
+		Schuss *zs = schuss->z( i );
+		bool b = 0;
+		for( int j = 0; j < aAnz; j++ )
+			b |= asteroid->z( j )->istGetroffen( zs );
+		if( b )
+		{
+			schuss->remove( i );
+			sAnz--;
+		}
+	}
+	for( int i = 0; i < aAnz && !beendet; i++ )
+		beendet |= ship->istTod( asteroid->z( i ) );
+	if( beendet )
+	{
+		KSGTDatei *stb = new KSGTDatei( "data/Minigames/Asteroids/data/score.ksgt" );
+		if( !stb->laden() )
+			DateiPfadErstellen( "data/Minigames/Asteroids/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 *timerT = new Text();
+		timerT->append( maxTimer );
+		zeile->add( timerT );
+		Text *aGrößeT = new Text();
+		aGrößeT->append( aGröße );
+		zeile->add( aGrößeT );
+		Text *shipT = new Text();
+		shipT->append( shipN );
+		zeile->add( shipT );
+		stb->addZeile( 7, zeile );
+		zeile->release();
+		stb->speichern();
+		stb->release();
+        DateiRemove( "data/Minigames/Asteroids/data/game.save" );
+	}
+	return 1;
+}
+
+void Map::render( Bild &zRObj )
+{
+	Punkt kamP = ship->getKamPos( breite, höhe );
+	zRObj.addScrollOffset( kamP.x, kamP.y );
+	int aAnz = asteroid->getEintragAnzahl();
+	for( int i = 0; i < aAnz; i++ )
+		asteroid->z( i )->render( zRObj );
+	int sAnz = schuss->getEintragAnzahl();
+	for( int i = 0; i < sAnz; i++ )
+		schuss->z( i )->render( zRObj );
+	ship->render( zRObj );
+	zRObj.addScrollOffset( -kamP.x, -kamP.y );
+	if( breite >= 800 || höhe >= 500 )
+	{ // Minimap
+		const Punkt &dOff = zRObj.getDrawOff();
+		map->render( zRObj );
+		zRObj.setPixelDP( 10 + ( ship->getPos().x * 200 ) / breite + dOff.x, 10 + ( ship->getPos().y * 200 ) / höhe + dOff.y, 0xFF00FF00 );
+		for( int i = 0; i < aAnz; i++ )
+			zRObj.setPixelDP( 10 + ( asteroid->z( i )->getPos().x * 200 ) / breite + dOff.x, 10 + ( asteroid->z( i )->getPos().y * 200 ) / höhe + dOff.y, 0xFFFF0000 );
+		for( int i = 0; i < sAnz; i++ )
+			zRObj.setPixelDP( 10 + ( (int)schuss->z( i )->getPos().x * 200 ) / breite + dOff.x, 10 + ( (int)schuss->z( i )->getPos().y * 200 ) / höhe + dOff.y, 0xFF00FFFF );
+		kam->setPosition( 10 + ( 200 * kamP.x ) / breite, 10 + ( 200 * kamP.y ) / höhe );
+		kam->setSize( ( 200 * 800 ) / breite, ( 200 * 500 ) / höhe );
+		if( kam->getBreite() > 200 )
+			kam->setSize( 200, kam->getHeight() );
+		if( kam->getHeight() > 200 )
+			kam->setSize( kam->getBreite(), 200 );
+		kam->render( zRObj );
+	}
+}
+
+// constant
+void Map::speichern() const
+{
+	if( !beendet )
+	{
+		Datei *d = new Datei();
+		d->setDatei( "data/Minigames/Asteroids/data/game.save" );
+		d->erstellen();
+		d->open( Datei::Style::schreiben );
+		d->schreibe( (char*)&breite, 4 );
+		d->schreibe( (char*)&höhe, 4 );
+		d->schreibe( (char*)&aGröße, 4 );
+		d->schreibe( (char*)&shipN, 4 );
+		d->schreibe( (char*)&score, 4 );
+		d->schreibe( (char*)&mTimer, 4 );
+		ship->save( d );
+		int anz = asteroid->getEintragAnzahl();
+		d->schreibe( (char*)&anz, 4 );
+		for( int i = 0; i < anz; i++ )
+			asteroid->z( i )->save( d );
+		anz = schuss->getEintragAnzahl();
+		d->schreibe( (char*)&anz, 4 );
+		for( int i = 0; i < anz; i++ )
+			schuss->z( i )->save( d );
+		d->close();
+		d->release();
+	}
+	else
+		DateiRemove( "data/Minigames/Asteroids/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;
+}

+ 56 - 0
Asteroids/Map.h

@@ -0,0 +1,56 @@
+#ifndef Map_H
+#define Map_H
+
+#include <Bild.h>
+#include "Schuss.h"
+#include "Ship.h"
+#include "Asteroid.h"
+
+using namespace Framework;
+
+class Map
+{
+private:
+	RCArray< Schuss > *schuss;
+	Ship *ship;
+	RCArray< Asteroid > *asteroid;
+	Model2DData **aData;
+	Bild **aTextur;
+	Model2DData **sData;
+	Bild **sTextur;
+	LRahmen *kam;
+	LRahmen *map;
+	int shipN;
+	int score;
+	int breite;
+	int höhe;
+	int aGröße;
+	int mTimer;
+	int maxTimer;
+	double timer;
+	bool beendet;
+	bool rend;
+	bool sr;
+	int ref;
+
+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

+ 878 - 0
Asteroids/Menü.cpp

@@ -0,0 +1,878 @@
+#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 );
+	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 );
+	scoreT->setText( "Score: " );
+	scoreT->zText()->append( map->getScore() );
+	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( 115, 40, 570, 420, zSchrift, ObjTabelle::Style::normal, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Höhe", 70, 0, 0 }, { "Größe", 70, 0, 0 }, { "Timer", 70, 0, 0 }, { "Ship", 70, 0, 0 } }, 20 );
+	optionenT = initObjTabelle( 115, 40, 570, 420, zSchrift, ObjTabelle::Style::normal, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Höhe", 70, 0, 0 }, { "Größe", 70, 0, 0 }, { "Timer", 70, 0, 0 }, { "Ship", 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 );
+	remove = 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 < 7; j++ )
+			( (TextFeld*)gesammtT->zZeichnung( j, 0 ) )->release();
+		gesammtT->removeZeile( 0 );
+	}
+	for( int j = 0; j < 7; j++ )
+		( (TextFeld*)optionenT->zZeichnung( j, 0 ) )->release();
+	ansichtT->release();
+	ansicht->release();
+	optionen->release();
+	gesammtT->release();
+	optionenT->release();
+	gesammtD->release();
+	optionenD->release();
+	remove->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 < 7; 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/Asteroids/data/optionen.ini" );
+	opd->laden();
+	if( !opd->wertExistiert( "Breite" ) )
+		opd->addWert( "Breite", "800" );
+	if( !opd->wertExistiert( "Höhe" ) )
+		opd->addWert( "Höhe", "500" );
+	if( !opd->wertExistiert( "Größe" ) )
+		opd->addWert( "Größe", "1000" );
+	if( !opd->wertExistiert( "Timer" ) )
+		opd->addWert( "Timer", "5000" );
+	if( !opd->wertExistiert( "Ship" ) )
+		opd->addWert( "Ship", "0" );
+	if( !opd->wertExistiert( "Fortsetzen" ) )
+		opd->addWert( "Fortsetzen", "0" );
+	opd->speichern();
+	KSGTDatei *stb = new KSGTDatei( "data/Minigames/Asteroids/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 *größeT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 5 )->getText() );
+			TextFeld *timerT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 4 )->getText() );
+			TextFeld *shipT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 6 )->getText() );
+			int ship = *stb->zFeld( p, 6 );
+			switch( ship )
+			{
+			case 0:
+				shipT->setText( "Normal" );
+				break;
+			case 1:
+				shipT->setText( "Enterprise" );
+				break;
+			}
+			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, größeT );
+			gesammtT->setZeichnungZ( 5, i + 1, timerT );
+			gesammtT->setZeichnungZ( 6, i + 1, shipT );
+			if( breiteT->zText()->istGleich( opd->zWert( "Breite" )->getText() ) &&
+				höheT->zText()->istGleich( opd->zWert( "Höhe" )->getText() ) &&
+				größeT->zText()->istGleich( opd->zWert( "Größe" )->getText() ) &&
+				timerT->zText()->istGleich( opd->zWert( "Timer" )->getText() ) &&
+				stb->zFeld( p, 6 )->istGleich( opd->zWert( "Ship" )->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, größeT );
+				optionenT->setZeichnungZ( 5, n, timerT );
+				optionenT->setZeichnungZ( 6, n, shipT );
+				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( "Höhe" ) &&
+			(int)*stb->zFeld( i, 5 ) == (int)*opd->zWert( "Größe" ) &&
+			(int)*stb->zFeld( i, 4 ) == (int)*opd->zWert( "Timer" ) &&
+			(int)*stb->zFeld( i, 6 ) == (int)*opd->zWert( "Ship" ) )
+		{
+			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;
+	remove->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+	{ // Statistik remove
+		if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
+		{ // nur bestimmte Statistik remove
+			InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" );
+			opd->laden();
+			KSGTDatei *score = new KSGTDatei( "data/Minigames/Asteroids/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( "Höhe" ) &&
+					(int)*score->zFeld( i, 5 ) == (int)*opd->zWert( "Größe" ) &&
+					(int)*score->zFeld( i, 4 ) == (int)*opd->zWert( "Timer" ) &&
+					(int)*score->zFeld( i, 6 ) == (int)*opd->zWert( "Ship" ) )
+				{
+					score->removeZeile( i );
+					i--;
+					zeilen--;
+				}
+			}
+			score->speichern();
+			score->release();
+			opd->release();
+		}
+		else // alles remove
+			DateiRemove( "data/Minigames/Asteroids/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 |= remove->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 );
+	remove->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, 120, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Breite:" );
+	breite = initTextFeld( 440, 120, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	breite->setTastaturEreignis( _nurNummernTE );
+	höheT = initTextFeld( 310, 160, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Höhe:" );
+	höhe = initTextFeld( 440, 160, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	höhe->setTastaturEreignis( _nurNummernTE );
+	aGrößeT = initTextFeld( 310, 200, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Asteroiden Größe:" );
+	aGröße = initTextFeld( 440, 200, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	aGröße->setTastaturEreignis( _nurNummernTE );
+	timerT = initTextFeld( 310, 240, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Zeit Abstände:" );
+	timer = initTextFeld( 440, 240, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	timer->setTastaturEreignis( _nurNummernTE );
+	shipT = initTextFeld( 310, 280, 80, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Raumschiff:" );
+	ship = initAuswahlBox( 390, 280, 100, 20, zSchrift, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Normal", "Enterprise" } );
+	fortsetzen = initKontrollKnopf( 310, 320, 180, 20, zSchrift, KontrollKnopf::Style::Normal, "Letztes Spiel fortsetzen" );
+	abbrechen = initKnopf( 310, 360, 85, 20, zSchrift, Knopf::Style::Sichtbar, "Abbrechen" );
+	ok = initKnopf( 405, 360, 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();
+	aGrößeT->release();
+	aGröße->release();
+	timerT->release();
+	timer->release();
+	shipT->release();
+	ship->release();
+	fortsetzen->release();
+	abbrechen->release();
+	ok->release();
+}
+
+// nicht constant
+void MenüOptionen::reset()
+{
+	InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" );
+	if( !opd->laden() )
+		DateiPfadErstellen( "data/Minigames/Asteroids/data/optionen.ini" );
+	breite->setText( "800" );
+	if( opd->wertExistiert( "Breite" ) )
+		breite->setText( Text() += (int)*opd->zWert( "Breite" ) );
+	else
+		opd->addWert( "Breite", "800" );
+	höhe->setText( "500" );
+	if( opd->wertExistiert( "Höhe" ) )
+		höhe->setText( Text() += (int)*opd->zWert( "Höhe" ) );
+	else
+		opd->addWert( "Höhe", "500" );
+	aGröße->setText( "1000" );
+	if( opd->wertExistiert( "Größe" ) )
+		aGröße->setText( Text() += (int)*opd->zWert( "Größe" ) );
+	else
+		opd->addWert( "Größe", "1000" );
+	timer->setText( "5000" );
+	if( opd->wertExistiert( "Timer" ) )
+		timer->setText( Text() += (int)*opd->zWert( "Timer" ) );
+	else
+		opd->addWert( "Timer", "5000" );
+	ship->setAuswahl( 0 );
+	if( opd->wertExistiert( "Ship" ) )
+		ship->setAuswahl( *opd->zWert( "Ship" ) );
+	else
+		opd->addWert( "Ship", "0" );
+	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 );
+	aGröße->doMausEreignis( me );
+	timer->doMausEreignis( me );
+	ship->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/Asteroids/data/optionen.ini" );
+		if( !opd->laden() )
+			DateiPfadErstellen( "data/Minigames/Asteroids/data/optionen.ini" );
+		if( (int)*breite->zText() > 10000 )
+			breite->setText( "10000" );
+		if( (int)*breite->zText() < 800 )
+			breite->setText( "80" );
+		if( opd->wertExistiert( "Breite" ) )
+			opd->setWert( "Breite", Text() += (int)*breite->zText() );
+		else
+			opd->addWert( "Breite", Text() += (int)*breite->zText() );
+		if( (int)*höhe->zText() > 10000 )
+			höhe->setText( "10000" );
+		if( (int)*höhe->zText() < 500 )
+			höhe->setText( "500" );
+		if( opd->wertExistiert( "Höhe" ) )
+			opd->setWert( "Höhe", Text() += (int)*höhe->zText() );
+		else
+			opd->addWert( "Höhe", Text() += (int)*höhe->zText() );
+		if( (int)*aGröße->zText() > 10000 )
+			aGröße->setText( "10000" );
+		if( (int)*aGröße->zText() < 10 )
+			aGröße->setText( "10" );
+		if( opd->wertExistiert( "Größe" ) )
+			opd->setWert( "Größe", Text() += (int)*aGröße->zText() );
+		else
+			opd->addWert( "Größe", Text() += (int)*aGröße->zText() );
+		if( (int)*timer->zText() < 500 )
+			timer->setText( "500" );
+		if( opd->wertExistiert( "Timer" ) )
+			opd->setWert( "Timer", Text() += (int)*timer->zText() );
+		else
+			opd->addWert( "Timer", Text() += (int)*timer->zText() );
+		if( opd->wertExistiert( "Ship" ) )
+			opd->setWert( "Ship", Text() += ship->getAuswahl() );
+		else
+			opd->addWert( "Ship", Text() += ship->getAuswahl() );
+		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 );
+	aGröße->doTastaturEreignis( te );
+	timer->doTastaturEreignis( te );
+}
+
+bool MenüOptionen::tick( double tickVal )
+{
+	bool ret = breite->tick( tickVal );
+	ret |= höhe->tick( tickVal );
+	ret |= aGröße->tick( tickVal );
+	ret |= timer->tick( tickVal );
+	ret |= ship->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 );
+	aGrößeT->render( zRObj );
+	aGröße->render( zRObj );
+	timerT->render( zRObj );
+	timer->render( zRObj );
+	shipT->render( zRObj );
+	fortsetzen->render( zRObj );
+	abbrechen->render( zRObj );
+	ok->render( zRObj );
+	ship->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/Asteroids/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, 110 );
+		ram->setSize( 200, 280 );
+		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;
+}

+ 167 - 0
Asteroids/Menü.h

@@ -0,0 +1,167 @@
+#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 *remove;
+	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 *aGrößeT;
+	TextFeld *aGröße;
+	TextFeld *timerT;
+	TextFeld *timer;
+	TextFeld *shipT;
+	AuswahlBox *ship;
+	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

+ 56 - 0
Asteroids/Schuss.cpp

@@ -0,0 +1,56 @@
+#include "Schuss.h"
+
+// Inhalt der Schuss Klasse aus Schuss.h
+// Konstruktor
+Schuss::Schuss( Vec2< float > pos, Vec2< float > speed )
+{
+	this->pos = pos;
+	this->speed = speed;
+	ref = 1;
+}
+
+// nicht constant
+bool Schuss::tick( double zeit )
+{
+	pos += speed * (float)zeit;
+	return 1;
+}
+
+void Schuss::render( Bild &zRObj )
+{
+	zRObj.drawLinie( (Punkt)pos, (Punkt)( pos - speed / 10 ), 0xFFFFFFFF );
+}
+
+// constant
+bool Schuss::istInM2( const Model2D &mdl ) const
+{
+	return mdl.istPunktInnen( pos ) || mdl.istPunktInnen( pos - speed / 10 );
+}
+
+void Schuss::save( Datei *zD ) const
+{
+	zD->schreibe( (char*)&pos.x, 4 );
+	zD->schreibe( (char*)&pos.y, 4 );
+	zD->schreibe( (char*)&speed.x, 4 );
+	zD->schreibe( (char*)&speed.y, 4 );
+}
+
+Vec2< float > Schuss::getPos() const
+{
+	return pos;
+}
+
+// Reference Counting
+Schuss *Schuss::getThis()
+{
+	ref++;
+	return this;
+}
+
+Schuss *Schuss::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 32 - 0
Asteroids/Schuss.h

@@ -0,0 +1,32 @@
+#ifndef Schuss_H
+#define Schuss_H
+
+#include <Bild.h>
+#include <Model2D.h>
+#include <Datei.h>
+
+using namespace Framework;
+
+class Schuss
+{
+private:
+	Vec2< float > pos;
+	Vec2< float > speed;
+	int ref;
+
+public:
+	// Konstruktor
+	Schuss( Vec2< float > pos, Vec2< float > speed );
+	// nicht constant
+	bool tick( double zeit );
+	void render( Bild &zRObj );
+	// constant
+	bool istInM2( const Model2D &mdl ) const;
+	void save( Datei *zD ) const;
+	Vec2< float > getPos() const;
+	// Reference Counting
+	Schuss *getThis();
+	Schuss *release();
+};
+
+#endif

+ 135 - 0
Asteroids/Ship.cpp

@@ -0,0 +1,135 @@
+#include "Ship.h"
+#include <Text.h>
+#include <Globals.h>
+#include <TastaturEreignis.h>
+#include <FrameworkMath.h>
+#include "Schuss.h"
+#include "Asteroid.h"
+
+// Inhalt der Ship Klasse aus Ship.h
+// Konstruktor
+Ship::Ship( Model2DData *data, Bild *textur, Vec2< float > p, Vec2< float > s, float r )
+{
+	ship = new Model2D();
+	ship->setStyle( Model2D::Style::Sichtbar | Model2D::Style::Textur );
+	ship->setModel( data );
+	ship->setTextur( textur );
+	ship->setDrehung( r );
+	pos = p;
+	speed = s;
+	ref = 1;
+}
+
+// Destruktor
+Ship::~Ship()
+{
+	ship->release();
+}
+
+// nicht constant
+bool Ship::tick( double zeit, int breite, int höhe )
+{
+	Vertex minP = (Vertex)ship->zModel()->minP * ship->getSize() + ship->getPosition();
+	Vertex maxP = (Vertex)ship->zModel()->maxP * ship->getSize() + ship->getPosition();
+	if( maxP.x < 0 && speed.x < 0 )
+		pos.x = breite + ship->zModel()->maxP.x * ship->getSize();
+	if( maxP.y < 0 && speed.y < 0 )
+		pos.y = höhe + ship->zModel()->maxP.y * ship->getSize();
+	if( minP.x > breite && speed.x > 0 )
+		pos.x = 0 - ship->zModel()->maxP.x * ship->getSize();
+	if( minP.y > höhe && speed.y > 0 )
+		pos.y = 0 - ship->zModel()->maxP.y * ship->getSize();
+	ship->setPosition( pos );
+	if( getTastenStand( T_Oben ) || getTastenStand( 'w' ) || getTastenStand( 'W' ) )
+	{
+		speed.x += (float)( 4.2 * cos( ship->getDrehung() ) );
+		speed.y += (float)( 4.2 * sin( ship->getDrehung() ) );
+	}
+	else
+	{
+		float movementAngle = atan2( speed.y, speed.x );
+		if( speed.x != 0 )
+			speed.x += 1.2f * cos( movementAngle + (float)PI );
+		if( speed.y != 0 )
+			speed.y += 1.2f * sin( movementAngle + (float)PI );
+		if( speed.x < 6.f && speed.x > -6.f )
+			speed.x = 0;
+		if( speed.y < 6.f && speed.y > -6.f )
+			speed.y = 0;
+	}
+	if( !getTastenStand( T_Space ) )
+	{
+		if( getTastenStand( T_Rechts ) || getTastenStand( 'd' ) || getTastenStand( 'D' ) )
+			ship->addDrehung( (float)zeit * 2 );
+		if( getTastenStand( T_Links ) || getTastenStand( 'a' ) || getTastenStand( 'A' ) )
+			ship->addDrehung( (float)-zeit * 2 );
+	}
+	if( speed.x || speed.y )
+	{
+		pos += speed * (float)zeit;
+		ship->setPosition( pos );
+	}
+	return ship->tick( zeit );
+}
+
+void Ship::render( Bild &zRObj )
+{
+	ship->render( zRObj );
+}
+
+// constant
+void Ship::save( Datei *zD ) const
+{
+	zD->schreibe( (char*)&pos.x, 4 );
+	zD->schreibe( (char*)&pos.y, 4 );
+	zD->schreibe( (char*)&speed.x, 4 );
+	zD->schreibe( (char*)&speed.y, 4 );
+	float r = ship->getDrehung();
+	zD->schreibe( (char*)&r, 4 );
+}
+
+Schuss *Ship::getSchuss() const
+{
+	return new Schuss( pos, Vec2<float>( cos( ship->getDrehung() ), sin( ship->getDrehung() ) ) * 200 );
+}
+
+bool Ship::istTod( Asteroid *zA ) const
+{
+	return ship->istModelInnen( zA->zModel() );
+}
+
+Punkt Ship::getKamPos( int breite, int höhe ) const
+{
+	Punkt ret;
+	ret.x = (int)pos.x - 400;
+	ret.y = (int)pos.y - 250;
+	if( ret.x < 0 )
+		ret.x = 0;
+	if( ret.y < 0 )
+		ret.y = 0;
+	if( ret.x > breite - 800 )
+		ret.x = breite - 800;
+	if( ret.y > höhe - 500 )
+		ret.y = höhe - 500;
+	return ret;
+}
+
+Punkt Ship::getPos() const
+{
+	return (Punkt)pos;
+}
+
+// Reference Counting
+Ship *Ship::getThis()
+{
+	ref++;
+	return this;
+}
+
+Ship *Ship::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 39 - 0
Asteroids/Ship.h

@@ -0,0 +1,39 @@
+#ifndef Ship_H
+#define Ship_H
+
+#include <Model2D.h>
+#include <Datei.h>
+
+using namespace Framework;
+
+class Schuss;
+class Asteroid;
+
+class Ship
+{
+private:
+	Model2D *ship;
+	Vec2< float > pos;
+	Vec2< float > speed;
+	int ref;
+
+public:
+	// Konstruktor
+	Ship( Model2DData *data, Bild *textur, Vec2< float > p, Vec2< float > s, float r );
+	// Destruktor
+	~Ship();
+	// nicht constant
+	bool tick( double zeit, int breite, int höhe );
+	void render( Bild &zRObj );
+	// constant
+	void save( Datei *zD ) const;
+	Schuss *getSchuss() const;
+	bool istTod( Asteroid *zA ) const;
+	Punkt getKamPos( int breite, int höhe ) const;
+	Punkt getPos() const;
+	// Reference Counting
+	Ship *getThis();
+	Ship *release();
+};
+
+#endif

+ 4 - 0
build.bat

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