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

[SFML] Własne menu - nie działa

Ostatnio zmodyfikowano 2012-06-08 21:36
Autor Wiadomość
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
C/C++
/////////////////////////////////////////////////////////////////
//menu
sf::Image logoObraz;
logoObraz.LoadFromFile( "4WorldCityLogo.png" );
int const menuSzer = 60;

akcja akcjaMenu;
//PrzyciskiMenu
kMenu menuMain;
//menuMain.DodajPrz(60, 225-25, 170,170,170,"Multi",grajO);
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() ); //coordy myszy
    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;
            }
        }
       
    }
   
   
   
   
    //wyswietlanie
}

kPrzycisk.h
C/C++
#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 );
       
        //operacje na tekscie
        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 );
    }
   
   
    //akcesory
    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
C/C++
#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 ) //dostep do funkcji okna w main
    {
        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"; //debug
                listaP[ i ].ramkaOn();
               
            }
            else
            {
                std::cout << "\rfalse"; //debug
                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"; //debug
                return listaP[ i ].getAkcja();
            }
            else
            {
                return nic;
            }
           
        }
       
    }
   
   
private:
    kPrzycisk * ptr;
    std::vector < kPrzycisk > listaP;
    std::vector < float > pozycjaX; //never mind
    std::vector < float > pozycjaX2; //never mind
    std::vector < float > pozycjaY; //never mind
    std::vector < float > pozycjaY2; //never mind
    float myMyszX;
    float myMyszY;
   
};
P-58103
waxx
» 2012-06-08 21:36:43
Nie działa to trochę ogólne sformułowanie
P-58118
« 1 »
  Strona 1 z 1