Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Ustawienie wartości zmiennych w klasach

Ostatnio zmodyfikowano 2015-10-08 18:32
Autor Wiadomość
Salin
Temat założony przez niniejszego użytkownika
Ustawienie wartości zmiennych w klasach
» 2015-10-08 12:06:48
Witam, od kilku dni pisze sobie grę doszedłem do etapu, gdzie potrzebuje stworzyć plik zapisu gry. Generalnie zapis działa, ale mam problem ze wczytywaniem danych z pliku. Jako że używam do tego dwóch różnych klas, które stworzyłem i przez to (tak bynajmniej mi się wydaje) mam problem z komunikacją między zmiennymi, a raczej ustawianiem ich wartości. Metoda, która wczytuje wartość wygląda następująco:
C/C++
bool Save::wczytaj() {
    float test;
    zapis.open( "Profile.save", ios::in );
    if( zapis.good() )
    {
        zapis >> test;
        player.setHealth( test );
        zapis.close();
        return true;
    }
    else {
        zapis.close();
        return false;
    }
}

Metoda .setHealth() wygląda tak:

C/C++
void Player::setHealth( float set ) {
    health = set;
}

Teraz problem mam taki, że gdy próbuję pobrać wartość zmiennej health (która sama w sobie jest zmienną prywatną klasy player) w jeszcze innej klasie, to wartość zwracana za każdym razem jest równa 0. Jako, że cały problem ma ponad 160 linijek, to zamieszczam tutaj link do pobrania kody źródłowego: http://puu.sh/kCGWx​/093d3df869.zip, lub jeśli kto woli link na pastebin: http://pastebin.com/t8WcZKwT. Więc moja prośba - jakby ktoś mógł wskazać mi palcem, gdzie popełniam błąd byłbym wdzięczny i jeszcze jedno... Gdybym coś źle wytłumaczył, to proszę o zwrócenie mi uwagi i postaram się wytłumaczyć dokładnie o co mi chodzi.
P-138266
pekfos
» 2015-10-08 14:37:07
Jako, że cały problem ma ponad 160 linijek
Twój program ma 166 linii, jeśli 160 z nich to problem, to lepiej zacznij pisać od nowa. 160 linii to jest nic, wklej całość normalnie.
P-138273
Salin
Temat założony przez niniejszego użytkownika
» 2015-10-08 15:10:21
Już wklejam.
C/C++
//main.cpp
#include "Engine.h"

int main() {
    Engine eng;
    eng.runEngine();
   
    return EXIT_SUCCESS;
}

C/C++
//engine.h
#pragma once

#include "Player.h"
#include "Save.h"

class Engine
{
public:
    Engine();
    ~Engine();
   
    void runEngine();
protected:
    Save zapis;
    Player player;
   
};

C/C++
//engine.cpp

#include "Engine.h"
#include <iostream>

Engine::Engine()
{
    if( zapis.wczytaj() == false ) {
        player.setHealth( 2.f );
        zapis.zapisz();
    }
   
}

Engine::~Engine()
{
}

void Engine::runEngine() {
    int a;
    cout << player.getHealth();
    cin >> a;
   
}

C/C++
//player.h

#pragma once

using namespace std;

class Player
{
public:
    Player();
    ~Player();
   
    float getHealth();
   
    void addHealth( float add );
   
    void setHealth( float set );
private:
    float health;
   
};

C/C++
//player.cpp

#include "Player.h"


Player::Player()
{
}

Player::~Player()
{
}

float Player::getHealth() {
    return health;
}

void Player::addHealth( float add ) {
    health += add;
}

void Player::setHealth( float set ) {
    health = set;
}

C/C++
//save.h
#include <fstream>
#include "Player.h"

using namespace std;

class Save
{
public:
    Save();
    ~Save();
   
    bool zapisz();
    bool wczytaj();
   
   
protected:
    fstream zapis;
   
    Player player;
};
 
C/C++
//save.cpp

#include "Save.h"

Save::Save()
{
}

Save::~Save()
{
}


bool Save::zapisz() {
    zapis.open( "Profile.save", ios::out );
    if( zapis.good() == true )
    {
        zapis << player.getHealth() << " ";
        zapis.close();
        return true;
    }
    else {
        zapis.close();
        return false;
    }
}

bool Save::wczytaj() {
    float test = 2;
    zapis.open( "Profile.save", ios::in );
    if( zapis.good() )
    {
        zapis >> test;
        player.setHealth( test );
        zapis.close();
        return true;
    }
    else {
        zapis.close();
        return false;
    }
}
P-138275
Lora
» 2015-10-08 16:00:51
C/C++
class Save
{
public:
    Save();
    ~Save();
   
    bool zapisz();
    bool wczytaj();
   
   
protected:
    fstream zapis;
   
    Player player; // To kopia
};
Z tego co widzę to działasz na kopii obiektu klasy player i wczytując stan gry ustawiasz hp tylko dla tej kopii. Lepiej użyj wskaźnika na klasę Player.
P-138277
Salin
Temat założony przez niniejszego użytkownika
» 2015-10-08 17:57:01
Huh wskaźniki? Nigdy wcześniej tego nie używałem i nie jestem pewny jak mam to do końca zastosować, żeby obydwa obiekty klasy player miały ten sam adres w pamięci. Robię sobie coś takiego:
C/C++
#include <fstream>
#include "Player.h"

using namespace std;

class Save
{
public:
    Save();
    ~Save();
   
    bool zapisz();
    bool wczytaj();
   
   
protected:
    fstream zapis;
   
    Player player;
    Player * wsk_player = & player;
   
};

I w klasie Engine robię coś podobnego, mianowicie:

C/C++
#pragma once

#include "Player.h"
#include "Save.h"

class Engine
{
public:
    Engine();
    ~Engine();
   
    void runEngine();
protected:
    Save zapis;
    Player player;
    Player * wsk_player = & player;
   
};

Czy byłby ktoś tak dobry i pomógł mi to napisać?

P-138283
michal11
» 2015-10-08 18:15:43
pozamieniaj
C/C++
Engine::Engine()
{
    if( zapis.wczytaj( player ) == false )


C/C++
class Save
{
public:
    Save();
    ~Save();
   
    bool zapisz();
    bool wczytaj( Player & player );
   
   
protected:
    fstream zapis;
};

C/C++
bool Save::wczytaj( Player & player ) {
    float test = 2;
    zapis.open( "Profile.save", ios::in );
    if( zapis.good() )
    {
        zapis >> test;
        player.setHealth( test );
        zapis.close();
        return true;
    }
    else {
        zapis.close();
        return false;
    }
}
P-138284
Salin
Temat założony przez niniejszego użytkownika
» 2015-10-08 18:32:54
SUPER! Właśnie o to mi chodziło. :D Dziękuje wszystkim ślicznie za pomoc.
Temat zamykam.
P-138285
« 1 »
  Strona 1 z 1