Hallo,
ich möchte gerne 2 Klassen (CGame und CIntro) zusammen verbinden, so das ich ohne viel getue und übergeben in der Main-Funktion die CGame Klasse voll in der CIntro Klasse verwenden kann.
Ich hoffe ich habe es richtig erklärt, ich selber kann es nämlich nicht besser erklären
Ich werde mal die entsprechenden Codezeilen posten:
Game.h
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#ifndef _GAME_h
#define _GAME_h
#include "AllHeaders.h"
class CIntro;
class CGame
{
protected:
sf::RenderWindow MainWindow;
sf::Event Event;
int State;
bool Running;
//CIntro
CIntro Intro;
public:
//InitFunktion
void InitGame(int Height, int Width, int Colour);
///
sf::Font MyFont;
sf::String Text;
///
//Die 3 Spielzustände
//IntroState ( 1 )
void IntroState(void);
//MenueState ( 2 )
void MenueState(void);
//MainState ( 3 )
void MainState(void);
//Instanz von sich selbst
static CGame* Instance()
{
return &i_CGame;
}
//Methoden für State
//Methode um Spielzustand zu bekommen
int CurrentState(void)
{
return this->State;
};
//Methode um Spielzustand zu erhöhen
void NextState(void)
{
if (this->State == 3)
this->State = 1;
else if (this->State == 1)
this->State = 2;
else if (this->State == 2)
this->State = 3;
};
//Methode um Spielzustand zu senken
void PreviousState(void)
{
if(this->State == 1)
this->State = 3;
else if (this->State == 3)
this->State = 2;
else if (this->State == 2)
this->State = 1;
};
//Methode um Spielzustand seperat zu ändern
// 1 = Introstate
// 2 = Menuestate
// 3 = Mainstate
void ChangeState(int NewState)
{
if (NewState > 0 && NewState < 4)
this->State = NewState;
};
//Methode um herrauszufinden, ob Game läuft
bool IsRunning(void)
{
return this->Running;
};
private:
static CGame i_CGame;
};
#endif
|
Entsprechender Teil von Game.cpp
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
void CGame::IntroState()
{
//Wichtige Zeile, um die es sich handelt.
//Wichtige Zeile, um die es sich handelt.
//Wichtige Zeile, um die es sich handelt.
this->Intro.Init(&CGame::Instance);
//Wichtige Zeile, um die es sich handelt.
//Wichtige Zeile, um die es sich handelt.
//Wichtige Zeile, um die es sich handelt.
while (this->CurrentState() == 1)
{
if (this->MainWindow.GetEvent(this->Event))
{
if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::N))
this->NextState();
if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::P))
this->PreviousState();
}
if (this->MainWindow.GetInput().IsKeyDown(sf::Key::Escape))
{
this->Running = false;
}
this->MainWindow.Draw(this->Text);
this->MainWindow.Display();
this->MainWindow.Clear();
}
}
|
und Intro.h
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#ifndef _INTRO_h
#define _INTRO_h
#include "AllHeaders.h"
class CGame;
class CIntro
{
public:
//InitMethode für IntroState
void Init(CGame* Game);
//CalculateMethode für Introstate
void Calculate();
//RenderMethode für Introstate
void Render();
};
#endif
|
sowie Intro.cpp
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
#include "AllHeaders.h"
void CIntro::Init(CGame* Game)
{
std::cout<<"Spielzustand: Intro\n";
//
Game->Text.SetText("Intro");
//
}
|
Wie man sieht habe ich bisher versucht das ganze via übergebe einer Instanz von CGame zu übergeben. Leider hat es nicht geklappt.
Ich möchte das ganze noch einmal genauer erklären:
Ich möchte gerne, dass "CGame::CIntro" Funktionen verwenden kann, die CIntro inne hat. Aber leider muss sie auch CGame und seine Methoden benutzen muss. Ich möchte im grunde beide Klassen behandeln als ob es eine ist
Ich hoffe ich konnte es gut genug erklären und hoffe um Hilfe oder Anregungen zu diesem Problem.
Mein bisheriger Stand ist, dass ich das ganze mit dieser schon erwähnten Instanz versuche, aber leider bekomme ich folgenden Fehler:
|
Quellcode
|
1
2
|
1>.\Game.cpp(25) : error C2664: 'CIntro::Init': Konvertierung des Parameters 1 von 'CGame *(__cdecl *)(void)' in 'CGame *' nicht möglich
1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
|
MfG
Tarliotama