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

Obliczanie współrzędnych mapy

Ostatnio zmodyfikowano 2024-08-23 15:43
Autor Wiadomość
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
C/C++
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).

C/C++
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.

C/C++
#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 ); // widthMap * heightMap * TwoTrianglesVertices
       
       
tiles.resize( width * height );
       
       
int tu, tv;
       
int coord_x, coord_y;
       
       
// TERRAIN - GRASS
       
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 ); // tu jakoś źle obliczam
           
coord_y =( coords.y + y ); // tu też źle obliczam
           
           
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; // wiem że tu także źle obliczam
       
int global_y = coords.y + y; // i nie rozumiem dlaczego
       
       
sf::Vertex * triangles = & vertexes[( y * width + x ) * 6 ];
       
       
int tu =( int( global_x * tileSide ) % 64 ) +( value * 64 );
       
int tv =( int( global_y * tileSide ) % 64 );
       
       
//cout << "tu: " << tu << ", tv: " << tv << "\n";
       
       
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
   
{
       
       
// draw tiles - terrain
       
states.transform *= getTransform();
       
states.texture = & tileset; // TO-DO
       
target.draw( vertexes, states );
   
}
}
;

#endif
P-181491
pekfos
» 2024-08-22 19:53:21
Yyy, a jaki jest objaw? Nie za bardzo wiadomo jaki jest problem.

C/C++
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.
P-181492
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.
RPG2D-085
RPG2D-085
P-181493
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.
C/C++
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.
P-181495
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-22 20:01:36
C/C++
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();
       
       
// 8 x 4
       
int start_x = 0;
       
int end_x = 16;
       
int start_y = 0;
       
int end_y = 16;
       
       
// CREATING MAPS
       
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->load();
       
}
       
    }
   
   
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() {
       
//sf::Clock c;
        //sf::Time start = c.getElapsedTime();
       
       
for( auto & map: maps ) {
           
map->draw();
       
}
       
       
//sf::Time end = c.getElapsedTime();
        //
        //cout << (end - start).asMilliseconds() << " ms,\t";
        //cout << (end - start).asSeconds() << " s \n";
   
}
   
   
}
;

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
P-181496
pekfos
» 2024-08-22 20:14:57
A wyświetlanie?
P-181497
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-22 20:17:32
już poprawiłem posta :-)
P-181498
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.
C/C++
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.
P-181499
« 1 » 2 3
  Strona 1 z 3 Następna strona