[Orxonox-commit 6965] r11586 - code/branches/AsteroidMining_HS17/src/modules/asteroidmining

remartin at orxonox.net remartin at orxonox.net
Tue Nov 21 13:07:17 CET 2017


Author: remartin
Date: 2017-11-21 13:07:17 +0100 (Tue, 21 Nov 2017)
New Revision: 11586

Modified:
   code/branches/AsteroidMining_HS17/src/modules/asteroidmining/AsteroidMinable.cc
   code/branches/AsteroidMining_HS17/src/modules/asteroidmining/AsteroidMinable.h
Log:
Major breakthrough: Variable Collision shape works, error in spawnChildren() found (health...). Smaller problems remain (Weird initial velocity, correct health setting). 

Modified: code/branches/AsteroidMining_HS17/src/modules/asteroidmining/AsteroidMinable.cc
===================================================================
--- code/branches/AsteroidMining_HS17/src/modules/asteroidmining/AsteroidMinable.cc	2017-11-20 16:32:43 UTC (rev 11585)
+++ code/branches/AsteroidMining_HS17/src/modules/asteroidmining/AsteroidMinable.cc	2017-11-21 12:07:17 UTC (rev 11586)
@@ -43,16 +43,9 @@
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 KNACKPUNKTE:
-o Collision Shape-Problem (Funktioniert nur, wenn im Konstruktor) -> Mit Factory-Methode oder so basteln. 
 o Maximale Hitpunkte = 200?
+o komische Startgeschwindigkeit der initialisierten Asteroiden. Fliegen davon. 
 
-o Neue Asteroiden generieren -> Absturz
---> Kollidiert sofort mit irgendetwas, death() wird mehrfach aufgerufen. 
---> Funktioniert der Test in den hit()-Methoden?
---> Welcher Aufruf loest die death()-Methode auf?
-
-
-
 OFFEN: 
 o Add custom pickup 'resources'. Weird template stuff -> Problems setting 'size' and other properties? setNumber of Resources. 
 o Explosion parts
@@ -60,6 +53,8 @@
 
 HANDBUCH:
 o im Level-File includes/pickups.oxi importieren. 
+o Bei der XML-Variante wird beim ersten Aufruf der Tick-Methode ein neuer Asteroid generiert, 
+  damit die Groesse der Collision Shape korrekt initialisiert wird. 
 
 Anpassungen Pickup-Zeug: 
 o Pickup.h: Zugriffsänderung createSpawner
@@ -72,6 +67,10 @@
 o Dynamische Definition -> putStuff-Methode, Werte noch nicht durchgesickert. 
 o Error-Nachricht: Einfach Argumente leer lassen. 
 o Pickups: setMaxSpawned funktioniert nicht -> Bastelloesung: Auf 2 statt eins setzen, erstes wird wohl direkt zerstoert. 
+
+o Groessenabhaengige Collison shape: Umweg ueber zweiten Konstruktor. 
+o Absturz beim Asteroidengenerieren: Health war auf 0 gesetzt! Wurde nur bei der xml-Variante definiert. 
+
 */
 
 
@@ -114,54 +113,53 @@
 {
     RegisterClass(AsteroidMinable);
 
-    AsteroidMinable::AsteroidMinable(Context* context) : Pawn(context)
-    {
-        RegisterObject(AsteroidMinable);
 
-        // Old stuff from pawn
-        this->setRadarObjectColour(ColourValue(1.0f, 1.0f, 0.0f, 1.0f));
-        this->setRadarObjectShape(RadarViewable::Shape::Dot);
-        this->setCollisionType(WorldEntity::CollisionType::Dynamic);
-        this->bAlive_ = true;
+    // This constructor is for XML access only.
+    AsteroidMinable::AsteroidMinable(Context* context) : Pawn(context){
 
-        this->bVulnerable_ = true;
-        this->enableCollisionCallback();
+        // Da auch noetig? Wegen set in XML-Code?
+        RegisterObject(AsteroidMinable);
 
-        // Default Values
-        this->generateSmaller = true; 
-        //this->setHealth(50);
-        this->size = 10; // customSize
         this->context = context;
         this->initialised = false;
-        //this->roll = rand()*5; //etwas Drehung. richtige Variable
-//this = new AsteroidMinable()
 
+        //Noetig, damit nicht sofort zerstoert?
+        this->setCollisionType(WorldEntity::CollisionType::Dynamic);
 
+        // Old from Pawn
+        this->registerVariables();
 
-        // DELETE if other stuff works! (wrong size etc.)
-        SphereCollisionShape* cs = new SphereCollisionShape(this->context);
-        cs->setRadius((this->size)*2); //OFFEN: Feinabstimmung der Radien 
-        this->attachCollisionShape(cs); 
+        orxout() << "AsteroidMining:: Pseudo-Konstruktor passiert!" << endl;
 
+    }
 
+    // Call this one from other C-files. Takes arguments. 
+    AsteroidMinable::AsteroidMinable(Context* c, float size, Vector3 position) : Pawn(c){
 
+        RegisterObject(AsteroidMinable);
 
-        // Old from Pawn
-        this->registerVariables();
+        // Old stuff from pawn
+        this->setRadarObjectColour(ColourValue(1.0f, 1.0f, 0.0f, 1.0f));
+        this->setRadarObjectShape(RadarViewable::Shape::Dot);
+        this->setCollisionType(WorldEntity::CollisionType::Dynamic);
 
-        orxout() << "AsteroidMining:: Konstruktor passiert!" << endl;
+        this->enableCollisionCallback();
 
-    }
+        // Default Values
+        this->generateSmaller = true; 
+        //this->setHealth(50);
+        this->size = size; // customSize
+        this->health_ = 5*size;// capped at 200 in pawn or smth?
+        //this->setHealth(health_); // Confusing, delete one of these
+        this->context = c;
+        //this->roll = rand()*5; //etwas Drehung. richtige Variable
 
-    AsteroidMinable::~AsteroidMinable()
-    {
+        // Fliegt davon, irgendwieso. Dies scheint auch nicht zu nuetzen. 
+        this->setVelocity(0, 0, 0);
 
-    }
 
-    void AsteroidMinable::putStuff(){
 
-        // Add Model
-        //<Model position="0,-40,40" yaw="90" pitch="-90" roll="0" scale="4" mesh="ast6.mesh" />
+        // Add Model    //<Model position="0,-40,40" yaw="90" pitch="-90" roll="0" scale="4" mesh="ast6.mesh" />
         Model* hull = new Model(this->context);
         // random one of the 6 shapes
         char meshThingy[] = "";
@@ -175,13 +173,28 @@
         cs->setRadius((this->size)*2); //OFFEN: Feinabstimmung der Radien. 2.5 in AsteroidField.lua
         this->attachCollisionShape(cs); 
 
+        // Old from Pawn
+        this->registerVariables();
 
         this->initialised=true; 
 
-        orxout() << "AsteroidMining:: Initialisierung abgeschlosssssen." << endl;
+        orxout() << "AsteroidMining:: Initialisierung Zweitkonstruktor abgeschlosssssen." << endl;
 
     }
 
+    AsteroidMinable::~AsteroidMinable(){
+
+    }
+
+    void AsteroidMinable::putStuff(){
+
+        // Just create a new asteroid to avoid Collision shape scale problems etc. 
+        AsteroidMinable* reborn = new AsteroidMinable(this->context, this->size, this->getPosition());
+        reborn->toggleShattering(true); // mainly here to avoid 'unused' warning. 
+        this->~AsteroidMinable(); // seems dangerous. Necessary for efficiency? 
+
+    }
+
     void AsteroidMinable::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
         SUPER(AsteroidMinable, XMLPort, xmlelement, mode);
@@ -229,8 +242,6 @@
 
     void AsteroidMinable::setSize(float s){
         this->size = s;
-        this->health_ = 5*s;// capped at 200 in pawn or smth?
-        this->setHealth(health_);
     }
 
     float AsteroidMinable::getSize(){
@@ -237,6 +248,11 @@
         return this->size;
     }
 
+    void AsteroidMinable::toggleShattering(bool b){
+        this->generateSmaller = b;
+    }
+
+
     void AsteroidMinable::death() //ueberschreiben
     {
 
@@ -334,24 +350,27 @@
         //orxout() << "AsteroidMining::spawnChildren(): Inside for-loop." << endl;
 
         //Spawn this child  Game crashes!
-        AsteroidMinable* child = new AsteroidMinable(this->context);
+        //AsteroidMinable* child = new AsteroidMinable(this->context);
+        AsteroidMinable* child = new AsteroidMinable(this->context, extra+1, this->getPosition() + Vector3(num*5, 0, 0));
         // if(!(child == nullptr)){//Errorgebastel
 
         // Position zu spaet gesetzt? Tick nicht atomar -> falsche Groesse evtl?
 
+        // child->setSize(extra + 1);
+                
+        //     //OFFEN:Kollision der Kinder verhindern
+        //     //Relativ zu Elternteil automatisch?
+        //     //Typ position:rand()*Vektoriwas?
+        //     //pawn->getWorldPosition() + Vector3(30,0,-30);
+        // child->setPosition(this->getPosition() + Vector3(num*5, 0, 0));
+        // //child->setPosition(Vector3(0,0,0));
+
         if(child == nullptr){
             orxout(internal_error, context::pickups) << "Weird, can't create new AsteroidMinable." << endl;
         }
 
-        child->setSize(extra + 1);
-                
-            //OFFEN:Kollision der Kinder verhindern
-            //Relativ zu Elternteil automatisch?
-            //Typ position:rand()*Vektoriwas?
-            //pawn->getWorldPosition() + Vector3(30,0,-30);
-        child->setPosition(this->getPosition() + Vector3(num*5, 0, 0));
-        //child->setPosition(Vector3(0,0,0));
 
+
         //orxout() << "Done: Creating new Asteroid" << endl;
 
         // }

Modified: code/branches/AsteroidMining_HS17/src/modules/asteroidmining/AsteroidMinable.h
===================================================================
--- code/branches/AsteroidMining_HS17/src/modules/asteroidmining/AsteroidMinable.h	2017-11-20 16:32:43 UTC (rev 11585)
+++ code/branches/AsteroidMining_HS17/src/modules/asteroidmining/AsteroidMinable.h	2017-11-21 12:07:17 UTC (rev 11586)
@@ -49,7 +49,9 @@
     { // tolua_export
 
         public:
-            AsteroidMinable(Context* context);
+            AsteroidMinable(Context* context);// This constructor is for XML access only!
+            AsteroidMinable(Context* c, float size, Vector3 position);// Call this Constructor from other C-files.
+
             virtual ~AsteroidMinable();
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
             virtual void XMLEventPort(Element& xmlelement, XMLPort::Mode mode) override;
@@ -64,10 +66,12 @@
             virtual void setSize(float f);
             virtual float getSize();
 
+            virtual void toggleShattering(bool b);
 
 
 
 
+
         protected:
             // Da neue Argumente reinstellen
             //float asteroidVersion; // Bodenstrich-Konvention?, 



More information about the Orxonox-commit mailing list