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

1

11.04.2011, 14:20

Verständnisproblem bei Funktion in SFML

Hallo Leute,

ich versuche mich gerade in SFML einzuarbeiten.
Habe mal den Vorlagen Quelltext vom Sprite-Tutorial verändert und die Bewegungsroutinen in die Funktion moveShip() gekapselt.

Ich erhalte immer die Fehlermeldung:

"error: 'moveShip' was not declared in this scope"

Ich muss wahrscheinlich die Basisklasse die die Funktion beinhaltet angeben, aber welche Klasse soll das sein?

Kann mir bitte jemand erklären was ich falsch mache bzw. wie man eigene Funktionen in SFML einbaut.
Ich glaube, ich habe ein grundlegendes Verständnisproblem, bitte helft?!? ?(


Gruß, NEUMee

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
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Graphics.hpp>


////////////////////////////////////////////////////////////
/// Entry point of application
///
/// \return Application exit code
///
////////////////////////////////////////////////////////////



int main()
{
    // Create the main rendering window
    sf::RenderWindow App(sf::VideoMode(1024, 768, 32), "SFML Graphics");

    // Load the sprite image from a file
    sf::Image Image;
    if (!Image.LoadFromFile("fighter.png"))
        return EXIT_FAILURE;

    // Create the sprite
    sf::Sprite Sprite(Image);

    // Change its properties
    //Sprite.SetColor(sf::Color(0, 255, 255, 128));
    Sprite.SetPosition(200.f, 100.f);
    Sprite.SetScale(0.3f, 0.3f);

    // Start game loop
    while (App.IsOpened())
    {
        // Process events
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                App.Close();
        }

        moveShip(App, 100, Sprite);

        // Clear screen
        App.Clear();

        // Display sprite in our window
        App.Draw(Sprite);

        // Display window contents on screen
        App.Display();
    }

    return EXIT_SUCCESS;
}


void moveShip(sf::RenderWindow w, int speed, sf::Sprite s)
{
    float ElapsedTime = w.GetFrameTime();

    if (w.GetInput().IsKeyDown(sf::Key::Left))  s.Move(-speed * ElapsedTime, 0);
    if (w.GetInput().IsKeyDown(sf::Key::Right)) s.Move( speed * ElapsedTime, 0);
    if (w.GetInput().IsKeyDown(sf::Key::Up))    s.Move(0, -speed * ElapsedTime);
    if (w.GetInput().IsKeyDown(sf::Key::Down))  s.Move(0,  speed * ElapsedTime);

    if (w.GetInput().IsKeyDown(sf::Key::Add))   s.Rotate(- 100 * ElapsedTime);
    if (w.GetInput().IsKeyDown(sf::Key::Subtract)) s.Rotate(+ 100 * ElapsedTime);
}

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

11.04.2011, 14:29

Du musst moveShip vor main() deklarieren. Füge die Zeile ein:
void moveShip(sf::RenderWindow w, int speed, sf::Sprite s);

3

11.04.2011, 15:06

Hab ich gemacht, es kommen neue Fehlermeldungen:

Zitat

||=== SFML_Test, Debug ===|
C:\Programme\SFML-1.6\include\SFML\System\NonCopyable.hpp|57|error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)' is private|
C:\Programme\SFML-1.6\include\SFML\Window\Window.hpp|56|error: within this context|
C:\Programme\SFML-1.6\include\SFML\System\NonCopyable.hpp|57|error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)' is private|
C:\Programme\SFML-1.6\include\SFML\Window\Input.hpp|45|error: within this context|
C:\Programme\SFML-1.6\include\SFML\Window\Window.hpp|56|note: synthesized method 'sf::Input::Input(const sf::Input&)' first required here |
C:\Programme\SFML-1.6\include\SFML\Graphics\RenderWindow.hpp|46|note: synthesized method 'sf::Window::Window(const sf::Window&)' first required here |
C:\Dokumente und Einstellungen\neuma\Eigene Dateien\C++\SFML_Test\main.cpp||In function 'int main()':|
C:\Dokumente und Einstellungen\neuma\Eigene Dateien\C++\SFML_Test\main.cpp|47|note: synthesized method 'sf::RenderWindow::RenderWindow(const sf::RenderWindow&)' first required here |
C:\Dokumente und Einstellungen\neuma\Eigene Dateien\C++\SFML_Test\main.cpp|47|error: initializing argument 1 of 'void moveShip(sf::RenderWindow, int, sf::Sprite)'|
||=== Build finished: 5 errors, 0 warnings ===|


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

11.04.2011, 15:54

dir fehlen ne ganze menge grundlagen. wenn du C++ lernen willst solltest du dir ein einführendes buch kaufen und es durcharbeiten bevor du mit der sfml anfängst. tutorials bringen dir bei einer so komplexen sprache nichts.
falls du schon eine andere sprache beherrschst kannst du dir auch gleich ein nachschlagewerk wie das zulegen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »NachoMan« (11.04.2011, 16:07)


5

11.04.2011, 16:14

???
Nun ja, bin ein sogenannter Quereinsteiger und hab lange nichts mit C++ gemacht.
In den letzten Jahren musste ich in Delphi programmieren.

Ich glaub ich bastel mir ne eigene Klasse für mein Ship und mach mach die Funktion als öffentliche Klassenmethode.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

11.04.2011, 16:18

dann solltest du die grundlagen auffrischen^^ ein nachschlagewerk lohnt sich auch wenn du viel erfahrung mit anderen programmiersprachen hast.
der zweite fehler kommt weil du versuchst das RenderWindow zu kopieren(call by value). du musst einfach nur eine referenz übergeben um das problem zu beheben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BLU3 L30PARD

Treue Seele

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

7

11.04.2011, 16:24

du musst vor das "w" noch ein "&" setzen ;)

C-/C++-Quelltext

1
void moveShip(sf::RenderWindow &w, int speed, sf::Sprite s)

Außerdem würde ich mir für "ship" ne eigene Klasse bauen, mit der du z.B. "MoveLeft()" etc.
aufrufen kannst ;)

// Edit: Sorry, das mit der Klasse kannst du streichen, hast du ja oben schon selbst gesagt :D

8

13.04.2011, 07:29

So, hab jetzt mal ne Klasse CStarship angelegt:

starship.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class CStarship
{
    private:
        sf::Sprite sprite;
    public:
        CStarship();
        void Load();
        void Draw(sf::RenderWindow &app);
};


starship.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
#include <iostream>
#include <SFML/Graphics.hpp>

#include "starship.h"

CStarship::CStarship()
{
    sprite.SetX(10);
    sprite.SetY(10);
};

void CStarship::Load()
{
    sf::Image image;
    image.LoadFromFile("fighter.png");
    sprite.SetImage(image);
    sprite.Scale(0.3f,0.3f);
};

void CStarship::Draw(sf::RenderWindow &app)
{
    app.Draw(sprite);

    // Move the sprite
    if (app.GetInput().IsKeyDown(sf::Key::Left))  sprite.Move(-200 * app.GetFrameTime(), 0);
    if (app.GetInput().IsKeyDown(sf::Key::Right)) sprite.Move( 200 * app.GetFrameTime(), 0);
    if (app.GetInput().IsKeyDown(sf::Key::Up))  sprite.Move(0, -200 * app.GetFrameTime());
    if (app.GetInput().IsKeyDown(sf::Key::Down))  sprite.Move(0,  200 * app.GetFrameTime());
};


Und erstelle in der main.cpp meinen Fighter:

main.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
#include <SFML/Graphics.hpp>
#include "starship.h"

int main()
{
    sf::RenderWindow App(sf::VideoMode(800, 600, 32), "Game Window");
    CStarship fighter;

    fighter.Load();

    while(App.IsOpened())
    {
        sf::Event mainEvent;
        while(App.GetEvent(mainEvent))
        {
            if(mainEvent.Type == sf::Event::Closed)
            {
                App.Close();
            }
        }

        App.Clear(sf::Color(0,0,0));
        fighter.Draw(App);
        App.Display();
    }

    return 0;
}


Leider wird aber anstatt des Sprites nur ein weißes Viereck dargestellt. Könnt ihr mir sagen, was ich falsch mache?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

13.04.2011, 08:24

am ende der load methode wird das image wieder freigegeben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

10

13.04.2011, 09:53

Hallo NachoMan,

habe das Problem mit einem MemberImage sf::Image m_img gelöst. Ich speichere das m_img in der Load-Methode und rufe es in der Draw-Methode auf. Ist die Vorgehensweise OK, oder gibt es Verbesserungsvorschläge?
Übrigens: das Forum ist spitze, so schnelle und kompetente Hilfe habe ich in anderen Foren nur selten erfahren.

Vielen Dank...

starship.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
class CStarship
{
    private:
        sf::Sprite sprite;
        sf::Image m_img;
    public:
        CStarship();
        void Load();
        void Draw(sf::RenderWindow &app);
};


starship.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
#include <iostream>
#include <SFML/Graphics.hpp>

#include "starship.h"

CStarship::CStarship()
{
    sprite.SetX(10);
    sprite.SetY(10);
};

void CStarship::Load()
{
    sf::Image image;
    image.LoadFromFile("fighter.png");
    sprite.SetImage(image);
    sprite.Scale(0.2f,0.2f);
    this->m_img=image;

};

void CStarship::Draw(sf::RenderWindow &app)
{
    sprite.SetImage(this->m_img);
    app.Draw(sprite);

    // Move the sprite
    if (app.GetInput().IsKeyDown(sf::Key::Left))  sprite.Move(-200 * app.GetFrameTime(), 0);
    if (app.GetInput().IsKeyDown(sf::Key::Right)) sprite.Move( 200 * app.GetFrameTime(), 0);
    if (app.GetInput().IsKeyDown(sf::Key::Up))  sprite.Move(0, -200 * app.GetFrameTime());
    if (app.GetInput().IsKeyDown(sf::Key::Down))  sprite.Move(0,  200 * app.GetFrameTime());
};

Werbeanzeige