فهرست منبع

Startposition und rotation von spielern veränderbar

Kolja Strohm 5 سال پیش
والد
کامیت
9a892bc6b7

+ 22 - 0
Asteroids/Editor/Abstract/View.cpp

@@ -5,8 +5,30 @@ View::View()
     ref = 1;
 }
 
+View::~View()
+{}
+
 View *View::getThis()
 {
     ref++;
     return this;
+}
+
+View *View::release()
+{
+    if( !--ref )
+        delete this;
+    return 0;
+}
+
+
+ActionView::ActionView( std::function< void( Model * ) > f )
+    : View()
+{
+    this->f = f;
+}
+
+void ActionView::update( Model *m )
+{
+    f( m );
 }

+ 15 - 2
Asteroids/Editor/Abstract/View.h

@@ -1,5 +1,7 @@
 #pragma once
 
+#include <functional>
+
 class Model;
 
 class View
@@ -9,7 +11,18 @@ protected:
 
 public:
     View();
+    virtual ~View();
     virtual void update( Model *m ) = 0;
-    virtual View *getThis();
-    virtual View *release() = 0;
+    View *getThis();
+    View *release();
+};
+
+class ActionView : public View
+{
+private:
+    std::function< void( Model * ) > f;
+
+public:
+    ActionView( std::function< void( Model * ) > f );
+    void update( Model *m ) override;
 };

+ 52 - 0
Asteroids/Editor/Editor.cpp

@@ -28,6 +28,8 @@ AsteroidsEditor::AsteroidsEditor()
     sts = 0;
     rend = 1;
     daten = 0;
+    moveObj = 0;
+    rotObj = 0;
     ref = 1;
 }
 
@@ -183,6 +185,56 @@ void AsteroidsEditor::doMausEreignis( MausEreignis & me )
         }
     }
     if( !me.verarbeitet )
+    {
+        if( me.id == ME_PLinks )
+        {
+            Vertex pos = kamera->getWorldCoordinates( Punkt( me.mx, me.my ) );
+            moveObj = (EditorObject *)daten->zWelt()->getObjectAt( (int)pos.x, (int)pos.y );
+            if( moveObj )
+                me.verarbeitet = 1;
+        }
+        if( me.id == ME_PMitte )
+        {
+            Vertex pos = kamera->getWorldCoordinates( Punkt( me.mx, me.my ) );
+            rotObj = (EditorObject *)daten->zWelt()->getObjectAt( (int)pos.x, (int)pos.y );
+            if( rotObj )
+                me.verarbeitet = 1;
+        }
+        if( me.id == ME_Bewegung )
+        {
+            if( moveObj )
+            {
+                moveObj->setPosition( moveObj->getPosition() + Punkt( me.mx, me.my ) - maus );
+                rend = 1;
+                me.verarbeitet = 1;
+            }
+            if( rotObj )
+            {
+                rotObj->addDrehung( ( me.mx - maus.x ) / 100.f );
+                rend = 1;
+                me.verarbeitet = 1;
+            }
+        }
+        if( me.id == ME_RLinks )
+        {
+            if( moveObj )
+            {
+                moveObj->update();
+                me.verarbeitet = 1;
+                moveObj = 0;
+            }
+        }
+        if( me.id == ME_RMitte )
+        {
+            if( rotObj )
+            {
+                rotObj->update();
+                me.verarbeitet = 1;
+                rotObj = 0;
+            }
+        }
+    }
+    if( !me.verarbeitet )
     {
         if( getMausStand( M_Links ) )
         {

+ 2 - 0
Asteroids/Editor/Editor.h

@@ -34,6 +34,8 @@ namespace Editor
         Kamera2D *kamera;
         Kamera2D *minimap;
         Punkt maus;
+        EditorObject *moveObj;
+        EditorObject *rotObj;
         unsigned char alpha;
         bool rend;
         int ref;

+ 1 - 5
Asteroids/Editor/Interface/RightTools/SpielerOptionen/SpielerOptionen.cpp

@@ -143,11 +143,7 @@ void SpielerTool::doMausEreignis( MausEreignis &me )
         data.energieSchildEffizienz = *skillStartEnergieSchildEffizienz->zText();
         data.netzwerk = *skillStartNetzwerk->zText();
         data.skillPunkte = *skillStartPunkte->zText();
-        daten->getSpieler( daten->getSpielerIndexById( spielerAuswahl->getAuswahl() + 1 ), [ data ]( SpielerDaten *daten ) -> bool
-        {
-            *daten = data;
-            return 1;
-        } );
+        data.update();
     }
     me.mx += pos.x;
     me.my += pos.y;

+ 1 - 5
Asteroids/Editor/Interface/RightTools/TeamOptionen/TeamOptionen.cpp

@@ -129,11 +129,7 @@ void TeamTool::doMausEreignis( MausEreignis &me )
         data.laserTempo = *skillStartLaserTempo->zText();
         data.energieSchild = *skillStartEnergieSchild->zText();
         data.energieSchildEffizienz = *skillStartEnergieSchildEffizienz->zText();
-        daten->getTeam( daten->getTeamIndexById( teamAuswahl->getAuswahl() + 1 ), [ data ]( TeamDaten *daten ) -> bool
-        {
-            *daten = data;
-            return 1;
-        } );
+        data.update();
     }
     me.mx += pos.x;
     me.my += pos.y;

+ 67 - 46
Asteroids/Editor/Karte/EditorKarte.cpp

@@ -5,6 +5,42 @@
 
 using namespace Editor;
 
+EditorObject::EditorObject()
+    : Model2DObject()
+{}
+
+EditorObject::~EditorObject()
+{}
+
+
+EdSpieler::EdSpieler( SpielerDaten *model )
+    : EditorObject()
+{
+    mdl = model;
+}
+
+EdSpieler::~EdSpieler()
+{}
+
+void EdSpieler::update()
+{
+    mdl->pos = position;
+    mdl->rot = (double)rotation;
+    mdl->update();
+}
+
+
+UpdateObserver::UpdateObserver( std::function< void() > f )
+{
+    this->f = f;
+}
+
+void UpdateObserver::update( Model *m )
+{
+    f();
+}
+
+
 KarteDaten::KarteDaten( EditorKlient *client, SpielerTeamStruktur *sts )
     : Thread()
 {
@@ -21,7 +57,7 @@ KarteDaten::KarteDaten( EditorKlient *client, SpielerTeamStruktur *sts )
     welt->setSize( 1 );
     for( auto s = spieler.getIterator(); s; s++ )
     {
-        Model2DObject *model = new Model2DObject();
+        Model2DObject *model = new EdSpieler( s._ );
         Bild *bild;
         int fc = sts->spielerFarbe->get( s->id - 1 );
         for( auto r = resources.getIterator(); r; r++ )
@@ -53,6 +89,36 @@ KarteDaten::KarteDaten( EditorKlient *client, SpielerTeamStruktur *sts )
         model->setPosition( s->pos );
         model->setCollision( 0 );
         welt->addObject( model );
+        SpielerDaten *d = s._;
+        d->addView( new UpdateObserver( [ this, d ]()
+        {
+            aktionen.add( [ this, d ]()
+            {
+                this->client->saveSpieler( d );
+            } );
+        } ) );
+    }
+    for( auto t = teams.getIterator(); t; t++ )
+    {
+        TeamDaten *d = t._;
+        d->addView( new UpdateObserver( [ this, d ]()
+        {
+            aktionen.add( [ this, d ]()
+            {
+                this->client->saveTeam( d );
+            } );
+        } ) );
+    }
+    for( auto o = objekte.getIterator(); o; o++ )
+    {
+        ObjektDaten *d = o._;
+        d->addView( new UpdateObserver( [ this, d ]()
+        {
+            aktionen.add( [ this, d ]()
+            {
+                this->client->saveObjekt( d );
+            } );
+        } ) );
     }
     exit = 0;
     start();
@@ -103,51 +169,6 @@ void KarteDaten::removeObjekt( int index )
     cs.unlock();
 }
 
-void KarteDaten::getObjekt( int index, std::function< bool( ObjektDaten * ) > callBack )
-{
-    cs.lock();
-    if( callBack( objekte.get( index ) ) )
-    {
-        ObjektDaten td = *objekte.get( index );
-        EditorKlient *c = client;
-        aktionen.add( [ td, c ]()
-        {
-            c->saveObjekt( &td );
-        } );
-    }
-    cs.unlock();
-}
-
-void KarteDaten::getSpieler( int index, std::function< bool( SpielerDaten * ) > callBack )
-{
-    cs.lock();
-    if( callBack( spieler.get( index ) ) )
-    {
-        SpielerDaten td = *spieler.get( index );
-        EditorKlient *c = client;
-        aktionen.add( [ td, c ]()
-        {
-            c->saveSpieler( &td );
-        } );
-    }
-    cs.unlock();
-}
-
-void KarteDaten::getTeam( int index, std::function< bool( TeamDaten * ) > callBack )
-{
-    cs.lock();
-    if( callBack( teams.get( index ) ) )
-    {
-        TeamDaten td = *teams.get( index );
-        EditorKlient *c = client;
-        aktionen.add( [ td, c ]()
-        {
-            c->saveTeam( &td );
-        } );
-    }
-    cs.unlock();
-}
-
 void KarteDaten::thread()
 {
     while( !exit )

+ 31 - 3
Asteroids/Editor/Karte/EditorKarte.h

@@ -6,6 +6,7 @@
 #include <Critical.h>
 #include <functional>
 #include <Welt2D.h>
+#include <Model2D.h>
 
 namespace Editor
 {
@@ -72,6 +73,35 @@ namespace Editor
         char team;
     };
 
+    class EditorObject : public Model2DObject
+    {
+    public:
+        EditorObject();
+        virtual ~EditorObject();
+        virtual void update() = 0;
+    };
+
+    class EdSpieler : public EditorObject
+    {
+    private:
+        SpielerDaten *mdl;
+
+    public:
+        EdSpieler( SpielerDaten *model );
+        ~EdSpieler();
+        void update();
+    };
+
+    class UpdateObserver : public View
+    {
+    private:
+        std::function< void() > f;
+
+    public:
+        UpdateObserver( std::function< void() > f );
+        void update( Model *m ) override;
+    };
+
     class KarteDaten : public Thread
     {
     private:
@@ -85,6 +115,7 @@ namespace Editor
         Array< std::function< void() > > aktionen;
         Critical cs;
         Welt2D *welt;
+        RCArray< View > views;
         Punkt size;
         bool exit;
 
@@ -93,9 +124,6 @@ namespace Editor
         ~KarteDaten();
         void addObjekt( ObjektDaten &daten );
         void removeObjekt( int index );
-        void getObjekt( int index, std::function< bool( ObjektDaten* ) > callBack );
-        void getSpieler( int index, std::function< bool( SpielerDaten* ) > callBack );
-        void getTeam( int index, std::function< bool( TeamDaten* ) > callBack );
         void thread() override;
         const ObjektDaten *getObjekt( int index );
         const SpielerDaten *getSpieler( int index );