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

[SFML] skalowanie sprajtów

Ostatnio zmodyfikowano 2024-06-24 11:25
Autor Wiadomość
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.

C/C++
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" );
   
   
// button Up
   
buttons[ 0 ] = sf::Sprite();
   
buttons[ 0 ].setTexture( upTexture );
   
buttons[ 0 ].setOrigin( paletteButtonSize.x, 40 );
   
   
// button Down
   
buttons[ 1 ] = sf::Sprite();
   
buttons[ 1 ].setTexture( downTexture );
   
buttons[ 1 ].setOrigin( paletteButtonSize.x, 40 );
   
   
// slots & prefabs
   
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();
   
}
   
   
}

C/C++
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; // texture width, texture height
   
   
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 ); // działa (64x64)
        //palettePrefabs[i].setTexture(*getTexture("assets/natures/tree1")->texture); // nie działa (256x256)
       
       
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; // 80px-16px ( 64px x 64px )
       
scaleY =( paletteButtonSize.y - 16.0f ) / th; // 80px-16px ( 64px x 64px )
       
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 );
}

C/C++
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 ] );
}
P-181251
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

C/C++
void paletteButton::update() {
   
sprite = sf::Sprite();
   
sprite.setTexture( * getTexture( object->name )->texture );
   
   
// positioning
   
float x = view.getCenter().x + position.x;
   
float y = view.getCenter().y + position.y;
   
sprite.setPosition( x, y );
   
   
// set the origin
   
float tw = sprite.getTexture()->getSize().x;
   
float th = sprite.getTexture()->getSize().y;
   
sprite.setOrigin( tw / 2.0f, th / 2.0f );
   
   
// scaling
   
float sx = paletteButtonSize.x / tw;
   
float sy = paletteButtonSize.y / th;
   
sprite.setScale( sx, sy );
   
}
P-181252
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:
P-181253
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.


C/C++
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; // texture width, texture height
   
   
for( int i = 0; i < 16; i++ ) {
       
paletteSlots[ i ].setPosition( x +( i % 2 ) * paletteButtonSize.x, y +( i / 2 ) * paletteButtonSize.y );
       
       
palettePrefabs[ i ] = sf::Sprite(); // must be
       
palettePrefabs[ i ].setTexture( * getTexture( "assets/items/axe" )->texture ); // działa (64x64)
       
palettePrefabs[ i ] = sf::Sprite(); // must be
       
palettePrefabs[ i ].setTexture( * getTexture( "assets/natures/tree1" )->texture ); // działa (256x256)
       
       
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; // 80px-16px ( 64px x 64px )
       
scaleY =( paletteButtonSize.y - 16.0f ) / th; // 80px-16px ( 64px x 64px )
       
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 );
}
P-181254
pekfos
» 2024-06-23 22:26:31
Drugi argument do setTexture()? https://www.sfml-dev.org/documentation/2.6.1/classsf_1_1Sprite.php#a3729c88d88ac38c19317c18e87242560. Po co w ogóle przypisujesz 2 razy teksturę do tego samego sprajta?
C/C++
palettePrefabs[ i ] = sf::Sprite(); // must be
palettePrefabs[ i ].setTexture( * getTexture( "assets/items/axe" )->texture ); // działa (64x64)
palettePrefabs[ i ] = sf::Sprite(); // must be
palettePrefabs[ i ].setTexture( * getTexture( "assets/natures/tree1" )->texture ); // działa (256x256)
Czemu to ma służyć?
P-181270
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.
P-181272
« 1 »
  Strona 1 z 1