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

Kitarios

Frischling

  • »Kitarios« ist der Autor dieses Themas

Beiträge: 2

Beruf: Student

  • Private Nachricht senden

1

09.05.2013, 23:42

C++ Problem mit Header-Mehrfacheinbindungen in Code::Blocks

Guten Abend,

ich bringe mir derzeit den Umgang mit SFML bei und
wollte zur Übung ein Snakespiel mit C++ und Code::Blocks umsetzten. Ich
möchte das ganze mittels einer Tilemap erstellen, auf der sich die
Schlange bewegt. Die Schlange selbst besteht aus einzelnen Segmenten,
den "Körperteilen" der Schlange. Ich versuche es so umzusetzen, dass ich
in meiner Main-Methode unterschiedliche Schlangen anlegen kann, die
mittels for-Schleife ihre Segmente abarbeiten. Dabei muss ich die
Dateien für meine Tilemap mehrfach einbinden, da ich diese im gesamten
Projekt nutze. Die Datei SnakeBody.h benötige ich sowohl in
Snakebody.cpp als auch in Snake.h bzw. Snake.cpp, da die Schlange ein
Array aus SnakeBodies besitzt. Zunächste bekam ich Fehlermeldungen, dass
die Header mehrfach definiert würde. Auf ein paar Websiten habe ich von
Headerguards gelesen und diese in meinem Projekt benutzt. Leider
erhalte ich immer noch folgende Fehlermeldungen, die erscheinen, sobald
ich eine Instanz der Klasse Snake erzeugen möchte.


(Link)


Die
bisherigen Themen, die ich im Forum gefunden habe, konnten mir nicht
weiterhelfen. Da die Headerguards für mich neu sind, befürchte ich,
damit einen Fehler gemacht zu haben. Eventuell ist es auch ein Problem
von Code::Blocks.

Wer mir weiterhelfen kann, der soll dies bitte tun. Ich muss das ganze sonst auf Eis legen :/

Vielen Dank jetzt schonmal!


Übersicht über Projektdateien:

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
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
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Tilemap.h"
#include "Snake.h"


int main()
{
    //variables
    char direction = 'u';
    int WIDTH = 800, HEIGHT = 600;

    CTilemap hintergrund(20,15);

    // create the window
    sf::RenderWindow window(sf::VideoMode(WIDTH, HEIGHT), "Snake", sf::Style::Titlebar | sf::Style::Close);
    window.setVerticalSyncEnabled(true);

    //game objects
    CSnake blueSnake(10,7,hintergrund);

    //time objects
    sf::Clock clock;
    sf::Time elapsedTime;

    // run the program as long as the window is open
    while (window.isOpen())
    {
        // check all the window's events that were triggered since the last iteration of the loop
        sf::Event event;
        while (window.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
                std::cout << "Window closed!" << std::endl;
                window.close();

            case sf::Event::KeyPressed:
                switch (event.key.code)
                {
                case sf::Keyboard::Up:
                    direction = 'u';
                    break;
                case sf::Keyboard::Down:
                    direction = 'd';
                    break;
                case sf::Keyboard::Left:
                    direction = 'l';
                    break;
                case sf::Keyboard::Right:
                    direction = 'r';
                    break;
                default:
                    break;
                }
            default:
                break;
            }
        }
        //time since last frame
        if ((elapsedTime += clock.restart() )>= sf::seconds(1))
        {
            elapsedTime -= sf::seconds(1);
            blueSnake.updateSnake(direction);

        }

        //check collision


        // clear the window with black color
        window.clear(sf::Color::White);

        // drawing objects
        // window.draw(bg);


        //draw the tilemap
        sf::RenderTexture rt;
        rt.create(800,600);
        hintergrund.drawTilemap(rt);
        sf::Sprite hg(rt.getTexture());
        window.draw(hg);

        // end the current frame
        window.display();
    }


    return 0;
}


Snake.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
#ifndef SNAKE_H
#define SNAKE_H

#include "SnakeBody.h"
#include "Tilemap.h"



class CSnake
{
private:
    int points;
    bool living;
    CSnakeBody body[20];
    int length;

public:
    CSnake(int headX, int headY, CTilemap &tm);
    void updateSnake(char d);
};

#endif


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

#ifndef TILEMAP_H
#define TILEMAP_H

CSnake::CSnake(int headX, int headY, CTilemap &t)
{
    length = 1;
    points = 0;
    living = true;
    CSnakeBody.setTilemap(t);
    body[0].CSnakeBody(headX,headY,0,0);

}

void CSnake::updateSnake(char d)
{
    switch (d)
    {
    case 'u':
        body[0].updateSnakeBody(body[0].getX(),body[0].getY()-1);
        for (int i = 0; i < length; i++)
        {
            body[i].updateSnakeBody(body[i-1].getX(),body[i-1].getY());
        }
    }
}
#endif


SnakeBody.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 SNAKEBODY_H
#define SNAKEBODY_H

#include "Tilemap.h"

class CSnakeBody
{
private:
    int xPos;
    int yPos;
    int xPosNext;
    int yPosNext;
    static CTilemap &tm;

public:
    CSnakeBody(int x, int y, int nextX, int nextY);
    void updateSnakeBody(int nextX, int nextY);
    void fillTilemap(int x, int y, int value);
    void setTilemap(CTilemap &t);
    int getX();
    int getY();
};

#endif


SnakeBody.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
#include "SnakeBody.h"
#ifndef TILEMAP_H
#define TILEMAP_H


CSnakeBody::CSnakeBody(int x, int y, int nextX, int nextY)
{
    xPos = x;
    yPos = y;
    xPosNext = nextX;
    yPosNext = nextY;
    setTilemap(x,y,2);
}

void CSnakeBody::updateSnakeBody(int nextX, int nextY)
{
    setTilemap(xPos, yPos, 0);
    xPos = nextX;
    yPos = nextY;
    xPosNext = nextX;
    yPosNext = nextY;
    setTilemap(xPos, yPos, 2);
}

void CSnakeBody::fillTilemap(int x, int y, int value)
{
    tm.fillTilemap(x,y,value);
}

void CSnakeBody::setTilemap(CTilemap &t)
{
    tm = t;
}

int getX()
{
    return xPos;
}

int getY()
{
    return yPos;
}
#endif


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

#ifndef TILEMAP_H
#define TILEMAP_H

class CTilemap
{
private:
int rows = 15;
int columns = 20;
int field[15][20];
sf::RectangleShape snakeHead;

public:
CTilemap(int rows, int columns);
int getRows();
int getColumns();
void fillTilemap(int row, int column, int content);
void drawTilemap(sf::RenderTexture &rt);
};
#endif





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

CTilemap::CTilemap(int columns, int rows)
{
    for (int i = 0; i < columns; i++)
    {
        for (int j = 0; j < rows; j++)
            field[i][j] = 0;
    }
}

int CTilemap::getRows()
{
    return rows;
}

int CTilemap::getColumns()
{
    return columns;
}

void CTilemap::fillTilemap(int column, int row, int content)
{
    field[column][row] = content;
}
void CTilemap::drawTilemap(sf::RenderTexture &rt)
{
    //in Textur rendern
    sf::RectangleShape rectangle(sf::Vector2f(40, 40));

    for (int i = 0; i < columns*40; i+= 40)
    {
        for (int j = 0; j < rows*40; j+= 40)
        {
            rectangle.setPosition(i ,j);
            if (field[i/40][j/40] == 0){
                rectangle.setFillColor(sf::Color::White);
            }
            else if(field[i/40][j/40] == 1){
                rectangle.setFillColor(sf::Color::Blue);
            }
            rt.draw(rectangle);
        }

    }
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Kitarios« (10.05.2013, 00:54)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

09.05.2013, 23:51

In deinen .cpp Dateien benötigst du keine Includeguards. Die stören da nur.
@D13_Dreinig

Cookiezzz

Frischling

Beiträge: 91

Wohnort: Deutschland

Beruf: Schüler

  • Private Nachricht senden

3

10.05.2013, 11:04

Ich denke es liegt am

#ifndef TILEMAP_H
#define TILEMAP_H

...

#endif

in der Snake.cpp.

TILEMAP_H sollte da nämlich durch das indirekte Einbinden der Tilemap.h schon definiert sein, weswegen der komplette Inhalt der Snake.cpp ignoriert wird.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

10.05.2013, 11:08

Ich denke es liegt am

#ifndef TILEMAP_H
#define TILEMAP_H

...

#endif


:thumbsup:
@D13_Dreinig

Werbeanzeige