problem mit klassen
-
Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
also, ereigniss ist ein tastendruck
hier:
if(eingabe == 32) { cschuss shot(x_pos_spieler,y_pos_spieler); schuss++; }
die klase ansich:
class cschuss { public: int x_pos_schuss1 , y_pos_schuss , x_pos_schuss2; cschuss(int x, int y) { y_pos_schuss = y-1; x_pos_schuss1 = x+2; x_pos_schuss2 = x+9; } void schuss_logik() { if(GetTickCount()>zeit) { y_pos_schuss--; zeit=GetTickCount()+20; } } void schuss_grafik() { textcolor(YELLOW); gotoxy(x_pos_schuss1,y_pos_schuss); cout<<"*"; gotoxy(x_pos_schuss1,y_pos_schuss+1); cout<<" "; gotoxy(x_pos_schuss2,y_pos_schuss); cout<<"*"; gotoxy(x_pos_schuss2,y_pos_schuss+1); cout<<" "; if(y_pos_schuss<2) { gotoxy(x_pos_schuss1,y_pos_schuss); cout<<" "; gotoxy(x_pos_schuss2,y_pos_schuss); cout<<" "; } gotoxy(x_pos_schuss1,y_pos_schuss+2); cout<<" "; gotoxy(x_pos_schuss2,y_pos_schuss+2); cout<<" "; } };
hier teil der main:
while(!spiel_schleife) { delay(30); steuerung(); shot.schuss_logik(); grafik(); }
in steuerung() ist das eregniss drinne, mit welchem die instanz erstellt wird
un danach möcht ich auf die methode zugreifen
-
danke schonma SideWinder
jetzt is nur noch ein fehler
hab jetzt:
cschuss* shot = 0;
das is in die main gepackt
shot->schuss_logik(); shot->schuss_grafik();
un das zum ausführen in der spielschleife
shot = new cschuss(x_pos_spieler,y_pos_spieler);
das beim ererigniss zum erstellen der instanz
un hier beim letzten ist noch der fehler, und zwar:
`shot' undeclared (first use this function)
-
Naja wo tritt den der Fehler auf, poste mal die Zeile oder sag welche der beiden es ist.
Kurz gesagt: shot existiert in der Funktion nicht in der du sie benützen willst. Sicher, dass dort cschuss* shot = 0; *vor* shot->do_something() steht?
MfG SideWinder
-
hab doch geschrieben, der fehler kommt bei dem letzten der zeilen
bei
shot = new cschuss(x_pos_spieler,y_pos_spieler);
ja und reihenfolge stimmt
main()
cschuss* shot = 0;spielschleife
shot->do();
-
Ja und liegt shot = blubb auch *nach* der Deklaration??
MfG SideWinder
-
ja, die reihenfolge ist
cschuss* shot = 0;
dann
in der steuerung, falls das event eintritt
shot = new cschuss(x_pos_spieler,y_pos_spieler);un dann
die logik un grafik methoden der klasse
-
Dann lass den kompletten Code sehen, hier hats was
MfG SideWinder
-
ok, also alles wird unüberischtlich hier
aber die relevanten teile :
also erstmal die klasse
class cschuss { public: int x_pos_schuss1 , y_pos_schuss , x_pos_schuss2; cschuss(int x, int y) { y_pos_schuss = y-1; x_pos_schuss1 = x+2; x_pos_schuss2 = x+9; } void schuss_logik() { if(GetTickCount()>zeit) { y_pos_schuss--; zeit=GetTickCount()+20; } } void schuss_grafik() { textcolor(YELLOW); gotoxy(x_pos_schuss1,y_pos_schuss); cout<<"*"; gotoxy(x_pos_schuss1,y_pos_schuss+1); cout<<" "; gotoxy(x_pos_schuss2,y_pos_schuss); cout<<"*"; gotoxy(x_pos_schuss2,y_pos_schuss+1); cout<<" "; if(y_pos_schuss<2) { gotoxy(x_pos_schuss1,y_pos_schuss); cout<<" "; gotoxy(x_pos_schuss2,y_pos_schuss); cout<<" "; } gotoxy(x_pos_schuss1,y_pos_schuss+2); cout<<" "; gotoxy(x_pos_schuss2,y_pos_schuss+2); cout<<" "; } };
dann die spielschleife:
cschuss* shot = 0; while(!spiel_schleife) { delay(30); steuerung(); if(shot) shot->schuss_logik(); grafik(); }
und dann hier noch die zwei funktionen steuerung() und grafik()
void steuerung() { if (kbhit()) { eingabe = getch(); if(eingabe == 75) richtung = 1; if(eingabe == 77) richtung = 2; if(eingabe == 80) richtung = 0; if(eingabe == 32) { shot = new cschuss(x_pos_spieler,y_pos_spieler); schuss++; } if(eingabe == 27) spiel_schleife = true; if(eingabe == 'l') --life; } if(richtung == 1 && x_pos_spieler > 2) { x_old_pos_spieler = x_pos_spieler; x_pos_spieler--; } if(richtung == 2 && x_pos_spieler < 72) { x_old_pos_spieler = x_pos_spieler; x_pos_spieler++; } } void grafik() { gotoxy(3,46); textcolor(142); cout<<"Life"; gotoxy(8,46); textcolor(8); for (int i=0;i<20;++i) cout<<balken; textcolor(LIGHTRED); for(int i=0;i<life;++i) { gotoxy(8+i,46); cout<<balken; } if(shot) shot->schuss_grafik(); textcolor(7); gotoxy(x_old_pos_spieler,y_pos_spieler); cout<<" "; gotoxy(x_old_pos_spieler,y_pos_spieler+1); cout<<" "; gotoxy(x_pos_spieler,y_pos_spieler); cout<<"| /\\ |"; gotoxy(x_pos_spieler,y_pos_spieler+1); cout<<"||=||=||"; }
-
Also shot = new blub; kann ja nciht funktionieren. Das rufst du ja in einer ganz anderen Funktion auf wo shot nicht bekannt ist. Also da müsstest du Parameter übergeben:
cschuss* shot = 0; while(!spiel_schleife) { delay(30); steuerung(&shot); // shot als Parameter übergeben if(shot) shot->schuss_logik(); grafik(); }
void steuerung (cschuss*& shot) // geht sowas? probier das mal :D
MfG SideWinder
-
DANKE !!
funktioniernur
hab ich parameter geändert in
steuerung(shot);
also, nich als referenz , dann gings
jzet noch eine frage, es sollen ja mehrer schüsse gleichzeitig fliegen, deshalb ja übehraupt die klasse, sonst wärs ja auch ohne gegangen
kann ich einfach shot mit nem index machen ?! also shot[index] ?!
dann könnte man ganz leicht mehrere verwalten ...
-
1. Ja klar ohne '&', dachte vorher noch an cschuss** und &shot, dann ist mir aber gekommen, dass Referenzen auf Zeiger auch möglich sein sollten und hab vergessen oben das '&' wieder rauszunehmen.
2. Nicht so ganz. shot muss dann ein Array von cschuss sein. Viel einfacher als sich da jetzt aber um Speicher zu kümmern, ist es allerdings, ein bereits vorgefertigtes Array aus der STL zu benützen:
#include <vector> using namespace std; ... vector<cschuss*> shots; ... // Statt shot = new blub; shots.push_back(new blub); // Statt if(shot) if(!shots.empty()) ... // Statt shot->do_something(); shot[i]->do_something();
Wenn du alle Schüsse in steuerung() durchgehen willst kannst du dafür Iteratoren benützen:
vector<cschuss*>::iterator iter = shots.begin(); while(iter != shots.end()) { (*iter)->do_something(); ++iter; }
Achja und den Kopf von steuerung musst du dann natürlcih auch anpassen, dementsprechend dann eine Referenz auf vector<cschuss*>
MfG SideWinder
-
ok, vielen dank, werd mich jetzt ma dran setzen un das ausprobieren
achja, eine sache noch:
wie lösche ich shot wieder ?!nit delete shot; funktionierts irgendwie nich, also bekomm syntax fehler
-
Wo möchtest du denn shot löschen? Bereits den Vektor? Die einzelne Variable die du mit new angelegt hast? Also so wie du das bis jetzt hast sollte delete shot; funktionieren.
MfG SideWinder
-
noch erstma nur mit dem einen shot
habs so
if(shot && shot.y_pos_schuss > 1) { shot->schuss_logik(); shot->schuss_grafik(); } else delete shot;
mit fehler
request for member `y_pos_schuss' in `shot', which is of non-class type `cschuss*'
-
Da es sich um einen Zeiger handelt musst du zuerst sagen, dass du nicht den Zeiger haben willst, sondern das Objekt auf das er zeigt. Dann kannst du die Variable abrufen:
(*shot).y_pos;
Da es den faulen C++-Programmieren aber leid war immer soviel zu schreiben, noch dazu Sonderzeichen wurde dafür ein eigener Operator eingeführt:
shot->y_pos;
Achja und Variablen (also Attribute) von Klassen public zu machen ist gar nicht gut. Da verwendet man Getter&Setter-Methoden, also soetwas:
class foo { int m_bar; public: int getBar (); void setBar (int bar); } int foo::getBar () { return m_bar; } void foo:setBar (int bar) { m_bar = bar; }
Dann kannst du über diese Methoden auf deine Variable zugreifen, shot bleibt aber ein Zeiger, der richtige Operator ist also immer noch gefragt:
if(shot && shot->getYPos() > 1) ...
MfG SideWinder
-
vielen dank, nochma ^^
ja, das mit public weiss ich ^^
-
ok, hab noch paar probleme mit den vectoren
also;
kopf der steuerung:void steuerung(vector<cSchuss*>)
un übergabe:
steuerung(&shots);
un dann frage, zum berechnen & zeichnen aller schüsse , woltles es so machen, also der code befindet sich inner main inner spielschleife:
if(!shots.empty()) { vector<cschuss*>::iterator iter = shots.begin(); while(iter != shots.end()) { (*iter)->logik(); (*iter)->grafik(); ++iter; } }
-
Und dein Problem lautet wie?
Ich sag dir mal kurz was ich auf den ersten Blick sehe:
1. Referenz auf den Vektor übergeben.
2. Referenzen übergibt der Compiler automatisch, da muss kein & davor um die Adresse zu erhalten.MfG SideWinder
-
das problem, kurz
der übergabe / bzw. der erwartete übergabewert stimmt nicht
also
void steuerung(vector<cSchuss*>) stimmtnur übergeben einfach ohne & ?!