Schulze13 Temat założony przez niniejszego użytkownika |
[SFML] Własne menu - nie działa » 2012-06-08 17:07:33 Witam, Od paru godzin meczę się nad wykonaniem eventu z menu. Wygląda to następująco. kMenu ma vectora kPrzycisk. kPrzycisk posiada akcje. Po kliknięciu do akcjaMenu ma zostać skopiowana akcja i za pomocą switch wykonana. Podświetlanie przycisków działa. Poniżej pokazuje kod main.cpp
sf::Image logoObraz; logoObraz.LoadFromFile( "4WorldCityLogo.png" ); int const menuSzer = 60;
akcja akcjaMenu;
kMenu menuMain;
menuMain.DodajPrz( menuSzer, 300 - 25, 170, 170, 170, "Witryna 4WorldCity", www ); menuMain.DodajPrz( menuSzer, 375 - 25, 170, 170, 170, "Opcje", opcje ); menuMain.DodajPrz( menuSzer, wyso -( menuSzer + 50 ), 200, 50, 50, "Wyjdz", exitG );
(...) while( oknoAplikacji.IsOpened() ) { const sf::Input & sterowanie = oknoAplikacji.GetInput(); sf::Vector2f mysz = oknoAplikacji.ConvertCoords( sterowanie.GetMouseX(), sterowanie.GetMouseY() ); sf::Event zdarzenie; while( oknoAplikacji.GetEvent( zdarzenie ) ) { if( zdarzenie.Type == sf::Event::Closed ) oknoAplikacji.Close(); if( zdarzenie.Type == sf::Event::MouseButtonPressed && zdarzenie.MouseButton.Button == sf::Mouse::Middle ) { akcjaMenu = menuMain.zaznacz( mysz ); switch( akcjaMenu ) { case 1: oknoAplikacji.Close(); break; default: break; } } } }
kPrzycisk.h #pragma once #include <SFML/Graphics.hpp> #include <string> #include <iostream> using namespace std;
typedef unsigned int uint;
enum akcja { nic, exitG, www, opcje, grajO };
class kPrzycisk { public: kPrzycisk( float newX, float newY, float newX2, float newY2, uint red, uint green, uint blue, string newTekst, akcja newAkcja ) { myX = newX; myY = newY; myX2 = newX2; myY2 = newY2; uint red2 = red + 50; uint green2 = green + 50; uint blue2 = blue + 50; myAkcja = newAkcja; if( red2 > 255 ) red2 = 255; if( green2 > 255 ) green2 = 255; if( blue2 > 255 ) blue2 = 255; przycisk.AddPoint( myX, myY, sf::Color( red2, green2, blue2 ), sf::Color::White ); przycisk.AddPoint( myX2, myY, sf::Color( red2, green2, blue2 ), sf::Color::White ); przycisk.AddPoint( myX2, myY2, sf::Color( red, green, blue ), sf::Color::White ); przycisk.AddPoint( myX, myY2, sf::Color( red, green, blue ), sf::Color::White ); przycisk.SetOutlineWidth( 5 ); tekst.SetText( newTekst ); tekst.SetPosition( myX + 30, myY + 15 ); tekst.SetScale( 0.5, 0.5 ); int redT = 0; int greenT = 0; int blueT = 0; tekst.SetColor( sf::Color( redT, greenT, blueT ) ); return; } ~kPrzycisk( void ); sf::Shape pokazP() { return przycisk; } sf::String pokazT() { return tekst; } void ramkaOn() { przycisk.EnableOutline( true ); } void ramkaOff() { przycisk.EnableOutline( false ); } akcja getAkcja() { return myAkcja; } float getX() { return myX; } float getX2() { return myX2; } float getY() { return myY; } float getY2() { return myY2; } private: sf::Shape przycisk; sf::String tekst; akcja myAkcja; float myX; float myY; float myX2; float myY2; };
kMenu.h #pragma once #include <vector> #include "kPrzycisk.h" class kMenu { public: kMenu( void ); ~kMenu( void ); void DodajPrz( int newX, int newY, uint red, uint green, uint blue, string newTekst, akcja newAkcja ) { ptr = NULL; int newX2 = newX + 200; int newY2 = newY + 50; pozycjaX.push_back( newX ); pozycjaX2.push_back( newX2 ); pozycjaY.push_back( newY ); pozycjaY2.push_back( newY2 ); ptr = new kPrzycisk( newX, newY, newX2, newY2, red, green, blue, newTekst, newAkcja ); listaP.push_back( * ptr ); delete ptr; } void pokaz( sf::RenderWindow & okno ) { for( int i = 0; i < listaP.size(); i++ ) { okno.Draw( listaP[ i ].pokazP() ); okno.Draw( listaP[ i ].pokazT() ); } } void podswietl( sf::Vector2f & myszCoord ) { for( int i = 0; i < listaP.size(); i++ ) { myMyszX = myszCoord.x; myMyszY = myszCoord.y; bool bCzyZaznaczony = ( myMyszX >= listaP[ i ].getX() && myMyszY >= listaP[ i ].getY() && myMyszX <= listaP[ i ].getX2() && myMyszY <= listaP[ i ].getY2() ); if( bCzyZaznaczony == true ) { std::cout << "\rtrue"; listaP[ i ].ramkaOn(); } else { std::cout << "\rfalse"; listaP[ i ].ramkaOff(); } } } akcja zaznacz( sf::Vector2f & myszCoord ) { for( int i = 0; i < listaP.size(); i++ ) { myMyszX = myszCoord.x; myMyszY = myszCoord.y; bool bCzyZaznaczony = ( myMyszX >= listaP[ i ].getX() && myMyszY >= listaP[ i ].getY() && myMyszX <= listaP[ i ].getX2() && myMyszY <= listaP[ i ].getY2() ); if( bCzyZaznaczony == true ) { std::cout << "\n AKCJA"; return listaP[ i ].getAkcja(); } else { return nic; } } } private: kPrzycisk * ptr; std::vector < kPrzycisk > listaP; std::vector < float > pozycjaX; std::vector < float > pozycjaX2; std::vector < float > pozycjaY; std::vector < float > pozycjaY2; float myMyszX; float myMyszY; };
|