Browse Source

MultiplChoiceDialog hinzugefügt

kolja 5 years ago
parent
commit
e7c7fba0d3
10 changed files with 202 additions and 13 deletions
  1. 138 0
      Dialog.cpp
  2. 28 0
      Dialog.h
  3. 4 0
      Fenster.cpp
  4. 2 0
      Framework.vcxproj
  5. 6 0
      Framework.vcxproj.filters
  6. 2 1
      Global.cpp
  7. 4 1
      Globals.h
  8. 1 1
      Model2D.h
  9. 15 9
      Welt2D.cpp
  10. 2 1
      main.h

+ 138 - 0
Dialog.cpp

@@ -0,0 +1,138 @@
+#include "Dialog.h"
+#include "Text.h"
+#include "Fenster.h"
+#include "Bildschirm.h"
+#include "AsynchronCall.h"
+#include "RenderThread.h"
+#include "AuswahlBox.h"
+#include "Schrift.h"
+#include "Knopf.h"
+
+using namespace Framework;
+
+// Inhalt der MultiplChoiceDialog Klasse aus Dialog.h
+MultiplChoiceDialog::MultiplChoiceDialog()
+{
+    entrys = new RCArray<Text>();
+    ids = new Array<void*>();
+    ref = 1;
+}
+
+MultiplChoiceDialog::~MultiplChoiceDialog()
+{
+    entrys->release();
+    ids->release();
+}
+
+// Fügt eine Auswahlmöglichkeit hinzu
+void MultiplChoiceDialog::addChoice( const char *text, void *id )
+{
+    entrys->add( new Text( text ) );
+    ids->add( id );
+}
+
+// Zeigt den dialog an und wartet auf benutzereingabe
+void *MultiplChoiceDialog::anzeigen( Schrift *zSchrift )
+{
+    void *result = 0;
+    bool ex = 0;
+
+    WNDCLASS wc = F_Normal( 0 );
+    wc.lpszClassName = "Dialog";
+    WFenster *f = new WFenster();
+    f->setVSchließAktion( [ &ex ]( void *p, void *o )
+    {
+        ex = true;
+    } );
+    f->setMausAktion( _ret1ME );
+    f->setTastaturAktion( _ret1TE );
+    f->erstellen( WS_OVERLAPPEDWINDOW, wc );
+    f->setSize( 200, 200 );
+    f->setPosition( Bildschirmmitte( f->getThis() ) );
+    f->setVerschiebbar( 1 );
+    f->setAnzeigeModus( 1 );
+    Bildschirm *b = new Bildschirm2D( f->getThis() );
+    f->setBildschirm( b->getThis() );
+    b->update();
+
+    RenderTh *r = new RenderTh();
+    r->setBildschirm( b->getThis() );
+    r->beginn();
+
+    AuswahlBox *ab = new AuswahlBox();
+    ab->setPosition( 10, 10 );
+    ab->setSize( 180, 20 );
+    ab->setHintergrundFarbe( 0xFF000000 );
+    ab->setLinienRahmenBreite( 1 );
+    ab->setLinienRahmenFarbe( 0xFFFFFFFF );
+    ab->setMaxAuskappHeight( 120 );
+    ab->setMausRahmenBreite( 1 );
+    ab->setMausRahmenFarbe( 0xFF005500 );
+    ab->setMausAlphaFeldFarbe( 0x00008700 );
+    ab->setMausAlphaFeldStrength( -8 );
+    ab->setAuswRahmenBreite( 1 );
+    ab->setAuswRahmenFarbe( 0xFF00FF00 );
+    ab->setAuswAlphaFeldFarbe( 0x0000FF00 );
+    ab->setAuswAlphaFeldStrength( -8 );
+    ab->setStyle( AuswahlBox::Style::Normal );
+    ab->setSchriftZ( zSchrift->getThis() );
+    for( auto i = entrys->getIterator(); i; i++ )
+        ab->addEintrag( i->getText() );
+    ab->setMausEreignis( _ret1ME );
+    b->addMember( ab );
+
+    Knopf *ok = new Knopf();
+    ok->setStyle( Knopf::Style::Normal );
+    ok->setPosition( 50, 150 );
+    ok->setSize( 100, 20 );
+    ok->setSchriftZ( zSchrift->getThis() );
+    ok->setText( "Ok" );
+    ok->setMausEreignis( [ this, &ex, &result, ab ]( void *p, void *o, MausEreignis me )
+    {
+        if( me.id == ME_RLinks )
+        {
+            result = ids->get( ab->getAuswahl() );
+            ex = true;
+        }
+        return 1;
+    } );
+    b->addMember( ok );
+
+    MSG msg;
+    while( GetMessage( &msg, NULL, 0, 0 ) > 0 && !ex )
+    {
+        if( !ex )
+        {
+            TranslateMessage( &msg );
+            DispatchMessage( &msg );
+        }
+    }
+
+    r->beenden();
+    r->release();
+
+    b->release();
+    f->setBildschirm( 0 );
+    f->setAnzeigeModus( 0 );
+    f->zerstören();
+    f->release();
+
+    ok->release();
+    ab->release();
+
+    return result;
+}
+
+// Reference Counting
+MultiplChoiceDialog *MultiplChoiceDialog::getThis()
+{
+    ref++;
+    return this;
+}
+
+MultiplChoiceDialog *MultiplChoiceDialog::release()
+{
+    if( !--ref )
+        delete this;
+    return 0;
+}

+ 28 - 0
Dialog.h

@@ -0,0 +1,28 @@
+#pragma once
+
+#include "Thread.h"
+
+namespace Framework
+{
+    class Text;
+    class Schrift;
+
+    class MultiplChoiceDialog
+    {
+    private:
+        RCArray< Text > *entrys;
+        Array< void* > *ids;
+        int ref;
+
+    public:
+        __declspec( dllexport ) MultiplChoiceDialog();
+        __declspec( dllexport ) ~MultiplChoiceDialog();
+        // Fügt eine Auswahlmöglichkeit hinzu
+        __declspec( dllexport ) void addChoice( const char *text, void *id );
+        // Zeigt den dialog an und wartet auf benutzereingabe
+        __declspec( dllexport ) void *anzeigen( Schrift *zSchrift );
+        // Reference Counting
+        __declspec( dllexport ) MultiplChoiceDialog *getThis();
+        __declspec( dllexport ) MultiplChoiceDialog *release();
+    };
+}

+ 4 - 0
Fenster.cpp

@@ -19,6 +19,8 @@ using namespace Framework;
 // Fensterklasse erzeugen
 WNDCLASS Framework::F_Normal( HINSTANCE hInst )// Erzeugen einer normalen Fensterklasse
 {
+    if( !hInst )
+        hInst = _hinst;
     WNDCLASS ret;
     ret.cbClsExtra = 0;
     ret.cbWndExtra = 0;
@@ -34,6 +36,8 @@ WNDCLASS Framework::F_Normal( HINSTANCE hInst )// Erzeugen einer normalen Fenste
 
 WNDCLASSEX Framework::F_NormalEx( HINSTANCE hInst )
 {
+    if( !hInst )
+        hInst = _hinst;
     WNDCLASSEX ret;
     ret.cbSize = sizeof( WNDCLASSEX );
     ret.cbClsExtra = 0;

+ 2 - 0
Framework.vcxproj

@@ -206,6 +206,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClInclude Include="Bildschirm.h" />
     <ClInclude Include="Critical.h" />
     <ClInclude Include="Cube.h" />
+    <ClInclude Include="Dialog.h" />
     <ClInclude Include="DXBuffer.h" />
     <ClInclude Include="Datei.h" />
     <ClInclude Include="DateiDialog.h" />
@@ -283,6 +284,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClCompile Include="DateiDialog.cpp" />
     <ClCompile Include="DateiSystem.cpp" />
     <ClCompile Include="Diagramm.cpp" />
+    <ClCompile Include="Dialog.cpp" />
     <ClCompile Include="DXBuffer.cpp" />
     <ClCompile Include="Fenster.cpp" />
     <ClCompile Include="Fortschritt.cpp" />

+ 6 - 0
Framework.vcxproj.filters

@@ -288,6 +288,9 @@
     <ClInclude Include="JSON.h">
       <Filter>Headerdateien\Framework</Filter>
     </ClInclude>
+    <ClInclude Include="Dialog.h">
+      <Filter>Headerdateien\Framework</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Maus.cpp">
@@ -461,5 +464,8 @@
     <ClCompile Include="JSON.cpp">
       <Filter>Quelldateien\Framework</Filter>
     </ClCompile>
+    <ClCompile Include="Dialog.cpp">
+      <Filter>Quelldateien\Framework</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 2 - 1
Global.cpp

@@ -15,7 +15,7 @@
 #include "Datei.h"
 #include "Zeit.h"
 
-void Framework::initFramework()
+void Framework::initFramework( HINSTANCE__ *hInst )
 {
     if( istInitialisiert )
         return;
@@ -37,6 +37,7 @@ void Framework::initFramework()
     thRegister = new ThreadRegister();
     logEnabled = 0;
     logFile = 0;
+    _hinst = hInst;
     istInitialisiert = 1;
 }
 

+ 4 - 1
Globals.h

@@ -8,6 +8,8 @@
 #define Global extern
 #endif
 
+struct HINSTANCE__; // windows.h
+
 namespace Framework
 {
     class ThreadRegister; // Thread.h
@@ -34,6 +36,7 @@ namespace Framework
     Global bool logEnabled;
     Global Datei *logFile;
     Global Critical logC;
+    Global HINSTANCE__ *_hinst;
 
 #ifdef WIN32
     // Gibt die Koordinaten der Maus auf dem Bildschirm zurück
@@ -58,7 +61,7 @@ namespace Framework
     __declspec( dllexport ) TexturList *zTexturRegister();
     // Initialisiert das Framework
     // Wird in der (WinMain) des Frameworks automatisch aufgerufen
-    __declspec( dllexport ) void initFramework();
+    __declspec( dllexport ) void initFramework( HINSTANCE__ *hInst = 0 );
     // Gibt den duch (initFramework) benutzten Arbeitsspeicher wieder frei
     // Wird in der (WinMain) des Frameworks automatisch aufgerufen
     __declspec( dllexport ) void releaseFramework();

+ 1 - 1
Model2D.h

@@ -105,7 +105,7 @@ namespace Framework
         //  t: Das Bild, das als Textur verwendet werden soll
         //  polygonName: Der name des Polygons, was die Textur bekommen soll
         __declspec( dllexport ) void setTextur( Textur2D *t, const char *polygonName );
-        __declspec( dllexport ) void impuls( Vertex start, Vertex speed, float strength = 0.1f ) override;
+        __declspec( dllexport ) void impuls( Vertex start, Vertex speed, float strength = 1.f ) override;
         // Zeichnet die Zeihnung in ein bestimmtes Bild
         //  zRObj: Das Bild, in das gezeichnet werden soll
         __declspec( dllexport ) void render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName ) override;

+ 15 - 9
Welt2D.cpp

@@ -91,26 +91,32 @@ bool Object2D::handleCollision( Object2D *obj )
         Vertex v1 = getSpeed() + getWorldDir( getObjectPos( hp ).rotation( rSpeed ) - getObjectPos( hp ) );
         // Geschwindigkeit des anderen Objektes mit rotation
         Vertex v2 = obj->getSpeed() + getWorldDir( obj->getObjectPos( hp ).rotation( obj->getDrehungSpeed() ) - obj->getObjectPos( hp ) );
-        if( ( position - obj->getPosition() ).getLengthSq() > ( position + v1 * 0.03f - obj->getPosition() - v2 * 0.03f ).getLengthSq() )
+        if( ( hp - obj->getPosition() ).getLengthSq() > ( hp + v1 * 0.03f - obj->getPosition() ).getLengthSq() ||
+            ( hp - getPosition() ).getLengthSq() > ( hp + v2 * 0.03f - getPosition() ).getLengthSq() )
         { // nur wenn sie sich aufeinander zu bewegen
-            float m1 = getMasse(); // fläche von Objekt 1
-            float m2 = obj->getMasse(); // fläche von Objekt 2
+            float m1 = getMasse() * v1.getLength(); // fläche von Objekt 1
+            float m2 = obj->getMasse() * v2.getLength(); // fläche von Objekt 2
             if( m1 == 0 || m2 == 0 )
                 return 0; // falls ein objekt keine masse hat ignoriere die kollision
             float nm1 = m1 / ( m1 + m2 ); // koeffizient für objekt 2
             float nm2 = m2 / ( m1 + m2 ); // koeffizient für Objekt 1
-            //rSpeed *= nm2; // Drehgeschwindigkeit anpassen (objekt 1)
-            //speed *= nm2; // Bewegungsgeschwindigkeit anpassen (objekt 1)
-            //obj->setDrehungSpeed( obj->getDrehungSpeed() * nm1 ); // Drehgeschwindigkeit anpassen (objekt 2)
-            //obj->setSpeed( obj->getSpeed() * nm1 ); // Bewegungsgeschwindigkeit anpassen (objekt 2)
+            //rSpeed *= nm1; // Drehgeschwindigkeit anpassen (objekt 1)
+            //speed *= nm1; // Bewegungsgeschwindigkeit anpassen (objekt 1)
+            //obj->setDrehungSpeed( obj->getDrehungSpeed() * nm2 ); // Drehgeschwindigkeit anpassen (objekt 2)
+            //obj->setSpeed( obj->getSpeed() * nm2 ); // Bewegungsgeschwindigkeit anpassen (objekt 2)
+            float speedSumLength = getSpeed().getLength() + obj->getSpeed().getLength();
             rSpeed = 0;
             speed = Vertex();
             obj->setDrehungSpeed( 0 );
             obj->setSpeed( Vertex() );
             if( v2.x || v2.y )
-                impuls( hp - v2, v2, nm2 );
+                impuls( hp - v2, v2 );
+            if( getSpeed().getLength() > 0 )
+                setSpeed( getSpeed().normalize() * speedSumLength * nm2 );
             if( v1.x || v1.y )
-                obj->impuls( hp - v1, v1, nm1 );
+                obj->impuls( hp - v1, v1 );
+            if( obj->getSpeed().getLength() > 0 )
+                obj->setSpeed( obj->getSpeed().normalize() * speedSumLength * nm1 );
             return 1;
         }
     }

+ 2 - 1
main.h

@@ -19,6 +19,7 @@
 #pragma warning( pop )
 
 #define KSGStart __stdcall
+#include "Globals.h"
 
 namespace Framework
 {
@@ -74,7 +75,7 @@ int WINAPI WinMain( _In_ HINSTANCE hinst, _In_opt_ HINSTANCE hpinst, _In_ LPSTR
 #else
 	SetUnhandledExceptionFilter(unhandledHandler);
 #endif
-    Framework::initFramework();
+    Framework::initFramework( hinst );
     Framework::Startparam stp;
     stp.hinst = hinst;
     stp.hpinst = hpinst;