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. |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-07-23 09:14:18 Rafi , a o co chodzi z PosXY ? |
|
Rafi |
» 2013-07-23 09:58:23 Hmm, moja wina - nie wkleiłem całego kodu. 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ć). |
|
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: if( sprite.getGlobalBounds().contains( posMouse ) )
4.Jak chcesz zrobić menu i przyciski to możesz to wszystko upakować w klasy i będzie prosto //kawałek z mojego projektu #pragma once #include ....
class Button { bool mouseover , enable; sf::Font font; sf::String text; int bID; Button(); public: Button( std::string _text, unsigned int size_font, sf::Vector2f centerpos, int button_id, short int RCid_font ); void SetEnable( bool enable ); bool SetMouseOver( bool _enable ); int GetClicked( sf::Vector2f & pos ) { if( !enable ) return false; return in_rect( pos ); } int MouseMove( sf::Vector2f & pos ); bool in_rect( sf::Vector2f & pos ); int buttonMove( float x, float y ); int Draw( sf::RenderWindow & wnd ); };
namespace std_menu { extern Button button_1; extern Button button_2; extern Button button_3; extern Button button_4; };
class Menu { std::vector < Button *> przyciski; sf::Image background_img; sf::Sprite backgorund; public: Menu( float show_pos ); ~Menu( void ); 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 ) { if( przyciski.size() > id ) return przyciski[ id ]; else return 0; } int Draw( sf::RenderWindow & wnd ); };
|
|
CodeMeister |
» 2013-07-23 12:46:37 @Amixior Kod z Ortomaniaka? :P @CodeMeister Offtop?
~pekfos |
@CodeMeister Tak. (Trochę obcięty)
~Admixior |
|
|
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 :
#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; }
|
|
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ą? |
|
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 :( |
|
1 « 2 » 3 |