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

[SFML] Mapa kafelkowa - czyli jak to zrobić dobrze

Ostatnio zmodyfikowano 2024-07-16 18:18
Autor Wiadomość
pekfos
» 2024-07-15 18:42:12
Chciałbym teraz rozdzielić podłogę(parkiet, płytki etc.) od kafelków(trawa, kamienie, piasek, skały etc.).
Podłoga to nie kafelki?

Czy dobrym rozwiązaniem będzie stworzenie drugiego vertexarray i dynamicznie przypisywanie do niego elementów ?
Czy lepiej stworzyć drugą listę statyczną i pole bez podłogi renderować jako transparent w floorset.png (tileset dla podłogi)
Tak. Jeśli wiesz, że wyświetlasz niewidzialną grafikę, to lepiej tego nie robić. A jak nie wiesz, to przezroczysty kafel też załatwia sprawę.
P-181314
tBane
Temat założony przez niniejszego użytkownika
» 2024-07-15 18:44:57
Znaczy, że zrobić drugą statyczną listę vertexArray ? Bo jakoś nie rozumiem, a sam zdecydować też się nie mogę ...
P-181315
tBane
Temat założony przez niniejszego użytkownika
» 2024-07-15 20:20:24
Dobra, zrobiłem statyczną drugą listę sf::vertexArray floors o rozmiarach mapy, czyli 16x16. Działa dobrze, czy to optymalne nie wiem. Ale tak zrobiłem.
P-181316
tBane
Temat założony przez niniejszego użytkownika
» 2024-07-16 17:06:57
teraz chciałbym dodać budynki do mojej gry, które są opisywane skryptami. Skrypt jaki wygląda tak jak poniżej. Nie wiem w jaki sposób renderować i przetwarzać takie budynki. Jakiś pomysł ?
Ja wymyśliłem na razie coś takiego, że budynki będą przetwarzane tak samo jak mapy i do map dodawały elementy, tylko nie wiem jak to zrobić z obecnym kodem.


name "test house"
texture "assets/buildings/test house.png"
size 16 16

// FLOORS
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0

// WALLS
Wall "walls/stone_wall_top_3" 48 16
Wall "walls/stone_wall_top_3" 80 16
Wall "walls/stone_wall_top_3" 112 16
Wall "walls/stone_wall_top_3" 144 16
Wall "walls/stone_wall_bottom" 144 48
Wall "walls/stone_wall_bottom" 112 48
Wall "walls/stone_wall_bottom" 80 48
Wall "walls/stone_wall_bottom" 48 48
Wall "walls/stone_wall_top_4" 16 16
Wall "walls/stone_wall_top_2" 16 48
Wall "walls/stone_wall_top_2" 16 80
Wall "walls/stone_wall_top_2" 16 112
Wall "walls/stone_wall_top_6" 16 144
Wall "walls/stone_wall_top_3" 48 144
Wall "walls/stone_wall_top_3" 176 16
Wall "walls/stone_wall_top_9" 80 144
Wall "walls/stone_wall_bottom" 176 48
Wall "walls/stone_wall_bottom" 208 176
Wall "walls/stone_wall_bottom" 176 176
Wall "walls/stone_wall_bottom" 16 176
Wall "walls/stone_wall_bottom" 48 176
Wall "walls/stone_wall_bottom" 80 176
Wall "walls/stone_wall_bottom" 208 48
Wall "walls/stone_wall_top_3" 208 16
Wall "walls/stone_wall_top_5" 240 16
Wall "walls/stone_wall_top_7" 240 144
Wall "walls/stone_wall_top_8" 176 144
Wall "walls/stone_wall_top_3" 208 144
Wall "walls/stone_wall_top_2" 240 112
Wall "walls/stone_wall_top_2" 240 80
Wall "walls/stone_wall_top_2" 240 48
Wall "walls/stone_wall_bottom" 240 176

// ITEMS

// FURNITURES

P-181317
tBane
Temat założony przez niniejszego użytkownika
» 2024-07-16 18:18:26
Dobra to była chwila mojego zwątpienia. Poradziłem sobie.

C/C++
#ifndef Buildings_hpp
#define Buildings_hpp

class Building
    : public GameObject
{
public:
   
sf::Vector2i size;
   
std::vector < ItemOnMap * > _items;
   
std::vector < Furniture * > _furnitures;
   
std::vector < Wall * > _walls;
   
   
Building( string name, float x, float y )
        :
GameObject( name, x, y )
   
{
       
       
string filename = "assets/" + name + ".txt";
       
ifstream file( filename );
       
       
if( !file.is_open() ) {
           
cout << "cant open building script: " << filename << "\n";
           
return;
       
}
       
       
string line;
       
string objectType;
       
string objectName;
       
       
std::getline( file, line ); // name
       
std::getline( file, line ); // texture
       
       
        // SIZE
       
std::getline( file, line );
       
std::istringstream lineStream( line );
       
lineStream >> objectType;
       
lineStream >> size.x >> size.y;
       
cout << size.x << " " << size.y << "\n";
       
       
std::getline( file, line );
       
std::getline( file, line );
       
       
// LOAD FLOORS - TUTAJ WYSTĘPUJE BŁĄD
       
int value;
       
for( int y = 0; y < size.y; y++ ) {
           
for( int x = 0; x < size.x; x++ ) {
               
file >> value;
               
cout << value << " ";
               
//editFloor(x, y, value);;
           
}
           
cout << "\n";
       
}
       
       
// LOAD GAMEOBJECTS
       
while( std::getline( file, line ) ) {
           
           
if( line.empty() ) {
               
//cout << "empty line\n";
               
continue;
           
}
           
           
           
std::istringstream lineStream( line );
           
lineStream >> objectType;
           
           
if( objectType == "Item" ) {
               
               
int x, y;
               
getline( lineStream, objectName, '"' ); // Pomijamy pierwszy znak cudzysłowu
               
getline( lineStream, objectName, '"' ); // Wczytaj nazwę do kolejnego cudzysłowu
               
lineStream >> x;
               
lineStream >> y;
               
               
x = x -( size.x * 16 / 2 ) + position.x;
               
y = y -( size.y * 16 / 2 ) + position.y;
               
               
ItemOnMap * item = new ItemOnMap( getItem( objectName ), x, y );
               
_items.push_back( item );
               
cout << "Item: " << objectName << "\n";
               
           
}
           
           
if( objectType == "Furniture" ) {
               
string name;
               
int x, y;
               
               
getline( lineStream, objectName, '"' ); // Pomijamy pierwszy znak cudzysłowu
               
getline( lineStream, objectName, '"' ); // Wczytaj nazwę do kolejnego cudzysłowu
               
lineStream >> x;
               
lineStream >> y;
               
               
x = x -( size.x * 16 / 2 ) + position.x;
               
y = y -( size.y * 16 / 2 ) + position.y;
               
               
Furniture * furniture = new Furniture( getPrefab( objectName ), x, y );
               
_furnitures.push_back( furniture );
               
cout << "Furniture: " << objectName << "\n";
           
}
           
           
if( objectType == "Wall" ) {
               
string name;
               
int x, y;
               
               
getline( lineStream, objectName, '"' ); // Pomijamy pierwszy znak cudzysłowu
               
getline( lineStream, objectName, '"' ); // Wczytaj nazwę do kolejnego cudzysłowu
               
lineStream >> x;
               
lineStream >> y;
               
               
x = x -( size.x * 16 / 2 ) + position.x;
               
y = y -( size.y * 16 / 2 ) + position.y;
               
               
Wall * wall = new Wall( getPrefab( objectName ), x, y );
               
_walls.push_back( wall );
               
cout << "Wall: " << objectName << "\n";
           
}
           
        }
       
       
file.close();
       
   
}
   
   
void addGameObjectsToMainLists() {
       
       
for( auto & item: _items ) {
           
gameObjects.push_back( item );
           
itemsOnMap.push_back( item );
       
}
       
       
for( auto & furniture: _furnitures ) {
           
gameObjects.push_back( furniture );
           
furnitures.push_back( furniture );
       
}
       
       
for( auto & wall: _walls ) {
           
gameObjects.push_back( wall );
           
walls.push_back( wall );
       
}
    }
   
}
;

#endif
P-181318
tBane
Temat założony przez niniejszego użytkownika
» 2024-07-16 18:18:26
P-181319
1 2 « 3 »
Poprzednia strona Strona 3 z 3