Wątek przeniesiony 2022-05-08 15:07 z C/C++ przez cerrato.

Zamiana sprite'a - menu gry

0

Witam. Próbuję zrobić menu gry. Korzystam z biblioteki SFML. Wstawiłem obrazek menu. Nie wiem jak zrobić przejście z "start" na "opcje". Zrobiłem po naciśnięciu strzałki w dół, że się coś zmienia, wyskakują paski zamiast obrazka...

if (Keyboard::isKeyPressed(Keyboard::Down))
{
    if (!menu.loadFromFile("grafika/menu2.png"))
    {
        cout << "coś tam" << endl;
    }
}

Chcę zrobić print screen żeby pokazać jak wygląda sytuacja ale nie mogę, robi się białe tło. Korzystam z VIsual Studio Community.

1

Nie wiem czy dobrze Cię zrozumiałem, po wciśnięciu klawisza chcesz podmienić obrazek? Jeśli tak to chyba powinno być tak zrobione:

// przed main loopem, ładuj tekstury
sf::Texture* menu1 = new sf::Texture("grafika/menu1.png");
sf::Texture* menu2 = new sf::Texture("grafika/menu2.png");

sf::Sprite sprite; // sprite na teksture
sprite.setTexture(*menu1);


// w main loopie
if (Keyboard::isKeyPressed(Keyboard::Down)) {
    sprite.setTexture(*menu2); // naciśnięcie klawisza w dół spowoduje podmianę tekstury sprita.      
}

0

Tak chcę podmienić sprite'a. Tylko że ja zrobiłem animacje tego menu. Wpisałem ten kod: sf::Texture menu1 = new sf::Texture("grafika/menu1.png");* i podkreśla mi na czerwono nawias przed cudzysłowiem.
Bez nazwy.png

0
FukurouPL napisał(a):

Tylko że ja zrobiłem animacje tego menu.

Nic mi to nie mówi. Nie napisałeś w piewszym poscie o żadnej animacji, ani co ta animacja ma do problemu...

0

Zrobiłem tak:

Texture menu2;
menu2.loadFromFile("grafika/menu2.png");

I ten kod działa, tylko animowane paski się pokazują zamiast grafiki.

0

Pisz swoje posty tak, żeby nie trzeba było o nic Cię dopytywać...

Czy zrobiłeś podmianę sprite'a, dokładnie tak jak napisał @MrMadMatt ?

sprite.setTexture(*menu2);
0
#include <SFML/Window.hpp>
#include <iostream>
#include <Windows.h>
#include <string>
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <cstdio>

using namespace std;
using namespace sf;



int main(int argc, char** argv)
{
    RenderWindow window(VideoMode(1920, 1080), "Goku's GT Adventures", Style::Fullscreen);
    window.setFramerateLimit(100);

    
    Texture texture;
    if (!texture.loadFromFile("grafika/goku_menu.png"))
    {
        cout << "hello";
    }

    Sprite obrazek(texture);
    obrazek.setTexture(texture);



    Texture menu;

    if (!menu.loadFromFile("grafika/menu.png"))
    {
        cout << "hello menu";
    }

    IntRect rectSourceSprite(454, 187, 454, 187);
    Sprite obrazek2(menu,rectSourceSprite);
    obrazek2.setTexture(menu);
    obrazek2.setPosition(866.f, 667.f);
    menu.setSmooth(true);

 
    Sprite obrazek3;
    Texture menu2;
    menu2.loadFromFile("grafika/menu2.png");
    




    Clock clock;




    while (window.isOpen())
    {

        Event event;
        while (window.pollEvent(event))
        {
    

            if (event.type == Event::Closed)
                window.close();

            if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape)
                window.close();
        }


        // handle input
        if (Keyboard::isKeyPressed(Keyboard::Down))
        {
            obrazek2.setTexture(menu2);

        }
        if (Keyboard::isKeyPressed(Keyboard::Up))
        {
            obrazek3.move(0.0f, -1.0f);
        }

        


        if (clock.getElapsedTime().asSeconds() > 0.10f)
        {
            if (rectSourceSprite.left == 908)
                rectSourceSprite.left = 0;
            else
                rectSourceSprite.left += 454;
            obrazek2.setTextureRect(rectSourceSprite);
            clock.restart();
        }

        window.clear(Color::Black);
        window.draw(obrazek);
        window.draw(obrazek2);
        window.display();
    }


    return 0;
}
1

Moim zdaniem problem z tym kodem jest taki że wciskając strzałkę do dołu ciągle ustawiasz nową teksturę i ona nie zdąża się tak jakby wyrenderować, spróbuj poszukać jak przechwytywać pojedyńcze wciśnięcie klawisza klawiatury. Z tego co pamiętam obsługę klawiatury też powinieneś trzymać w pętli do obsługi eventów a nie poza nią.

Od razu zaznaczam że mogę bredzić bo SFMLem bawiłem się jakieś 5 lat temu.

0

@MrMadMatt: W dokumentacji piszą, że KeyPressed działa z częstotliwością systemu operacyjnego:

If a key is held, multiple KeyPressed events will be generated, at the default operating system delay (ie. the same delay that applies when you hold a letter in a text editor). To disable repeated KeyPressed events, you can call window.setKeyRepeatEnabled(false).

https://www.sfml-dev.org/tutorials/2.5/window-events.php

0

A może zmienić położenie sprite'a po naciśnięciu klawisza w dół ? Może jest obrazek ustawiony poza "kadrem".

2

Ten IntRect jest źle zdefiniowany:
IntRect rectSourceSprite(454, 187, 454, 187);

Wycinasz z tekstury zerowy obrazek...

The sf::IntRect class is a simple utility type that represents a rectangle. Its constructor takes the coordinates of the top-left corner, and the size of the rectangle.

https://www.sfml-dev.org/tutorials/2.5/graphics-sprite.php

1 użytkowników online, w tym zalogowanych: 0, gości: 1