Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Delta

Frischling

  • »Delta« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Österreich

  • Private Nachricht senden

1

24.12.2014, 11:36

C++ Syntqaxfehler 2146 bei Klassen. Bitte um Hilfe

Hallo, Guten Morgen sowie Frohe Weihnachten.

Ich habe mich nach langer Zeit wieder dazu entschlossen ein angefangenes Projekt neu zu strukturieren.
Das habe ich dann in Klassen aufgeteilt sowie ich es mir nach 2 Tutorials gerichtet habe.

Nun versuche ich das Gamepaddle im Code neu zu definieren und vorallem sauberer.
Ich wollte in der Game.h die eine andere Klasse einbeziehen aber das Problem ist ich erhalte dann den C2146 Syntaxfehler sowie den C4430 aufgrund fehlenden Bezeichners.

Hier gebe ich den Gesammeten aufgeräumten Code an

Verwendet wird SFML

main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include "framework.hpp"

int main()
{
    Framework frmwrk;

    frmwrk.Run();

    return 0;
}



framework.hpp

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
#ifndef FRAMEWORK_HPP
#define FRAMEWORK_HPP

#include <iostream>
#include <memory>
#include "SFML/Graphics.hpp"

#include "gamestate.hpp"
#include "paddle.h"
#include "game.hpp"

class Framework {

    public:
        Framework();
        ~Framework();

        void Run();
        void SetQuit() { mRun = false; }

        sf::RenderWindow    Renderwindow;


    private:

        std::unique_ptr<GameState> currentState;

        void WindowBorder();

        bool mRun;
        void Quit();
        void HandleEvents();
        void Update(float frametime);
        void Render();

        sf::Event   MainEvent;

        float mFrametime;
        float GetFrametime();

        sf::Clock           Clock;
};





#endif // !FRAMEWORK_HPP


framework.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
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "framework.hpp"

Framework::Framework()
{
    Renderwindow.create(sf::VideoMode(800, 600, 32), "GAMETITLE", sf::Style::Default);
    currentState = std::move(std::unique_ptr<Game>(new Game(*this)));
    //Renderwindow.setMouseCursorVisible(true);
    Clock.restart();
    mRun = true;
}

Framework::~Framework()
{

}

void Framework::Run()
{
    while (mRun)
    {
        HandleEvents();
        Update(GetFrametime());
        Render();
    }

    Quit();
    

}

void Framework::Quit()
{
    if (!mRun)
    {
        Renderwindow.close();
    }


}

void Framework::HandleEvents()
{
    
    while (Renderwindow.pollEvent(MainEvent))
    {
        currentState->HandleEvents(*this, MainEvent);
        if (MainEvent.type == sf::Event::Closed)
            mRun = false;
    }


    // Fenster mit Mausrad-Klick oder Escape beenden
    if (MainEvent.type == sf::Event::MouseButtonReleased)
    {
        if (MainEvent.mouseButton.button == 2)
        {
            mRun = false;
        }
    }

    if (MainEvent.type == sf::Event::KeyReleased)
    {
        if (MainEvent.key.code == sf::Keyboard::Escape)
        {
            mRun = false;
        }
    }
}



void Framework::Update(float frametime)
{
    WindowBorder();
    currentState->Update(*this, frametime);
}

void Framework::Render()
{
    Renderwindow.clear(sf::Color(0, 0, 0));
    currentState->Render(*this);
    Renderwindow.display();
}

float Framework::GetFrametime()
{
    mFrametime = Clock.getElapsedTime().asSeconds();
    Clock.restart();
    return mFrametime;
}

//Mouse im Fenster gefangen halten.
void Framework::WindowBorder(){

    if (sf::Mouse::getPosition(Renderwindow).x <= 10)
    {
        sf::Mouse::setPosition(sf::Vector2i(10, sf::Mouse::getPosition(Renderwindow).y), Renderwindow);
    }

    if (sf::Mouse::getPosition(Renderwindow).x >= Renderwindow.getSize().x -10)
    {
        sf::Mouse::setPosition(sf::Vector2i(Renderwindow.getSize().x - 10, sf::Mouse::getPosition(Renderwindow).y), Renderwindow);
    }

    if (sf::Mouse::getPosition(Renderwindow).y <= 10)
    {
        sf::Mouse::setPosition(sf::Vector2i(sf::Mouse::getPosition(Renderwindow).x, 10), Renderwindow);
    }

    if (sf::Mouse::getPosition(Renderwindow).y >= Renderwindow.getSize().y - 10)
    {
        sf::Mouse::setPosition(sf::Vector2i(sf::Mouse::getPosition(Renderwindow).x, Renderwindow.getSize().y - 10), Renderwindow);
    }

}


gamestate.hpp

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
#ifndef GAMESTATE_HPP
#define GAMESTATE_HPP

class Framework;

class GameState
{

public:

    virtual void HandleEvents(Framework &framework, sf::Event events) = 0;
    virtual void Update(Framework &framework, float frametime) = 0;
    virtual void Render(Framework &framework) = 0;
    virtual      ~GameState() {};

private:


};


#endif // !GAMESTATE_HPP


game.hpp

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
#ifndef GAME_HPP
#define GAME_HPP

#include "framework.hpp"

class Game : public GameState
{

public:
    Game(Framework &framework);
    ~Game();

    void HandleEvents(Framework &framework, sf::Event events);
    void Update(Framework &framework, float frametime);
    void Render(Framework &framework);

private:    

    //Paddle mPaddle; // <-- Syntaxfehler
};


#endif


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
#include "game.hpp"


Game::Game(Framework &framework)
{
    // Mouse Unsichtbar machen
    framework.Renderwindow.setMouseCursorVisible(true);
}

Game::~Game()
{
}

void Game::HandleEvents(Framework &framework, sf::Event events)
{
    Paddle mPaddle;
    mPaddle.HandleEvents(framework, events);

}
void Game::Update(Framework &framework, float frametime)
{
    Paddle mPaddle;
    mPaddle.Update(framework, frametime);
}

void Game::Render(Framework &framework)
{   
    Paddle mPaddle;
    mPaddle.Render(framework);
    
}


paddle.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
#ifndef PADDLE_HPP
#define PADDLE_HPP

#include "framework.hpp"

class Paddle
{

public:

    Paddle();
    ~Paddle();

    void HandleEvents(Framework &framework, sf::Event events);
    void Update(Framework &framework, float frametime);
    void Render(Framework &framework);

private:

    sf::Font mFont;
    sf::Text mText;

};
#endif // !PADDLE_HPP


paddle.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
#include "paddle.h"

Paddle::Paddle(){

    mFont.loadFromFile("assets/fnt/TektonPro-BoldExt.otf");

    mText.setFont(mFont);
    mText.setPosition(sf::Vector2f(200.0f, 100.0f));
    mText.setColor(sf::Color::Green);
    mText.setString("TEST");


}

Paddle::~Paddle(){

}


void Paddle::HandleEvents(Framework &framework, sf::Event events){

}

void Paddle::Update(Framework &framework, float frametime){

}

void Paddle::Render(Framework &framework){
    framework.Renderwindow.draw(mText);
}


Versucht wurde in der game.hpp sowie cpp das Paddle für den Boden einzubauen.

Mache ich es so wie es momentan ist, ist es sichbar, und funktioniert sowie wenn ich "Paddle mPaddle" im Globalen Gültigkeitsbereich angebe.
Das ist jedoch nicht empfohlen.

Was habe ich übersehen oder falsch gemacht?
Ich danke für jede Hilfe.

MFG Delta

2

24.12.2014, 12:07

Wär schon wenn du sagen könntest, wo denn der Fehler auftritt und was der Kompiler neben der Nummer noch so ausspuckt ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

24.12.2014, 12:51

Was ich sehr unhübsch finde ist zunächst mal die zyklische Abhängigkeit von Game, Gamestate und Framework. Das ist mit Garantie überflüssig. Mit Worten ausgedrückt steht da: Das Game ist ein Teil des Frameworks und das Framework ist ein Teil des Games. Die Gamestates sind Teil des Frameworks und das Framework ein Teil der Gamestates. Klingt nach einem Henne-Ei-Problem. Das Spiel sollte auch nicht von Spielzustand erben. Ein Spiel hat vermutlich viele Zustände, ist selbst aber kein Zustand.
Aus meiner Sicht sind das Game und die Gamestates ein Teil des Frameworks.

Weiter kann man kaum was dazu sagen, siehe Antwort von Roflo.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (24.12.2014, 12:59)


Delta

Frischling

  • »Delta« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Österreich

  • Private Nachricht senden

4

24.12.2014, 12:58

Ich lasse mich mit dem Hobby und dem Freizeitprojekt gern verbessern ich hab mich da in erster hinsicht an die Tutorials gehalten

hier der Log aus dem Compiler

Zitat

1>------ Erstellen gestartet: Projekt: DXBALL1, Konfiguration: Release Win32 ------
1> framework.cpp
1>framework.cpp(100): warning C4018: '>=': Konflikt zwischen 'signed' und 'unsigned'
1>framework.cpp(110): warning C4018: '>=': Konflikt zwischen 'signed' und 'unsigned'
1> game.cpp
1> main.cpp
1> paddle.cpp
1>c:\users\delta\documents\visual studio 2013\projects\dxball1\dxball1\game.hpp(19): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'mPaddle'
1>c:\users\delta\documents\visual studio 2013\projects\dxball1\dxball1\game.hpp(19): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========

MFG Delta

€dit:
Falls Fragen aufkommen welche Tutorials:

https://www.youtube.com/playlist?list=PL…N_1OzPgY19DazaE
https://www.youtube.com/playlist?list=PL…tanKeRf4nAknIhw

Sind in diesem Projekt sicherlich vermischt und darum etwas unhübsch, lasse mich wie gesagt gerne verbessern.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Delta« (24.12.2014, 13:06)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

24.12.2014, 13:01

Du inkludierst nirgends in game.hpp die paddle.h. (die sollte außerdem paddle.hpp heißen)
Sie ist zwar theoretisch in framework.hpp inkludiert, aber durch Deine zyklischen Abhängigkeiten der Header und der Include-Guards wird es nicht rein geladen. Ich würde Dir empfehlen das alles so aufzuräumen, dass sich keine zyklischen Includes bilden. Ansonsten hast Du viel Spaß beim Umsortieren der Header-Reihenfolgen und irgendwann geht gar nichts mehr.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Delta

Frischling

  • »Delta« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Österreich

  • Private Nachricht senden

6

24.12.2014, 13:11

Da is mein Edit wohl zu spät gekommen.

Darf ich jetzt mal blöd fragen wie du es mir vorschlägst mit den Abhängigkeiten (includes)?
Ich probiere bereits herum und versuche sie sinnvoller einzusetzen, aber bisher bekomme ich dann bei einer Änderung sofort Fehler ende nie.

Danke für deine Geduld.

MFG

€dit:
Der Hinweis mit dem include in die game.hpp sowie die Namensänderung wurden durchgeführt.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Delta« (24.12.2014, 13:16)


7

24.12.2014, 13:51

Kleiner Denkanstoss:

C-/C++-Quelltext

1
2
3
void Paddle::Render(Framework &framework){
    framework.Renderwindow.draw(mText);
}

Diese Funktion brauch nicht dein Framework Klasse um etwas zu rendern.

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Delta

Frischling

  • »Delta« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Österreich

  • Private Nachricht senden

8

24.12.2014, 14:53

Soweit ich bisher zurückverfolgen konnte erspart mir das die arbeit in die Paddle.cpp ein extra renderwindow zu erzeugen oder worauf willst du hinaus?

MFG

9

24.12.2014, 18:50

Lass es mich mal so ausdrücken. Du übergingst der Funktion als Parameter ein Auto benötigst aber nur ein Reifen.
Einfach mal drübernach denken und dann kommst schon drauf worauf ich hinaus will.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Delta

Frischling

  • »Delta« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Österreich

  • Private Nachricht senden

10

24.12.2014, 21:03

Verstehe es so gesehen ja, aber nicht wie ich das realisieren soll, vom eigentlichen Problem abgesehen.

Scheine noch ne Menge lernen zu müssen für das Hobby

MFG

Werbeanzeige