JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=6d2cc26662bfd575d7c0417a86bdc9d8Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Klassen "sammeln"
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
underberg
JLI'ler



Anmeldedatum: 11.01.2003
Beiträge: 153

Medaillen: Keine

BeitragVerfasst am: 19.08.2003, 17:35    Titel: Klassen "sammeln" Antworten mit Zitat

folgendes...

Bei meinem Spiel soll man soviele Objekte wie man möchte auf den Bildschirm setzen können (und verwalten...)

Ich hab mir so überlegt, dass man für jedes Objekt eine Klasse erstellt...

Gibt es irgendeine Möglichkeit dass ich unendlichviele (oder ziemlich viele) Klassen speichern kann, dass ich nicht Millionen von Objekten verarbeiten muss sondern nur automatisch die Liste abarbeite...

Wenn das geht... Kann mir einer erklären wie?
(Am besten mit Quellcode... Very Happy )
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 19.08.2003, 17:48    Titel: Antworten mit Zitat

Du erstellst dir ein Interface und leitest von diesem deine Klassen ab, etwa so:

Code:


struct IBase
{
   void MachWas() = 0;
}


class CBall : public IBase
{
public:
   void MachWas()
   {
      cout << "*roll*" << endl;
   }
};
...



Dann kannst du dir so eine Liste anlegen:

Code:


list<IBase *> MeineObjekte;

MeineObjekte.push_back(new CBall());
MeineObjekte.push_back(new CBoomerang());
MeineObjekte.push_back(new CBaum());



Wenn du dann die Liste durchläufst und MachWas() aufrufst, wird immer die richtige Methode aufgerufen.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 19.08.2003, 18:11    Titel: Antworten mit Zitat

Ich hab dazu mal ein kleines Programm geschrieben.

Code:

#include <iostream>
#include <list>
#include <algorithm>
#include <functional>

using namespace std;

// BASISKLASSE

struct IBase
{
   virtual ~Base() { }
   virtual void MachWas() = 0;
};

// ABGELEITETE KLASSEN

class CBall : public IBase
{
public:
   CBall() { cout << "Ein Ball betritt die Spielwelt" << endl;   }
   virtual ~CBall() { cout << "Ein Ball verlässt die Spielwelt" << endl; }

   void MachWas() { cout << "*roll*" << endl; }
};

class CPolizist : public IBase
{
public:
   CPolizist() { cout << "Ein Polizist betritt die Spielwelt" << endl;   }
   virtual ~CPolizist() { cout << "Ein Polizist verlässt die Spielwelt" << endl; }

   void MachWas() { cout << "STEHEN BLEIBEN! POLIZEI!" << endl; }
};

// FUNCTORS

// Ruft die Methode "MachWas" auf
template<typename T>
struct machwas : public unary_function<T, bool>
{
   void operator()(T * a)
   {
      a->MachWas();
   }
};

// Löscht ein Objekt
template<typename T>
struct delete_ : public unary_function<T, bool>
{
   void operator()(T * a)
   {
      delete a;
   }
};

void main()
{
   list<IBase *> MeineObjekte;

   MeineObjekte.push_back(new CBall);
   MeineObjekte.push_back(new CBall);
   MeineObjekte.push_back(new CPolizist);

   for_each(MeineObjekte.begin(), MeineObjekte.end(), machwas<IBase>());
   for_each(MeineObjekte.begin(), MeineObjekte.end(), delete_<IBase>());
}


[EDIT] DUMMEN Fehler beseitigt.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
underberg
JLI'ler



Anmeldedatum: 11.01.2003
Beiträge: 153

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 06:53    Titel: Antworten mit Zitat

Gibt es nicht eine Möglichkeit, das Analog zu den SDI Anwendungen (Serialisierung) zu machen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 09:06    Titel: Antworten mit Zitat

Fragezeichen? Das ist normales C++.. sollte überall anwendbar sein. Kannst du deine Frage bitte nochmal anders stellen? Ich weiß nicht wirklich was du meinst. ;)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
underberg
JLI'ler



Anmeldedatum: 11.01.2003
Beiträge: 153

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 16:50    Titel: Antworten mit Zitat

ei SDI Anwendungen kannst du ja Daten über die Serialisierung verabreiten und speichern... Ich bezweifel aber das das so einfach übertragbar ist, da das ja auf der Dokumentklasse beruht (und diese ja hier fehlt)... Und da kannst du ja auch unendlichviele Datensätze (Klassen) hinzufügen und frei verarbeiten...
Aber ich dachte so, dass es vielleicht etwas equävalentes dazu gibt... Aber ich werd jetzt erstmal deine Methode ausprobieren ob man damit auch das umsetzen kann, was ich will...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
underberg
JLI'ler



Anmeldedatum: 11.01.2003
Beiträge: 153

Medaillen: Keine

BeitragVerfasst am: 21.08.2003, 18:25    Titel: Antworten mit Zitat

@Hazel: Bei deinem Beispiel bringt er mir einen Fehler: "Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei"...


Geht auch glaub ich in eine andere Richtung als ich es brauche...

Mein Problem ist folgendes: Ich werde wahrscheinlich knapp hundert Klassen verwenden, die alle vom selben Typ, nur mit anderen Eigenschaften... Und ich bräuchte einfach eine Art Container, wo ich alle einspeichere und bei Bedarf mir die Klasse raussuche, die ich brauche und deren Daten verarbeite....
Wie geht das?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.08.2003, 18:56    Titel: Antworten mit Zitat

Sorry aber du benutzt einige Schlüsselwörter falsch... du meinst du willst Instanzen einer Klasse speichern. Was meinst du mit Eigenschaften? Als Container würde ich einfach eine std::list nehmen. Wenn du nach einer Instanz suchst kannst du den Algorithmus std::find benutzen(funktioniert genauso wie for_each, du musst halt nur ein anderes Funktionsobjekt übergeben).
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
underberg
JLI'ler



Anmeldedatum: 11.01.2003
Beiträge: 153

Medaillen: Keine

BeitragVerfasst am: 21.08.2003, 19:08    Titel: Antworten mit Zitat

Merk man so deutlich, dass ich keine Ahnung hab? Very Happy

Als Beispiel:
Code:
class Haus
{
public:
   void SetHaus(int x, int y)
   {
   Haus_X=x;
   Haus_Y=y;
   }
   
   
   void Blt_Haus()
   {
   BltWohnhaus1(Haus_X,Haus_Y,3);
   }
private:
   int Haus_X;
   int Haus_Y;
};


So... Nur halt en bissl komplexer soll die Klasse am Ende aussehen... Von dieser Klasse sollen jetzt mehrere Häuser abgeleitet werden, die sich einzig und allein in den unter private festgelegten Eigenschaften unterscheiden...
Ich will jetzt aber nicht 100 Hausobjekte erstellen, sondern die Variablen einfach speichern und bei Bedarf zum Beispiel von einem bestimmten Hausobjekt die Variablen ändern...
Verstanden was ich meine?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.08.2003, 19:51    Titel: Antworten mit Zitat

Du willst deine Haus-Klasse als Basisklasse nehmen und verschiedene Haustypen ableiten, korrekt? Dann ist doch das Beispielprogramm, dass ich dir gegeben habe richtig?

Zitat:

Ich will jetzt aber nicht 100 Hausobjekte erstellen, sondern die Variablen einfach speichern


Das kapier ich nicht wirklich.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
underberg
JLI'ler



Anmeldedatum: 11.01.2003
Beiträge: 153

Medaillen: Keine

BeitragVerfasst am: 21.08.2003, 20:00    Titel: Antworten mit Zitat

Hazel hat Folgendes geschrieben:
Du willst deine Haus-Klasse als Basisklasse nehmen und verschiedene Haustypen ableiten, korrekt? Dann ist doch das Beispielprogramm, dass ich dir gegeben habe richtig?

Kann sein. Aber um dein Programm zu verstehen müsst es erstmal laufen...

Zitat:
Zitat:

Ich will jetzt aber nicht 100 Hausobjekte erstellen, sondern die Variablen einfach speichern


Das kapier ich nicht wirklich.


Ich will folgendes vermeiden:
Haus Haus1;
Haus Haus2;
Haus Haus3;
...
Haus Haus100;

Vor allem da der einzige Unterschied zwischen allen Hundert Häusern ein paar variablensind...

Ich will ungefähr sowas

Code:
Haus Whaus;
SetHaus(10,100);
Häusergruppe->Add(Whaus);

Haus Whaus2;
Whaus2=Häusergruppe->GetHaus(2);



Also im endeffekt so, wie du bei der Serialisierung Objekte verwalten würdest...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.08.2003, 20:26    Titel: Antworten mit Zitat

Genau das macht mein Beispiel...

Zitat:
"Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei"...


Stell mal in deinem Projekt die vorkompilierten Header aus... wo du die Option findest weiß ich aber nicht aus dem Kopf. Und erstellst du auch eine Konsolenanwendung? Falls es nicht klappt, paste die #includes in den Header stdafx.h.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R


Zuletzt bearbeitet von Hazel am 21.08.2003, 21:10, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 21.08.2003, 20:35    Titel: Antworten mit Zitat

Du findest dass in den C++ Optionen unter Projekt->Einstellungen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
underberg
JLI'ler



Anmeldedatum: 11.01.2003
Beiträge: 153

Medaillen: Keine

BeitragVerfasst am: 23.08.2003, 06:29    Titel: Antworten mit Zitat

Code:
error C2523: 'IBase::~Base' : Name fuer Destruktor ungueltig

Edit:Habs jetzt einfach rausgenommen und es läuft.. Jetzt muss ich es nur noch verstehen... Laughing

P.S. Könntest du mit dann auch mal schreiben, wie das GetHaus() bei deiner Funktion aussehen würde... Weil das Add() ist ja wohl mit pushback() unterstützt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 23.08.2003, 08:48    Titel: Antworten mit Zitat

Ähm der Destruktor muss unbedingt wieder rein und zwar als virtual! Ich hatte nur einen Tippfehler drin. Es muss heißen

Code:

struct IBase
{
   virtual ~IBase() { }
   virtual void MachWas() = 0;
};


Zu der GetHaus() Funktion:
Nach welchen Kriterien soll das Haus denn gesucht werden? Gibst du jedem Haus eine ID?
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum