Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML/C++] redefinition of class, dzielene kodu

Ostatnio zmodyfikowano 2021-04-22 10:09
Autor Wiadomość
Temat założony przez niniejszego użytkownika
[SFML/C++] redefinition of class, dzielene kodu
» 2021-04-21 22:46:20
Ja się już kurde poddaje chyba :/
są trzy takie pliki: Main.cpp, tilemap.hpp, tilemap.cpp
C/C++
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "tilemap.hpp"

enum Stan
{
   
Menu, Game, Eq
};

int main()
{
   
sf::RenderWindow window( sf::VideoMode( 1280, 720 ), "Game" );
   
window.setFramerateLimit( 60 );
   
   
const int level[ ] =
   
{
       
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0,
       
1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
       
0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0,
       
0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0,
       
0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0,
       
2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1,
       
0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1,
   
};
   
TileMap map1;
   
if( !map1.load( "tilset.png", sf::Vector2u( 100, 100 ), level, 16, 8 ) )
   
{
       
return - 1;
   
}
   
sf::Texture player;
   
   
player.loadFromFile( "player.png" );
   
   
sf::Sprite spPlayer( player );
   
   
spPlayer.setOrigin( 25.f, 25.f );
   
spPlayer.setPosition( 640, 360 );
   
sf::View kamera;
   
kamera.setCenter( spPlayer.getPosition() );
   
kamera.setSize /*(1280.f, 720.f);*/( 640.f, 360.f );
   
//kamera.setRotation (90.f);
   
Stan stan;
   
sf::Event e;
   
while( window.isOpen() )
   
{
       
while( window.pollEvent( e ) )
       
{
           
if( e.type == sf::Event::Closed )
           
{
               
window.close();
           
}
        }
       
//WYDARZENIA
       
switch( stan )
       
{
       
case Menu:
           
{
               
if( sf::Keyboard::isKeyPressed( sf::Keyboard::Enter ) )
               
{
                   
stan = Game;
               
}
            }
           
break;
       
case Game:
           
{
               
if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) )
               
{
                   
spPlayer.move( 0, - 2 );
                   
kamera.move( 0, - 2 );
               
}
               
if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) )
               
{
                   
spPlayer.move( 0, 2 );
                   
kamera.move( 0, 2 );
               
}
               
if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) )
               
{
                   
spPlayer.move( - 2, 0 );
                   
kamera.move( - 2, 0 );
               
}
               
if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) )
               
{
                   
spPlayer.move( 2, 0 );
                   
kamera.move( 2, 0 );
               
}
            }
//game wydarzenia
           
break;
       
case Eq:
           
           
break;
       
} //switch wydarzenia
        //WYŒWIETLANIE
       
window.clear();
       
switch( stan )
       
{
       
case Menu:
           
           
break;
       
case Game:
           
{
               
window.draw( map1 );
               
window.draw( spPlayer );
               
window.setView( kamera );
           
} //case Game wyswietlanie
           
break;
       
case Eq:
           
           
break;
       
} //switch wyswietalnie
       
window.display();
   
}
}
C/C++
#ifndef tilemap_hpp
#define tilemap_hpp

class TileMap
    : public sf::Drawable
    , public sf::Transformable
{
public:
   
bool load( const std::string & tileset, sf::Vector2u tileSize, const int * tiles, unsigned int width, unsigned int height );
private:
   
virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const;
};
#endif  // tilemap
C/C++
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include "tilemap.hpp"

class TileMap
    : public sf::Drawable
    , public sf::Transformable
{
public:
   
bool load( const std::string & tileset, sf::Vector2u tileSize, const int * tiles, unsigned int width, unsigned int height )
   
{
       
//Wczytywanie tekstur tileset
       
if( !m_tileset.loadFromFile( tileset ) )
       
{
           
return false;
       
}
       
//Level size
       
m_vertices.setPrimitiveType( sf::Quads );
       
m_vertices.resize( width * height * 4 );
       
       
for( unsigned int i = 0; i < width; i++ )
       
{
           
for( unsigned int j = 0; j < height; j++ )
           
{
               
//pobieranie obecnego numeru tile
               
int tileNumber = tiles[ i + j * width ]
               
               
// find its position in the tileset texture
               
int tu = tileNumber %( m_tileset.getSize().x / tileSize.x );
               
int tv = tileNumber /( m_tileset.getSize().x / tileSize.x );
               
               
// get a pointer to the current tile's quad
               
sf::Vertex * quad = & m_vertices[( i + j * width ) * 4 ];
               
               
// define its 4 corners
               
quad[ 0 ].position = sf::Vector2f( i * tileSize.x, j * tileSize.y );
               
quad[ 1 ].position = sf::Vector2f(( i + 1 ) * tileSize.x, j * tileSize.y );
               
quad[ 2 ].position = sf::Vector2f(( i + 1 ) * tileSize.x,( j + 1 ) * tileSize.y );
               
quad[ 3 ].position = sf::Vector2f( i * tileSize.x,( j + 1 ) * tileSize.y );
               
               
// define its 4 texture coordinates
               
quad[ 0 ].texCoords = sf::Vector2f( tu * tileSize.x, tv * tileSize.y );
               
quad[ 1 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x, tv * tileSize.y );
               
quad[ 2 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x,( tv + 1 ) * tileSize.y );
               
quad[ 3 ].texCoords = sf::Vector2f( tu * tileSize.x,( tv + 1 ) * tileSize.y );
               
           
}
        }
       
return true;
   
}
private:
   
virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const
   
{
       
virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const
       
{
           
// apply the transform
           
states.transform *= getTransform();
           
           
// apply the tileset texture
           
states.texture = & m_tileset;
           
           
// draw the vertex array
           
target.draw( m_vertices, states );
       
}
    }
}
;

ERROR: redefinition of "class Tilemap" (linia 5, plik tilemap.cpp)

Przeszukałem całą 1 stronę googla :D
i NIC :(
P-178466
» 2021-04-21 22:48:11
Brakuje #ifndef w pliku, który zawiera tilemap.

Zerknij również na: » Kurs C++» Dodatkowe materiałyDzielenie kodu na kilka plików źródłowych lekcja
P-178467
Temat założony przez niniejszego użytkownika
» 2021-04-21 23:40:46
Masz na myśli tilemap.hpp czy oba pliki .cpp?
P-178468
» 2021-04-21 23:41:20
ifdef-y dodaje się do plików *.h/*.hpp.
P-178469
Temat założony przez niniejszego użytkownika
» 2021-04-21 23:44:17
to jest ifndef oraz define w pliku tilemap.hpp na samej górze
P-178470
» 2021-04-21 23:49:44
No to git :) Czyli w pliku *.cpp masz błąd. Plik *.cpp powinien zawierać tylko implementację tj.
C/C++
#include "tilemap.hpp"

bool TileMap::load( const std::string & tileset, sf::Vector2u tileSize, const int * tiles, unsigned int width, unsigned int height )
{
   
//...
}

//virtual
void TileMap::draw( sf::RenderTarget & target, sf::RenderStates states ) const
{
   
//...
}
P-178471
Temat założony przez niniejszego użytkownika
» 2021-04-22 00:00:06
Po zmianie tej jednej rzeczy tyle sie natworzyło :/

C/C++
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include "tilemap.hpp"

bool TileMap::load( const std::string & tileset, sf::Vector2u tileSize, const int * tiles, unsigned int width, unsigned int height )
{
   
//Wczytywanie tekstur tileset
   
if( !m_tileset.loadFromFile( tileset ) )
   
{
       
return false;
   
}
   
//Level size
   
m_vertices.setPrimitiveType( sf::Quads );
   
m_vertices.resize( width * height * 4 );
   
   
for( unsigned int i = 0; i < width; i++ )
   
{
       
for( unsigned int j = 0; j < height; j++ )
       
{
           
//pobieranie obecnego numeru tile
           
int tileNumber = tiles[ i + j * width ];
           
           
// find its position in the tileset texture
           
int tu = tileNumber %( m_tileset.getSize().x / tileSize.x );
           
int tv = tileNumber /( m_tileset.getSize().x / tileSize.x );
           
           
// get a pointer to the current tile's quad
           
sf::Vertex * quad = & m_vertices[( i + j * width ) * 4 ];
           
           
// define its 4 corners
           
quad[ 0 ].position = sf::Vector2f( i * tileSize.x, j * tileSize.y );
           
quad[ 1 ].position = sf::Vector2f(( i + 1 ) * tileSize.x, j * tileSize.y );
           
quad[ 2 ].position = sf::Vector2f(( i + 1 ) * tileSize.x,( j + 1 ) * tileSize.y );
           
quad[ 3 ].position = sf::Vector2f( i * tileSize.x,( j + 1 ) * tileSize.y );
           
           
// define its 4 texture coordinates
           
quad[ 0 ].texCoords = sf::Vector2f( tu * tileSize.x, tv * tileSize.y );
           
quad[ 1 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x, tv * tileSize.y );
           
quad[ 2 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x,( tv + 1 ) * tileSize.y );
           
quad[ 3 ].texCoords = sf::Vector2f( tu * tileSize.x,( tv + 1 ) * tileSize.y );
           
       
}
    }
   
return true;
}

virtual void TileMap::draw( sf::RenderTarget & target, sf::RenderStates states ) const
{
   
// apply the transform
   
states.transform *= getTransform();
   
   
// apply the tileset texture
   
states.texture = & m_tileset;
   
   
// draw the vertex array
   
target.draw( m_vertices, states );
}

||=== Build: Debug in game (compiler: GNU GCC Compiler) ===|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp||In member function 'bool TileMap::load(const string&, sf::Vector2u, const int*, unsigned int, unsigned int)':|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|8|error: 'm_tileset' was not declared in this scope|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|8|note: suggested alternative: 'tileset'|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|13|error: 'm_vertices' was not declared in this scope|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|13|note: suggested alternative: '_strtime_s'|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|24|error: 'm_tileset' was not declared in this scope|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|24|note: suggested alternative: 'tileset'|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|47|error: 'virtual' outside class declaration|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp||In member function 'virtual void TileMap::draw(sf::RenderTarget&, sf::RenderStates) const':|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|53|error: 'm_tileset' was not declared in this scope|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|53|note: suggested alternative: '_tzset'|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|56|error: 'm_vertices' was not declared in this scope|
C:\Users\routa\Desktop\Prpogramy c++\game\tilemap.cpp|56|note: suggested alternative: '_strtime_s'|
||=== Build failed: 6 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

P-178472
» 2021-04-22 00:03:33
W pliku *.hpp w klasie TileMap nie masz po prostu zdefiniowanych pól w klasie tj. nie ma m_tileset ani m_vertices.

PS. słowo kluczowe virtual jest niepoprawne w pliku *.cpp.
P-178473
« 1 » 2
  Strona 1 z 2 Następna strona