Problem mit Positionsberechnung



  • Hi,
    ich habe ein Problem mit einer selbsterstellten Klasse und hoffe, dass ihr mir helfen könnt.

    //position.h
    #ifndef POSITION
    #define POSITION
    
    class Position
    {
    public:
    	int x, y;
    	Position()
    	{
    		x = y = 0;
    	}
    
    	Position(int i_x, int i_y)
    	{
    		x = i_x;
    		y = i_y;
    	}
    	void print();
    };
    
    #endif
    
    //position.cpp
    #include "position.h"
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    void Position::print()
    {
    	cout << "X: " << x << "\n"
    		 << "Y: " << y  << endl;
    }
    //position_test.cpp
    #include "position.h"
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    int main()
    {
    	char c;
        Position spieler;
    	do
    	{
    	    spieler.print();
    	    if(kbhit())
    		{
    			c = getch();
    			switch(c)
    			{
    			case 'w': spieler.x += 1;
    			case 'a': spieler.x -= 1;
    			case 'd': spieler.y += 1;
    			case 's': spieler.y -= 1;
    			}
    		}
    		system("CLS");
    	}
    	while(true);
    
    	cin.clear();
    	cin.get();
    	return 0;
    }
    

    Wenn ich a oder s drücke funktioniert es, aber bei w und d passiert nichts.



  • Dir fehlen die breaks im switch-Statement:

    switch(c)
                {
                case 'w': spieler.x += 1; break;
                case 'a': spieler.x -= 1; break;
                case 'd': spieler.y += 1; break;
                case 's': spieler.y -= 1; break;
                }
    

    Ansonsten, wenn du 'w' drueckst, werden alles Cases nach dem 'w'-Case auch ausgefuehrt.



  • Danke jetzt geht's
    Gibt es auch eine Möglichkeit die x- und y-Werte zu ändern ohne sie in den Public- sondern in den Privatebereich zu schreiben.



  • Mach die Variablen private und stelle stattdessen public Methoden:
    void moveLeft();
    void moveRight();
    ...

    zur Verfügung, in welchen dann die Variablenwerte geändert werden. Damit stellst Du sicher, dass nicht irgendetwas in diese Variablen geschrieben werden kann, sondern dass die Kontrolle über den Variableninhalt bei Dir (in Deiner Klasse) bleibt.



  • Dann kann ich aber nicht so was wie x += 1 machen



  • Genau. Stattdessen machst Du dann:

    class Position
    {
      public:
        ...
        void moveRight(int distance = 1)
        {
          //Hier kannst Du noch distance auf gültige Werte prüfen
          ...
          x += distance;
        }
        ...
      private:
        int x;
        ...
    };
    
    ...
    Position spieler;
    ...
    spieler.moveRight();
    ...
    


  • Es hat geklappt! Danke!


Anmelden zum Antworten