tBane Temat założony przez niniejszego użytkownika |
[SFML] skalowanie sprajtów » 2024-06-20 10:30:05 Witam. Próbuję przeskalować sprite do rozmiaru paletteButtonsSize w funkcji updatePalette(). Wszystkim spritom ustawiłem współrzędne środka jako połowa ich rozmiaru, aby łatwiej było je renderować na ekranie. Teraz mam problem ze skalowaniem, nie wiem dlaczego to co napisałem nie działa. Jak to zrobić tzn. skalować? Itemy o rozmiarach 64x64 renderuje poprawnie. void createPalette() { paletteButtonSize = sf::Vector2f( 80, 80 ); slotPaletteTexture = sf::Texture(); slotPaletteTexture.loadFromFile( "assets/GUI/slotTexture.png" ); upTexture = sf::Texture(); upTexture.loadFromFile( "assets/GUI/wideArrowUp.png" ); downTexture = sf::Texture(); downTexture.loadFromFile( "assets/GUI/wideArrowDown.png" ); buttons[ 0 ] = sf::Sprite(); buttons[ 0 ].setTexture( upTexture ); buttons[ 0 ].setOrigin( paletteButtonSize.x, 40 ); buttons[ 1 ] = sf::Sprite(); buttons[ 1 ].setTexture( downTexture ); buttons[ 1 ].setOrigin( paletteButtonSize.x, 40 ); for( int i = 0; i < 16; i++ ) { paletteSlots[ i ] = sf::Sprite(); paletteSlots[ i ].setTexture( slotPaletteTexture ); paletteSlots[ i ].setOrigin( paletteButtonSize.x / 2.0f, paletteButtonSize.y / 2.0f ); palettePrefabs[ i ] = sf::Sprite(); } }
void updatePalette() { int x = view.getCenter().x + screenWidth / 2.0f - 1.5f * paletteButtonSize.x; int y = view.getCenter().y - screenHeight / 2.0f + 1.0f * paletteButtonSize.y; float scaleX, scaleY; float tw, th; for( int i = 0; i < 16; i++ ) { paletteSlots[ i ].setPosition( x +( i % 2 ) * paletteButtonSize.x, y +( i / 2 ) * paletteButtonSize.y ); palettePrefabs[ i ].setPosition( x +( i % 2 ) * paletteButtonSize.x, y +( i / 2 ) * paletteButtonSize.y ); palettePrefabs[ i ].setTexture( * getTexture( "assets/items/axe" )->texture ); tw = palettePrefabs->getTexture()->getSize().x; th = palettePrefabs->getTexture()->getSize().y; palettePrefabs[ i ].setOrigin( tw / 2.0f, th / 2.0f ); scaleX =( paletteButtonSize.x - 16.0f ) / tw; scaleY =( paletteButtonSize.y - 16.0f ) / th; palettePrefabs[ i ].setScale( scaleX, scaleY ); } buttons[ 0 ].setPosition( x + paletteButtonSize.x / 2.0f, y - paletteButtonSize.y / 2.0f ); buttons[ 1 ].setPosition( x + paletteButtonSize.x / 2.0f, y - paletteButtonSize.y + screenHeight ); }
void renderPalette() { for( int i = 0; i < 16; i++ ) { window->draw( paletteSlots[ i ] ); window->draw( palettePrefabs[ i ] ); } window->draw( buttons[ 0 ] ); window->draw( buttons[ 1 ] ); }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-06-20 14:05:59 Tutaj czytelniejsza i skrócona forma, czyli to co próbuję osiągnąć. No ale najpierw potrzebuję poprawnego skalowania tekstur void paletteButton::update() { sprite = sf::Sprite(); sprite.setTexture( * getTexture( object->name )->texture ); float x = view.getCenter().x + position.x; float y = view.getCenter().y + position.y; sprite.setPosition( x, y ); float tw = sprite.getTexture()->getSize().x; float th = sprite.getTexture()->getSize().y; sprite.setOrigin( tw / 2.0f, th / 2.0f ); float sx = paletteButtonSize.x / tw; float sy = paletteButtonSize.y / th; sprite.setScale( sx, sy ); }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-06-21 08:46:05 Przerobiłem trochę sprite, żeby zobaczyć czy rysuje tylko lewy górny fragment i jak się okazało skalowanie działa, tylko z renderingiem coś jest nie tak tzn. rysuje tylko część sprajta (przycina go). Lepiej to widac na screenach. dla nieprzeźroczystego tła tak to wygląda: |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-06-21 09:08:08 Już wiem. Przed każdym przypisywaniem tekstury do sprajta należy go utworzyć "na nowo". Wtedy resetują sie ustawienia sprajta i poprawnie renderuje teksture. void updatePalette() { int x = view.getCenter().x + screenWidth / 2.0f - 1.5f * paletteButtonSize.x; int y = view.getCenter().y - screenHeight / 2.0f + 1.0f * paletteButtonSize.y; float scaleX, scaleY; float tw, th; for( int i = 0; i < 16; i++ ) { paletteSlots[ i ].setPosition( x +( i % 2 ) * paletteButtonSize.x, y +( i / 2 ) * paletteButtonSize.y ); palettePrefabs[ i ] = sf::Sprite(); palettePrefabs[ i ].setTexture( * getTexture( "assets/items/axe" )->texture ); palettePrefabs[ i ] = sf::Sprite(); palettePrefabs[ i ].setTexture( * getTexture( "assets/natures/tree1" )->texture ); palettePrefabs[ i ].setPosition( x +( i % 2 ) * paletteButtonSize.x, y +( i / 2 ) * paletteButtonSize.y ); tw = palettePrefabs->getTexture()->getSize().x; th = palettePrefabs->getTexture()->getSize().y; palettePrefabs[ i ].setOrigin( tw / 2.0f, th / 2.0f ); scaleX =( paletteButtonSize.x - 16.0f ) / tw; scaleY =( paletteButtonSize.y - 16.0f ) / th; palettePrefabs[ i ].setScale( scaleX, scaleY ); } buttons[ 0 ].setPosition( x + paletteButtonSize.x / 2.0f, y - paletteButtonSize.y / 2.0f ); buttons[ 1 ].setPosition( x + paletteButtonSize.x / 2.0f, y - paletteButtonSize.y + screenHeight ); }
|
|
pekfos |
» 2024-06-23 22:26:31 |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-06-24 11:25:46 A po to żeby sprawdzić czy działa skalowanie. Skalowanie działa, tylko nie resetowałem sprajta i przez to źle go renderowało. |
|
« 1 » |