tBane Temat założony przez niniejszego użytkownika |
Obliczanie współrzędnych mapy » 2024-08-22 19:37:52 Witam. Programuję mapę. Obecnie Terrain oraz Floors jest tworzone w następujący sposób Map( int x, int y ) { terrain = new Terrain( x, y, 16, 16 ); }
Potrzebuję aby Terrain oraz Floors było opisywane jako wielokrotności 16 ( bo tyle ma mapa). Map( int x, int y ) { terrain = new Terrain( x * 16, y * 16, 16, 16 ); floors = new Floors( x * 16, y * 16, 16, 16 ); }
Próbowałem już na wiele sposobów zmieniać kod, ale nie wiem w którym miejscu robię błąd. #ifndef TerrainAndFloors_hpp #define TerrainAndFloors_hpp
float tileSide = 16.0f;
enum class terrainType { grass, sands, water, gravel };
class TerrainPrefab : public GameObject { public: Texture * texture; terrainType ttype; TerrainPrefab( string name, terrainType ttype ) : GameObject( name ) { type = gameObjectType::Terrain; texture = getTexture( name ); this->ttype = ttype; } };
class Terrain : public sf::Drawable , public sf::Transformable { public: int width, height; sf::Vector2i coords; sf::VertexArray vertexes; sf::Texture tileset; std::vector < int > tiles; Terrain( int x, int y, int width, int height ) { coords.x = x; coords.y = y; this->width = width; this->height = height; tileset = sf::Texture(); tileset = * getTexture( "tiles/0_tileset" )->texture; vertexes.setPrimitiveType( sf::Triangles ); vertexes.resize( width * height * 6 ); tiles.resize( width * height ); int tu, tv; int coord_x, coord_y; for( int y = 0; y < height; y++ ) for( int x = 0; x < width; x++ ) { sf::Vertex * triangles = & vertexes[( y * width + x ) * 6 ]; coord_x =( coords.x + x ); coord_y =( coords.y + y ); triangles[ 0 ].position = sf::Vector2f( coord_x * tileSide, coord_y * tileSide ); triangles[ 1 ].position = sf::Vector2f(( coord_x + 1 ) * tileSide, coord_y * tileSide ); triangles[ 2 ].position = sf::Vector2f( coord_x * tileSide,( coord_y + 1 ) * tileSide ); triangles[ 3 ].position = sf::Vector2f( coord_x * tileSide,( coord_y + 1 ) * tileSide ); triangles[ 4 ].position = sf::Vector2f(( coord_x + 1 ) * tileSide, coord_y * tileSide ); triangles[ 5 ].position = sf::Vector2f(( coord_x + 1 ) * tileSide,( coord_y + 1 ) * tileSide ); edit( x, y, 0 ); } } void edit( int x, int y, int value ) { if( x < 0 || x >= width || y < 0 || y >= height ) return; if( value > 3 || value < 0 ) return; tiles[ y * width + x ] = value; int global_x = coords.x + x; int global_y = coords.y + y; sf::Vertex * triangles = & vertexes[( y * width + x ) * 6 ]; int tu =( int( global_x * tileSide ) % 64 ) +( value * 64 ); int tv =( int( global_y * tileSide ) % 64 ); triangles[ 0 ].texCoords = sf::Vector2f( tu, tv ); triangles[ 1 ].texCoords = sf::Vector2f( tu + tileSide, tv ); triangles[ 2 ].texCoords = sf::Vector2f( tu, tv + tileSide ); triangles[ 3 ].texCoords = sf::Vector2f( tu, tv + tileSide ); triangles[ 4 ].texCoords = sf::Vector2f( tu + tileSide, tv ); triangles[ 5 ].texCoords = sf::Vector2f( tu + tileSide, tv + tileSide ); } private: virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const { states.transform *= getTransform(); states.texture = & tileset; target.draw( vertexes, states ); } };
#endif
|
|
pekfos |
» 2024-08-22 19:53:21 Yyy, a jaki jest objaw? Nie za bardzo wiadomo jaki jest problem. int tu =( int( global_x * tileSide ) % 64 ) +( value * 64 ); int tv =( int( global_y * tileSide ) % 64 ); Pewny jesteś że tu powinny być używane globalne współrzędne? To trafia do współrzędnych tekstury. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-08-22 19:55:00 Pewny jesteś że tu powinny być używane globalne współrzędne? To trafia do współrzędnych tekstury. Tak powinny być globalne, gdyż kafelek ma wymiary 16x16 a tekstura 64x64. I wszystko jest ładnie dzielone tzn opisywane przez resztę z 64 Yyy, a jaki jest objaw? Nie za bardzo wiadomo jaki jest problem. Renderuje mi tylko pierwszą mapę, pozostałe już nie. |
|
pekfos |
» 2024-08-22 19:59:32 A masz więcej? Nie wiadomo jak obsługujesz więcej niż jedną mapę, a w tym kodzie wygląda jakbyś miał 1 wskaźnik na 1 obiekt Terrain. Map( int x, int y ) { terrain = new Terrain( x * 16, y * 16, 16, 16 ); floors = new Floors( x * 16, y * 16, 16, 16 ); } Jak masz więcej niż jeden obiekt Map, to nie podałeś na to żadnego kodu. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-08-22 20:01:36 class Map { public: Terrain * terrain; Floors * floors; Map( int x, int y ) { terrain = new Terrain( x * 16, y * 16, 16, 16 ); floors = new Floors( x * 16, y * 16, 16, 16 ); } ~Map() { } void draw() { window->draw( * terrain ); window->draw( * floors ); } };
class World { public: std::vector < Map * > maps; World() { maps.clear(); } void load() { maps.clear(); int start_x = 0; int end_x = 16; int start_y = 0; int end_y = 16; for( int y = start_y; y <= end_y; y++ ) for( int x = start_x; x <= end_x; x++ ) maps.push_back( new Map( x, y ) ); for( auto & map: maps ) { } } Map * getMap( sf::Vector2f worldMousePosition ) { float left, right, top, bottom; for( auto & m: maps ) { left = m->terrain->coords.x * 16 * tileSide; right = left + m->terrain->width * tileSide; top = m->terrain->coords.y * 16 * tileSide; bottom = top + m->terrain->height * tileSide; if( worldMousePosition.x >= left && worldMousePosition.x <= right && worldMousePosition.y >= top && worldMousePosition.y <= bottom ) return m; } return nullptr; } void draw() { for( auto & map: maps ) { map->draw(); } } };
Chciałbym aby mapy były normalnie numerowane 0,1,2,3,4,5 .. 15,16 A Terrain miał współrzędne: 0,16,32,48,64, .. 240,256 |
|
pekfos |
» 2024-08-22 20:14:57 A wyświetlanie? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-08-22 20:17:32 już poprawiłem posta :-) |
|
pekfos |
» 2024-08-22 20:36:04 isVisible nie jest może ustawione na false? W teście widoczności chyba nie poprawiłeś jednostek. map_position.x =( int( map->terrain->coords.x ) * 16 * tileSide ) + 8 * tileSide; map_position.y =( int( map->terrain->coords.y ) * 16 * tileSide ) + 8 * tileSide; coords jest wielokrotnością 16, potem mnożysz razy 16 i 16px, więc pewnie wszystko poza mapą 0,0 wypada poza ekranem. |
|
« 1 » 2 3 |