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!
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.
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 :/
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Tilemap.h"
#include "Snake.h"int main()
{
//variableschar 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 openwhile (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 frameif ((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();
}
return0;
}
#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
#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_H sollte da nämlich durch das indirekte Einbinden der Tilemap.h schon definiert sein, weswegen der komplette Inhalt der Snake.cpp ignoriert wird.