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: 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: 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. |
|
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. |
|
Salin Temat założony przez niniejszego użytkownika |
» 2015-10-08 15:10:21 Już wklejam. #include "Engine.h"
int main() { Engine eng; eng.runEngine(); return EXIT_SUCCESS; }
#pragma once
#include "Player.h" #include "Save.h"
class Engine { public: Engine(); ~Engine(); void runEngine(); protected: Save zapis; Player player; };
#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; }
#pragma once
using namespace std;
class Player { public: Player(); ~Player(); float getHealth(); void addHealth( float add ); void setHealth( float set ); private: float health; };
#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; }
#include <fstream> #include "Player.h"
using namespace std;
class Save { public: Save(); ~Save(); bool zapisz(); bool wczytaj(); protected: fstream zapis; Player player; };
#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; } }
|
|
Lora |
» 2015-10-08 16:00:51 class Save { public: Save(); ~Save(); bool zapisz(); bool wczytaj(); protected: fstream zapis; Player player; };
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. |
|
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: #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: #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ć? |
|
michal11 |
» 2015-10-08 18:15:43 pozamieniaj Engine::Engine() { if( zapis.wczytaj( player ) == false ) class Save { public: Save(); ~Save(); bool zapisz(); bool wczytaj( Player & player ); protected: fstream zapis; };
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; } }
|
|
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. |
|
« 1 » |