Ostatnio zmodyfikowano wczoraj o godz. 22:25
tBane Temat założony przez niniejszego użytkownika |
Zlecenie - Kod programu do generowania mapy kafelkowej » 2025-11-14 18:22:40 Zlecę napisanie programu i podanie jego kodu w którym można rysować mapę kafelkową z użyciem różnych tilesetów. Program ma działać w ten sposób, by dany kafelek był wybierany automatycznie i dopasowany kształtem do sąsiednich kafelków. Program ma być prosty, bez żadnych dodatków, tylko mapa i paleta z tilesetami. Może być program napisany w oparciu o ten tileset. Tileset składa się z pól 16px x 16px po cztery w rzędzie (żeby mapa nie była tak bardzo powtarzalna) https://github.com/tBane1995/Auto-Tiled/blob/main/Auto-Tiled/tex/set_0.pngProponuję 400zł. Cena do negocjacji. |
|
skovv |
» 2025-11-14 19:16:04 Hoho jak cena idzie w górę :D Nie wolisz sam napisać? :D |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-11-14 19:18:40 Nie potraafię samemu tego zaprogramować :-/ Próbowałem parę razy podejść na nowo do tego tematu i nie wyszło. W necie też nie ma informcji jak coś takiego zrobić - stąd zlecenie. :-) |
|
skovv |
» 2025-11-14 19:24:50 Aj tam będziesz płacił - pomyśl jeszcze raz aż wyjdzie! Ja bym to zrobił tak, że pierw ustawiasz sobie tileset. W sensie ładujesz obrazek, ustawiasz w/h klatki no i wtedy możesz sobie dodać "grupe" np trawa, piasek itp. Wtedy w grupie masz główny kafelek, nadajesz ten srodkowy. W gupie daj też możliwość ustawienia bocznych/narożnych kafli. Jak już sobie zedytujesz grupy to po prostu rysujesz wybierając daną grupę zamiast kafla. Rozumiesz? Wtedy jak rysujesz mapę to widzisz że np ten kafel jest ostatnim z brzegu wiec rysujesz kafel ostatni z danego brzegu jaki dalismy do tej grupy i tyle. Rozumiesz o co mi chodzi? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-11-14 19:25:55 Rozumiem, ale nie wiem jak to zaprogramować. Przydałby się gotowy kod. |
|
DejaVu |
» 2025-11-14 19:31:43 #include <SFML/Graphics.hpp> #include <vector> #include <map> #include <iostream>
const int TILE_SIZE = 32;
const int MAP_WIDTH = 20; const int MAP_HEIGHT = 15;
const int MAX_TILESETS = 4;
class Tile { public: int tilesetIndex; int tileId; bool isSolid; Tile( int setIdx = 0, int id = 0, bool solid = false ) : tilesetIndex( setIdx ) , tileId( id ) , isSolid( solid ) { } };
class TileMapEditor { private: sf::RenderWindow window; std::vector < sf::Texture > tilesets; std::vector < std::vector < Tile >> map; sf::Sprite tileSprite; sf::Vector2i selectedTileset; sf::Vector2i mouseTilePos; bool isDrawing = false; int currentTilesetIndex = 0; int currentTileId = 0; int getTileIdFromNeighbors( int x, int y ) { int mask = 0; if( y > 0 && map[ y - 1 ][ x ].tileId != 0 ) mask |= 1; if( x < MAP_WIDTH - 1 && map[ y ][ x + 1 ].tileId != 0 ) mask |= 2; if( y < MAP_HEIGHT - 1 && map[ y + 1 ][ x ].tileId != 0 ) mask |= 4; if( x > 0 && map[ y ][ x - 1 ].tileId != 0 ) mask |= 8; switch( mask ) { case 0: return 0; case 1: return 1; case 2: return 2; case 4: return 3; case 8: return 4; case 1 | 2: return 5; case 2 | 4: return 6; case 4 | 8: return 7; case 8 | 1: return 8; case 1 | 2 | 4: return 9; case 2 | 4 | 8: return 10; case 4 | 8 | 1: return 11; case 8 | 1 | 2: return 12; case 1 | 2 | 4 | 8: return 13; default: return 14; } } public: TileMapEditor() : window( sf::VideoMode( MAP_WIDTH * TILE_SIZE + 200, MAP_HEIGHT * TILE_SIZE ), "Tile Map Editor" ) { for( int i = 0; i < MAX_TILESETS; ++i ) { sf::Texture texture; std::string filename = "tileset_" + std::to_string( i ) + ".png"; if( !texture.loadFromFile( filename ) ) { std::cerr << "Failed to load tileset: " << filename << std::endl; sf::Image placeholder; placeholder.create( TILE_SIZE, TILE_SIZE, sf::Color::Green ); texture.loadFromImage( placeholder ); } tilesets.push_back( texture ); } map.resize( MAP_HEIGHT, std::vector < Tile >( MAP_WIDTH, Tile( 0, 0, false ) ) ); tileSprite.setOrigin( TILE_SIZE / 2.0f, TILE_SIZE / 2.0f ); } void run() { sf::Clock clock; while( window.isOpen() ) { sf::Event event; while( window.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) { window.close(); } if( event.type == sf::Event::MouseButtonPressed ) { if( event.mouseButton.button == sf::Mouse::Left ) { isDrawing = true; sf::Vector2i pos = sf::Mouse::getPosition( window ); mouseTilePos.x = pos.x / TILE_SIZE; mouseTilePos.y = pos.y / TILE_SIZE; if( mouseTilePos.x >= 0 && mouseTilePos.x < MAP_WIDTH && mouseTilePos.y >= 0 && mouseTilePos.y < MAP_HEIGHT ) { int newTileId = getTileIdFromNeighbors( mouseTilePos.x, mouseTilePos.y ); map[ mouseTilePos.y ][ mouseTilePos.x ] = Tile( currentTilesetIndex, newTileId, true ); } } } if( event.type == sf::Event::MouseButtonReleased ) { if( event.mouseButton.button == sf::Mouse::Left ) { isDrawing = false; } } if( event.type == sf::Event::MouseMoved ) { if( isDrawing ) { sf::Vector2i pos = sf::Mouse::getPosition( window ); int x = pos.x / TILE_SIZE; int y = pos.y / TILE_SIZE; if( x >= 0 && x < MAP_WIDTH && y >= 0 && y < MAP_HEIGHT ) { int newTileId = getTileIdFromNeighbors( x, y ); map[ y ][ x ] = Tile( currentTilesetIndex, newTileId, true ); } } } if( event.type == sf::Event::KeyPressed ) { if( event.key.code == sf::Keyboard::Num1 ) currentTilesetIndex = 0; if( event.key.code == sf::Keyboard::Num2 ) currentTilesetIndex = 1; if( event.key.code == sf::Keyboard::Num3 ) currentTilesetIndex = 2; if( event.key.code == sf::Keyboard::Num4 ) currentTilesetIndex = 3; } } window.clear( sf::Color::Black ); for( int y = 0; y < MAP_HEIGHT; ++y ) { for( int x = 0; x < MAP_WIDTH; ++x ) { const Tile & tile = map[ y ][ x ]; if( tile.tileId != 0 ) { sf::Sprite sprite; sprite.setTexture( tilesets[ tile.tilesetIndex ] ); sprite.setTextureRect( sf::IntRect( ( tile.tileId %( tilesets[ tile.tilesetIndex ].getSize().x / TILE_SIZE ) ) * TILE_SIZE, ( tile.tileId /( tilesets[ tile.tilesetIndex ].getSize().x / TILE_SIZE ) ) * TILE_SIZE, TILE_SIZE, TILE_SIZE ) ); sprite.setPosition( x * TILE_SIZE + TILE_SIZE / 2.0f, y * TILE_SIZE + TILE_SIZE / 2.0f ); window.draw( sprite ); } } } sf::Font font; if( !font.loadFromFile( "arial.ttf" ) ) { font = sf::Font(); } sf::Text infoText; infoText.setFont( font ); infoText.setCharacterSize( 16 ); infoText.setFillColor( sf::Color::White ); infoText.setPosition( MAP_WIDTH * TILE_SIZE + 10, 10 ); infoText.setString( "Tileset: " + std::to_string( currentTilesetIndex + 1 ) ); window.draw( infoText ); for( int i = 0; i < MAX_TILESETS; ++i ) { sf::Sprite preview; preview.setTexture( tilesets[ i ] ); preview.setPosition( MAP_WIDTH * TILE_SIZE + 10, 40 + i * 40 ); preview.setScale( 1.0f, 1.0f ); window.draw( preview ); sf::Text label; label.setFont( font ); label.setCharacterSize( 12 ); label.setFillColor( sf::Color::White ); label.setPosition( MAP_WIDTH * TILE_SIZE + 50, 45 + i * 40 ); label.setString( "Set " + std::to_string( i + 1 ) ); window.draw( label ); } sf::CircleShape cursor( 5 ); cursor.setFillColor( sf::Color::Red ); sf::Vector2i mousePos = sf::Mouse::getPosition( window ); cursor.setPosition( mousePos.x - 5, mousePos.y - 5 ); window.draw( cursor ); window.display(); } } };
int main() { TileMapEditor editor; editor.run(); return 0; }
Nie sprawdzałem czy działa/czy ma sens - mały lokalny model LLM to wygenerował. |
|
skovv |
» 2025-11-14 19:33:47 no jak no stary, silnik napisałeś a tego nie możesz. Nie poddawaj się :D class Group { public: std::string Name; GeSprite * main, * left, * right, * up, * down; }; Group * lista[ 100 ][ 100 ]; for( int w = 0; w < 100; w++ ) { for( int h = 0; h < 100; h++ ) { auto e = lista[ w ][ h ]; if( e != nullptr ) { if( NIE MA MOJEJ GRUPY Z LEWEJ ) RYSUJ TEN LEWY else if( NIE MA PO PRAWEJ ) RYSUJ TEN PRAWY else if( NIE MA Z GORY ) RYSUJ TEN GORNY else if( NIE MA Z DOLU ) RYSUJ TEN DOLNY else RYSUJ TEN SRODKOWY } } } |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-11-14 20:08:48 DejaVu niestety, ale program nie działa :-/ Podzieliłem tileset na cztery tilesety. Poprawiłem wczytywanie czcionki i odpaliłem program. Ale nie da się rysować mapy. Wrzuciłem ten projekt na Github. https://github.com/tBane1995/TiledSkovv Silnik wbrew pozorom jest prosty do napisania tylko czasochłonny, a algorytm do generowania kafelków jest złożony :-/ |
|
| « 1 » 2 3 |