2012-03-26 9 views
1

Ich bin noch relativ neu in C++ und Programmierung, aber ich habe eine gute Zeit zu lernen. Ich schreibe ein kleines, sehr einfaches ncurses-Programm, das bisher mit den WASD-Tasten einfach ein "#" um den Bildschirm bewegen soll.Klassenvariable kann nicht innerhalb der neuen Funktion geändert werden

Das Problem ist, ich bin nicht in der Lage, player.x in der ersten Funktion Update() zu ändern. Hier

ist der Code:

#include <iostream> 
#include <ncurses.h> 

using namespace std; 

class Player 
{ 
    public: 

    int x; 
    int y; 
}; 

void Update() 
{ 
    int z; 

    z = getch(); 

    if(z == 97) //A key 
     { 
      player.x--; 
     } 

    if(z == 100) //D key 
     { 
      player.x++;   
     } 

    if(z == 119) //W key 
     { 
      player.y--; 
     } 

    if(z == 115) //S key 
     { 
      player.y++;   
     } 
} 


void Draw(int xPos, int yPos) 
{ 
    clear(); 

    mvprintw(yPos,xPos,"#"); 

    refresh(); 
} 

int main() 
{ 
    initscr(); 
    noecho(); 

    int doContinue; 

    Player player; 

    do 
    {   
     Update();  
     Draw(player.x, player.y); 

    }while((doContinue=getch()) != 27); 

    endwin(); 
    return 0; 
} 

Jede Eingabe wäre hilfreich!

+0

Was meinen Sie, Sie sind" unfähig "' player.x' zu ändern? Gibt es einen Fehler bei der Kompilierung? Tut es zur Laufzeit nichts? Haben Sie Debug-Ausdrucke ausprobiert? –

+0

Sie können nach dem Bildschirmrand suchen, damit Sie nicht außerhalb des Bildschirms zeichnen. – hochl

+0

Sorry Jonathan Ich habe vergessen, den Compiler anzugeben war beschweren player.x wurde in diesem Bereich nicht definiert. Auch hochl mach ich danach ;-) – maximida

Antwort

4

Alle Variablen in C++ sind einem Bereich zugeordnet. Stellen Sie sich den Umfang als die Sichtbarkeit dieser Variablen vor. In diesem Fall ist der Player nur in der Funktion sichtbar, in der main deklariert ist. Um den Player zu aktualisieren, müssen Sie entweder den Bereich vergrößern und global machen (schlechte Idee) oder b. Übergeben Sie es in Ihre Funktion.

Wenn Sie Ihre Update geändert haben, um eine Spielerreferenz zu nehmen, könnten Sie erreichen, was Sie versucht haben. Die neue Deklaration würde so aussehen: Leere Aktualisierung (Player & player) `dann, wenn Sie Ihre Update-Funktion in der Instanz

anrufen
+0

Das ist super, danke an alle, die diese Lösung gegeben haben! Ich habe es funktioniert, und jetzt verstehe ich Klassen besser! – maximida

1

Es gibt keine player in Update() deklariert. Damit dies funktioniert, müssen Sie auf die Variable player zugreifen können, die in main deklariert ist. Dazu müssen Sie die Variable per Zeiger oder Verweis an Update übergeben.

Im Haupt:

Update(player); 

Ändern Sie die Signatur-Update:

void Update(Player& player); 

Dies passiert das Objekt player vom Typ namens Player-Update Bezug genommen wird.

0

Wie soll die Update Funktion wissen, welches Objekt es ändern soll? Sie erstellen eine Player namens player, aber dann geben Sie das nicht an die Update Funktion.

Verwandte Themen