[C++]Problem strings

05/08/2011 15:49 MrSimonKeks#1
Hallo Leute,
ich habe ein kleines Problemchen. Ich bin gerade dabei mein kleines 2D Spielchen zu programmieren. Auf das Problem stoße ich beim Laden der Map/Karte. Ich möchte sie in 2 Teilen sozusagen laden. Der erste Teil ist der Hintergrund, den ich ohne Probleme laden kann, danach möchte ich Objekte (Truhen, Tühren etc.) laden. Dies habe ich so bewältigt, dass ich den Bildschirm in ein 10x10 Raster aufgeteilt habe sprich bei einer Auflösung von 800x600 ist ein Kästchen 60x80 Pixel groß. Soweit so gut. Ich belege nun einfach ein char Array von 100 mit Zahlen die für Objekte stehen (bisher: 0=Nichts, 1=Truhe, 2=Tür, 3=Schlüssel, 4=Geld, 5=Menübutton). Das ist auch alles gut so (verfeiner ich später vllt. noch ein wenig, aber vorerst reichts). Jetzt zu meinem eigentlichen Problem: Ich habe nun 2 Funktionen in einer Klasse, die eine tut im großen und ganzen, dass was ich beschrieben habe und die andere überprüft ganz simple die jeweilige Zahl im Map-Array und übergibt den Namen des zu ladenden Objektes in einem string den ich zum Laden konvertiere. Und nun hab ich das Problem, dass das jeweilige Bild nicht geladen wird! Laden, zeichnen etc. passiert mit Allegro. Hier der Code, vielleicht seht ihr was ich falsch gemacht habe...
Funktion zum übergeben des Namen:

PHP Code:
std::string MAP::check_object(char object,std::string object_name){    //überprüft die Objekt nummer und giebt den Namen des zu ladenen Objektes aus


    
switch(object){   // überprüfe nummer und gebe den richtigen Namen aus (falls 0=kein name)

    
case 0:  //nichts
        
object_name="nothing";
        break;

    case 
1:  //truhe

        
object_name="objchest.bmp";
        break;

    case 
2//tür

        
object_name="objdoor.bmp";
        break;

    case 
3//schlüssel

        
object_name="objkey.bmp";
        break;

    case 
4//geld

        
object_name="objmoney.bmp";
        break;

    case 
5//menübutton

        
object_name="objmenu.bmp";
        break;

    default:

        break;


    } 
//switch

       //gebe den namen zurück
    
return object_name;



}  
//function 
Hier der Problembereich( map_count ist einfach das jeweilige Kästchen vom Raster bzw. die Zahl des Kästchens):
PHP Code:
std::string object_name//name des Objektes  

    

   
for(int r=0;r<=100;r++){    //r=rundendurchlauf(map[100])

           
map_count=r;  //stellung im Raster der map
       

           
check_object(map[map_count],object_name);  //überprüfen welches Objekt
           
           
           
           
if(map[map_count]==0){break;} //falls kein Objekt vorhanden
  

           
else{

           
object=load_bitmap(object_name.c_str(),0);                   // lade bild des jeweiligen objectes

           



           
if(object==NULL){    //überprüfen ob das Object nicht geladen wurde

               
textprintf_ex(screen,font,400,300,makecol(255,255,255),0,"Error, can not load object!!!");
               break;
           } 
P.S: Er gibt wie gewollt den Error Text aus.

Mfg
05/08/2011 16:18 xNopex#2
Aiaiai... Du bist dir sicher, dass du die Programmierung soweit beherrscht, dass du ein Spiel programmieren willst? D: Sieht nämlich nicht so aus...

Wenn du den Rückgabewert über die Parameter der Funktion haben willst, solltest du mit Zeigern arbeiten, sonst funktioniert das nicht... Sollte wohl klar sein. Ansonsten machst du das eben konventionell so:
Code:
std::string MAP::check_object(char object)
{
    std::string ret;
    
    switch(object)
   {
    ...
    }

    return ret;
}

...

for(int r=0;r<=100;r++)
{
       std::string object_name = (this->)/(OBJECT.)/(OBJECT->)check_object(map[r]);
       ...
}
EDIT: Achtung Pseudocode
05/08/2011 17:50 MrSimonKeks#3
Achja ich versteh was du meinst, und nein bin ich nicht aber kann ja trotzdem nicht schade ;D
05/08/2011 22:26 Bot_interesierter#4
Wenn man ein Funktionsargument für einen Rückgabewert verwenden möchte, dann sollte man Referenzen verwenden, Zeiger wären in diesem Fall fehl am Platz.
Code:
bool MAP::check_object(char object,std::string& object_name);
So könnte dann der Funktionsprototyp aussehen, ich empfehle bool als Rückgabewert, da du so einfach Signalisieren kannst ob deine Funktion erfolgreich war oder nicht.

Außerdem schreibst du sehr viel überflüssigen Code und missachtest grundlegende Regeln für les- und wartbaren Code, die Breaks in deinem if/else Clause machen, zumindest mit dem Vorhandenen Code keinen Sinn, man sollte allgemein möglichst auf break in Schleifen verzichten, es macht den Programmfluss einfach sehr unübersichtlich und verkompliziert die Dinge unnötig.
Über dein if/else Konstrukt verhinderst du ja schon das ein Bild geladen wird falls ein Feld kein Objekt enthalten soll.
Für Konstruktive kritik zeigst du allerdings viel zu wenig Quellcode, wir müssten schon mehr über deine Klasse wissen, aber nach dem was ich bisher gesehen habe solltest du dich ersteinmal aufs Lernen besinnen, ohne das richtige Handwerkszeug wird dir das mit deinem kleinen Spiel bald keinen Spaß mehr bereiten.
Es ist wichtig dass du Grundlegende Techniken der Programmierung verstehst, es reicht nicht nur den Befehlssatz einer Sprache zu kennen, man muss auch wissen wie man diesen möglichst geschickt anwendet, allerdings beherrscht du noch nichteinmal die wichtigsten Sprachkonstrukte von C++, darum kann ich es nur wiederholen, Du musst unbedingt mehr Lernen, wenn du wirklich etwas mit C++ anfangen möchtest.
05/08/2011 23:43 MrSimonKeks#5
Natürlich haste Recht mit dem was du schreibst, aber schau ich bin erst 14 Jahre jung und immer lernen macht auch keinen übermäßigen Spaß und in meinem Alter brauch ich keineswegs dies alles schon unbedingt lernen. Ich mache halt gerade das was mir am meisten Spaß macht. Wenn ich nach einer Woche wieder aufhöre mit einem Projekt, da ich keine Lust mehr darauf habe dann fang ich halt mit einem neuen Projekt an wozu ich mehr Lust habe. Auf diese Weise finde ich lernt man am schnellsten ganz Unterschiedliche Dinge, auch wenn man häufig das Projekt nicht fertigstellt. Aber schau ich tue halt das was mir gerade am meisten Spaß macht mit meinen Möglichkeiten. Darum geht es doch eigentlich, Spaß beim lernen zu haben und sich nicht durchzu quälen...
MfG
Ps: Ich werde es morgen mal mit den Referenzen ausprobieren.
05/09/2011 11:27 MoepMeep#6
Quote:
Originally Posted by MrSimonKeks View Post
Natürlich haste Recht mit dem was du schreibst, aber schau ich bin erst 14 Jahre jung und immer lernen macht auch keinen übermäßigen Spaß und in meinem Alter brauch ich keineswegs dies alles schon unbedingt lernen. Ich mache halt gerade das was mir am meisten Spaß macht. Wenn ich nach einer Woche wieder aufhöre mit einem Projekt, da ich keine Lust mehr darauf habe dann fang ich halt mit einem neuen Projekt an wozu ich mehr Lust habe. Auf diese Weise finde ich lernt man am schnellsten ganz Unterschiedliche Dinge, auch wenn man häufig das Projekt nicht fertigstellt. Aber schau ich tue halt das was mir gerade am meisten Spaß macht mit meinen Möglichkeiten. Darum geht es doch eigentlich, Spaß beim lernen zu haben und sich nicht durchzu quälen...
MfG
Ps: Ich werde es morgen mal mit den Referenzen ausprobieren.
Viel spaß beim versagen.
05/09/2011 15:52 xNopex#7
Quote:
Zeiger wären in diesem Fall fehl am Platz.
Nö. Referenzen verwenden intern auch Zeiger. Es sieht halt nur "besser" aus.

Quote:
void ChangeMyParam( std::string* param )
{
*param = "Cool!";
}

std::string str = "Mhm.";
ChangeMyParam( &str );

void ChangeMyParam( std::string& param )
{
param = "Cool!";
}

std::string str = "Mhm.";
ChangeMyParam( str );
Liefert beides das gleiche Ergebnis.