ehhh...Ogólnie pisze prosty silnik/interpreter gier/skryptów , na standardowe wyjścia. Przy tym problemie wcześniejsze to pikuś. Po każdej zmianie w kodzie sprawdzam, czy to co ma działać działa. Program się kompiluje, jednak przy uruchomieniu wyrzuca mi że w stringu wychodze po za zasięg. Debugując ( step into itd. w vc++) wywala mi błąd przy i = 5 w funkcji changestring()
plik mainscript.sc:
write "Hello gamer"
plik main.cpp
#include "game.h"
#include "resources.h"
#include <conio.h>
using namespace std;
void main()
{
game gra; // tworzy główny obiekt
getch();
}
game.h
#pragma once
#include "resources.h"
#include <string>
using namespace std;
class game
{
private:
enum state { start = 0, ingame = 3, end = 4, paused = 5}; // później posprzątam, mały bałagan koncpecyjny
state stan;
resources ms;
public:
game(void);
void gingame();
void gpause();
~game(void);
};
game.cpp
#include "game.h"
#include <string>
game::game(void)
{
game::stan = start;
gingame();
}
game::~game(void)
{
game::stan = end;
}
void game::gpause()
{
game::stan = paused;
}
void game::gingame()
{
game::stan = ingame;
while(!ms.msfile.eof())// sprawdza czy plik się skończył
{
ms.nextline();//odpala interpratacje kolejnej lini w pliku
}
}
resources.h
#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include "scriptline.h"
using namespace std;
class resources
{
public:
int line; // numer lini.przyda się później przy odniesieniach
string activeline; // później usune, chwilowo zmienna pomocnicza
scriptline active; // aktywna linia
ifstream msfile; // strumień głównego skryptu
void interpretuj();
void nextline();
resources(void);
~resources(void);
};
resources.cpp
#include "resources.h"
#include <iostream>
resources::resources(void)
{
msfile.open("mainscript.sc");
line = 0;
}
resources::~resources(void)
{
}
void resources::nextline()
{
this->line = this->line + 1; // zwiększa numer lini
getline(msfile,activeline); // pobiera aktywną linie do pliku pomocniczego
active.changestring(activeline); // ładuje linie do scriptline, aby podzielił ją na wyrażenia
interpretuj();
}
void resources::interpretuj(){
if (active.words[0] == "write")
{
cout << active.words[1] << endl;
}
}
scriptline.h
#pragma once
#include <string>
#include <vector>
using namespace std;
class scriptline
{
public:
string scline; // zawiera całą linie, może będe potrzebować
vector<string> words; // wektor ze słowami
scriptline(void);
void changestring(string line); // aktualizacja obiektu
~scriptline(void);
};
scriptline.cpp
#include "scriptline.h"
scriptline::scriptline()
{
}
scriptline::~scriptline(void)
{
}
void scriptline::changestring(string line)
{
scline = line;
string tmp;
unsigned int i = 0; // licznik zewn., łatwiej mi było wyobrazić sobie to na pętli while
while (i<line.length())
{
if (line[i] == '"') // jeśli jest w cydzosłowach to co między nimi ma trafić jaką jeden element wektora ( jako np. pojedynczy parametr komendy)
{
i++;
while (line[i]!= '"')
{
tmp = tmp + line[i]; // dadajemy znaki do tmp , póki nie spotkamy cudzysłowiu
i++;
}
words.push_back(tmp); // dodajemy na końcu wektora nasz łańcuch
tmp.clear(); // czyścimy tymczasowy string
}
else
{
while(line[i] != ' ') // co spacje kolejne słowo
{
tmp = tmp + line[i];
i++;
}
words.push_back(tmp);
tmp.clear();
i++;
}
}
}