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

Jak stworzyć kilku przyciskowe menu w SFML 2.0 ?

Ostatnio zmodyfikowano 2013-07-24 14:15
Autor Wiadomość
pekfos
» 2013-07-22 20:31:26
W tutorialu SFMLa 1.6 piszą, że SFML 1.6 nie ma takiego narzędzia, więc w SFML 2.0 też tego nie ma. Logika! Powiem więcej: to narzędzie nazywa się sf::RenderTexture.
P-88598
domin568
Temat założony przez niniejszego użytkownika
» 2013-07-23 09:14:18
Rafi , a o co chodzi z PosXY ?
P-88606
Rafi
» 2013-07-23 09:58:23
Hmm, moja wina - nie wkleiłem całego kodu.
C/C++
sf::Vector2i posXY( sprite.getGlobalBounds().width, sprite.getGlobalBounds().height );
sf::Vector2i posS( sprite.getGlobalBounds().left, sprite.getGlobalBounds().top );

if( posMouse.x >= posS.x && posMouse.x <= posS.x + posXY.x &&
posMouse.y >= posS.y && posMouse.y <= posS.y + posXY.y )

posXY przechowuje koordynaty x i y, a posS - lewego i górnego "punktu"(szczerze mówiąc, nie bardzo wiem, jak inaczej to wytłumaczyć).
P-88607
Admixior
» 2013-07-23 12:07:24
posXY przechowuje koordynaty x i y, a posS - lewego i górnego "punktu"(szczerze mówiąc, nie bardzo wiem, jak inaczej to
1.z tego wynika że posXY nie przechowuje koordynatów (bo koordynaty to musi być konkretny punkt) tylko rozmiar.
2.posS przechowuje koordynaty położenia danej rzeczy
3.Trochę się namęczyłeś, a nie potrzebnie przy sprawdzaniu czy myszka jest w prostokącie
Można tak:
C/C++
if( sprite.getGlobalBounds().contains( posMouse ) ) //kliknięte
4.Jak chcesz zrobić  menu i przyciski to możesz to wszystko upakować w klasy i będzie prosto


//kawałek z mojego projektu
C/C++
#pragma once
#include ....//co jest potrzebne
////////////////////////////////////////////////
///************* < B U T T O N > ************///
////////////////////////////////////////////////

class Button
{
    bool mouseover
    , enable;
    sf::Font font;
    sf::String text;
    int bID; //button ID
   
    Button();
public:
    Button( std::string _text, unsigned int size_font, sf::Vector2f centerpos, int button_id, short int RCid_font );
    void SetEnable( bool enable ); //wlaczanie i wylaczanie
    bool SetMouseOver( bool _enable ); //myszka najechala na obj.
    int GetClicked( sf::Vector2f & pos ) //myszka na coś klikla
    {
        if( !enable ) return false;
       
        return in_rect( pos );
    }
    int MouseMove( sf::Vector2f & pos ); //poruszenie myszki (dotyczy mouseover)
    bool in_rect( sf::Vector2f & pos ); //sprawdzanie czy jest "najechane"(mouseover)
    int buttonMove( float x, float y ); //przemieszczenie przycisku
    int Draw( sf::RenderWindow & wnd ); //i rysowanie na ekran
};


namespace std_menu //gdzieś w pliku cpp jest definicja tych obiektow
{
    extern Button button_1;
    extern Button button_2;
    extern Button button_3;
    extern Button button_4;
};

//
class Menu
{
    std::vector < Button *> przyciski; //wszystkie  przyciski (a raczej wskaźniki
    sf::Image background_img;
    sf::Sprite backgorund;
   
public:
    Menu( float show_pos );
    ~Menu( void );
   
    //dla każdego przycisku:
    int MouseClick( sf::Vector2f & pos );
    int MouseMove( sf::Vector2f & pos );
   
    int AddButton( Button * button );
    int ClearButton( void ) { przyciski.clear(); return 0; }
    Button * GetButtonById( unsigned int id ) //to sie rzadko kiedy przydaje
    {
        if( przyciski.size() > id ) return przyciski[ id ];
        else return 0;
       
    }
    int Draw( sf::RenderWindow & wnd ); //rysowanie wszyskkiego
};
P-88609
CodeMeister
» 2013-07-23 12:46:37
@Amixior
Kod z Ortomaniaka? :P

@CodeMeister
Offtop?

~pekfos
@CodeMeister
Tak. (Trochę obcięty)

~Admixior
P-88610
domin568
Temat założony przez niniejszego użytkownika
» 2013-07-23 14:30:41
Rafi , twój sposób nie działa , zrobiłem tak jak Ty , ale gdy klikam w kwadrat to nie wypisuje mi nic w konsole (wcześniej sobie to zrobiłem ) , Admixior twój kod z jedną linijką również nie działa bo jest błąd z ".contains (posMouse) . Dam wam mój cały kod z aplikacji , wiem że jest pełno pamięci zmarnowanej ale dopiero ucze się wykorzystywać funkcje więc nie chce tracić czasu .
Błąd to : " IntelliSense: no instance of overloaded function "sf::Rect<T>::contains [with T=float]" matches the argument list
            argument types are: (sf::Vector2i)
            object type is: sf::FloatRect "

Kod :

C/C++
// Pierwsze Menu.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <SFML/Window.hpp>
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
#include <cstdlib>
using namespace std;
int _tmain( int argc, _TCHAR * argv[] )
{
    sf::Event zdarzenie;
    sf::RenderWindow okno( sf::VideoMode( 600, 480, 32 ), "Pierwsze menu" );
    sf::Font czcionka;
   
   
   
    sf::Clock Clock;
    float last_time = 0.f;
   
    if( !czcionka.loadFromFile( "arial.ttf" ) )
    {
        cout << " Niestety nie udalo sie zaladowac czcionki " << endl;
    }
   
    sf::Mouse myszka;
   
   
   
    sf::Text tekst;
    tekst.setFont( czcionka );
    tekst.setString( "START" );
    tekst.setCharacterSize( 12 );
    tekst.setColor( sf::Color( 255, 0, 0 ) );
    tekst.setPosition( tekst.getPosition().x + 12, tekst.getPosition().y + 12 );
   
    sf::Text tekst2;
    tekst2.setFont( czcionka );
    tekst2.setString( "WYJSCIE" );
    tekst2.setCharacterSize( 12 );
    tekst2.setColor( sf::Color( 255, 0, 0 ) );
    tekst2.setPosition( tekst2.getPosition().x + 200, tekst2.getPosition().y + 12 );
   
   
    sf::RectangleShape kwadrat;
    kwadrat.setOutlineColor( sf::Color( 0, 255, 0 ) );
    kwadrat.setOutlineThickness( 5 );
    kwadrat.setSize( sf::Vector2f( 200, 200 ) );
    kwadrat.setPosition( 200, 200 );
    sf::Vector2i posMouse( myszka.getPosition().x, myszka.getPosition().x );
    sf::Vector2i posXY( kwadrat.getGlobalBounds().width, kwadrat.getGlobalBounds().height );
    sf::Vector2i posS( kwadrat.getGlobalBounds().left, kwadrat.getGlobalBounds().top );
    while( okno.isOpen() )
   
    {
       
       
       
       
       
       
        while( okno.pollEvent( zdarzenie ) )
        {
            float myszx = 0;
            float myszy = 0;
            float kwadratxxx = kwadrat.getPosition().x;
            float kwadratx = kwadrat.getSize().x;
            float kwadraty = kwadrat.getSize().y;
            if( zdarzenie.type == sf::Event::Closed )
            {
                okno.close();
            }
            if( zdarzenie.type == sf::Event::MouseButtonPressed )
            {
                myszx = myszka.getPosition( okno ).x;
                myszy = myszka.getPosition( okno ).y;
                cout << myszx << endl;
                cout << myszy << endl;
            }
            if( zdarzenie.type == sf::Event::MouseButtonPressed && kwadrat.getGlobalBounds().contains( posMouse ) )
            {
                cout << " aa " << endl;
            }
           
        }
       
       
       
        okno.draw( kwadrat );
        okno.draw( tekst );
        okno.display();
    }
    return 0;
}
P-88620
Rafi
» 2013-07-23 14:44:08
Pozycję myszy musisz sprawdzać za każdym razem, tzn.
sf::Vector2i posMouse( myszka.getPosition().x, myszka.getPosition().x );
 musi być w pętli eventów. Tyczy się też mojego sposobu (chociaż, po strawdzeniu wersji wykrywania Admixiora, wole jego :))

Btw. Admixior od czego jest ostatni argument w konstruktorze przycisku? Coś z czcionką?
P-88621
domin568
Temat założony przez niniejszego użytkownika
» 2013-07-23 14:52:26
No tak , zmieniłem , zrozumiałem o co chodzi xd , ale z tego co rozumiem w .contains (Vector2) musi tak być bo nie przyjmuje Vector2i :(
P-88622
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona