Welcome, Guest. Please login or register. Did you miss your activation email?

Author Topic: Getting Integer Input  (Read 8028 times)

0 Members and 1 Guest are viewing this topic.

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Posts: 4321
    • View Profile
    • Email
Getting Integer Input
« Reply #15 on: August 15, 2010, 01:58:01 pm »
I can't do your app for you.  :wink:

But a little sample :
Code: [Select]

main loop (window is open for example)

 event loop

  if (my_state is s0 and event is KeyPressed and the key is A) then

   my_state is s1

  end if

  if (my_state is s1 and event is TextEntred and the entred value is a number) then

   update my_string or whatever

    my_state is s2

  end if

 end event loop

end main loop


NB : you may do stuff outside event loop for some states.
SFML / OS X developer

Wander

  • Full Member
  • ***
  • Posts: 170
    • View Profile
    • Email
Getting Integer Input
« Reply #16 on: August 15, 2010, 01:58:49 pm »
OH!!! Hold on a second. :D
-Wander

Wander

  • Full Member
  • ***
  • Posts: 170
    • View Profile
    • Email
Getting Integer Input
« Reply #17 on: August 15, 2010, 02:05:51 pm »
Okay! Here's what I got. Only problem is. Nothing is displaying on the screen still.

Code: [Select]
           // Press A : Add coords
            if (myState == s0 && (Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::A))
            {
                PressA = true;
                myState = s1;
            }
            if (myState == s1 && Event.Type == sf::Event::TextEntered)
            {
                // Handle ASCII characters only
                if (Event.Text.Unicode > 47 && Event.Text.Unicode < 58)
                {
                    XCoord += static_cast<int>(Event.Text.Unicode);
                    text.SetText(XCoord);
                    myState = s2;
                }
                else {
                    text.SetText("");
                }
            }
-Wander

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Posts: 4321
    • View Profile
    • Email
Getting Integer Input
« Reply #18 on: August 15, 2010, 02:08:36 pm »
This won't display anything, you have to use Display and Draw.

BTW, you may want to use some smarter names than s0 s1, and so on. It was only for the example.  :wink:
SFML / OS X developer

Wander

  • Full Member
  • ***
  • Posts: 170
    • View Profile
    • Email
Getting Integer Input
« Reply #19 on: August 15, 2010, 02:11:21 pm »
I do have a Draw and Display. I just didnt paste em.

Code: [Select]
bool PressA = false;
std::string XCoord;
sf::String text;


if (myState == s0 && (Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::A))
            {
                PressA = true;
                myState = s1;
            }
            if (myState == s1 && Event.Type == sf::Event::TextEntered)
            {
                // Handle ASCII characters only
                if (Event.Text.Unicode > 47 && Event.Text.Unicode < 58)
                {
                    XCoord += static_cast<int>(Event.Text.Unicode);
                    text.SetText(XCoord);
                    myState = s2;
                }
                else {
                    text.SetText("");
                }
            }


if (PressA == true)
   App.Draw(text);

App.Display();


EDIT: I added a cout statement into the if statement with static_cast and found out that the code never even enters that one. Why not?
-Wander

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Posts: 4321
    • View Profile
    • Email
Getting Integer Input
« Reply #20 on: August 15, 2010, 02:17:20 pm »
Maybe it's too small, out of screen, … I don't know. But you can use std::cout to check if it working.
SFML / OS X developer

Wander

  • Full Member
  • ***
  • Posts: 170
    • View Profile
    • Email
Getting Integer Input
« Reply #21 on: August 15, 2010, 02:19:17 pm »
I did. In my EDIT on the last post I said:

Quote
EDIT: I added a cout statement into the if statement with static_cast and found out that the code never even enters that one. Why not?


So, now I'm stuck...
-Wander

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Posts: 4321
    • View Profile
    • Email
Getting Integer Input
« Reply #22 on: August 15, 2010, 02:22:50 pm »
does «if (myState == s0 && (Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::A))» work ?
SFML / OS X developer

Wander

  • Full Member
  • ***
  • Posts: 170
    • View Profile
    • Email
Getting Integer Input
« Reply #23 on: August 15, 2010, 02:24:31 pm »
Yes. I have it where it says "ONE" for the first if statement, "TWO" for the second one and "THREE" for the third one.

It never makes it past "ONE"
-Wander

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Posts: 4321
    • View Profile
    • Email
Getting Integer Input
« Reply #24 on: August 15, 2010, 02:26:46 pm »
Very strange. Can you give us the whole main function ?
SFML / OS X developer

Wander

  • Full Member
  • ***
  • Posts: 170
    • View Profile
    • Email
Getting Integer Input
« Reply #25 on: August 15, 2010, 02:27:53 pm »
Sure.

Code: [Select]
int main()
{
    //sf::Thread PrintFile(&PrintFile);
    //PrintFile.Launch();

    //ifstream inFile; // Declare inFile
    //ofstream outFile; // Declare outFile

    bool PressA = false;
    std::string XCoord;
    sf::String text;

    sf::RenderWindow App(sf::VideoMode::GetMode(0), "Laz's Interactive Map :: The Wrath... :: PvP Created");
    App.ShowMouseCursor(true);
    bool windowed = true;
    sf::VideoMode DesktopMode = sf::VideoMode::GetDesktopMode();

    sf::Font TypeKnight;
    if (!TypeKnight.LoadFromFile("Knights Templar.ttf"))
    {
        return EXIT_FAILURE;
    }
    sf::String TopLeft("Text Input: ________________");
    TopLeft.SetFont(TypeKnight);
    TopLeft.Move(10,10);
    TopLeft.SetColor(sf::Color::White);

    sf::String Main("Press F12 to toggle the help menu");
    Main.SetFont(TypeKnight);
    Main.Move(10.f, 600.f);
    Main.SetColor(sf::Color::White);

    bool help = false;
    sf::String Help("Type A to add a coordinate\n\nType R to remove a coordinate\n\nType F to find a coordinate\n\nPress F1 to toggle FullScreen mode\n\nPress ESC to exit the program\n\nPress F12 to toggle the help menu");
    Help.SetFont(TypeKnight);
    Help.Move(10.f,300.f);

    sf::String CopyRight("CopyRight 2010 Tyler Petresky :: All program code is subject to CopyRight Laws");
    CopyRight.SetFont(TypeKnight);
    CopyRight.SetColor(sf::Color::White);
    CopyRight.Move(1300.f, 125.f);
    CopyRight.Scale(0.5f, 0.5f);
    CopyRight.Rotate(-90);

    // Creates the PE map :: 7000x3000
    sf::Shape MapPh;
    MapPh.AddPoint(0,0,sf::Color(0,100,0));
    MapPh.AddPoint(7000,0,sf::Color(0,100,0));
    //MapPh.AddPoint(3500,1500,sf::Color(0,125,0));
    MapPh.AddPoint(7000,3000,sf::Color(0,100,0));
    MapPh.AddPoint(0,3000,sf::Color(0,100,0));
    MapPh.EnableFill(true);
    MapPh.EnableOutline(false);
    MapPh.SetOutlineWidth(10);

    sf::Shape PhMid = sf::Shape::Line(3000, 0, 3000, 3000, 20, sf::Color::Black);
    sf::Shape DrMid = sf::Shape::Line(4000, 0, 4000, 3000, 20, sf::Color::Black);

    sf::Vector2f Center(3500, 1500);
    sf::Vector2f HalfSize(1750, 750);
    sf::View View(Center, HalfSize);
    View.Zoom(0.35f);

    // Main loop
    while (App.IsOpened())
    {
        /*int AdjWid;
        int AdjHei;
        int newWidth;
        int newHeight;
        int origWidth = App.GetWidth();
        int origHeight = App.GetHeight();*/
        // Event loop
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            /*if (Event.Type == sf::Event::Resized) {
                newWidth = App.GetWidth();
                newHeight = App.GetHeight();
                AdjWid = newWidth - origWidth;
                AdjHei = newHeight - origHeight;



            }*/

            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                App.Close();

            // Press escape : exit
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
                App.Close();

            // Press F1 : Switch video mode
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::F1)) {
                if (windowed == true) {
                    App.Create(DesktopMode, "Laz's Interactive Map :: The Wrath... :: PvP Created", sf::Style::Fullscreen);
                    windowed = false;
                }
                else {
                    App.Create(sf::VideoMode::GetMode(0), "Laz's Interactive Map :: The Wrath... :: PvP Created");
                    windowed = true;
                }
            }

            // Press F12 : Toggle help menu
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::F12)) {
                if (help == false) {
                    help = true;
                }
                else {
                    help = false;
                }
            }

            enum State { State0, State1, State2, State3 };
            State myState = State0;


            // Press A : Add coords
            if (myState == State0 && (Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::A))
            {
                std::cout << "ONE" << std::endl;
                PressA = true;
                myState = State1;
            }
            if (myState == State1 && (Event.Type == sf::Event::TextEntered))
            {
                std::cout << "TWO" << std::endl;
                // Handle ASCII characters only
                if (Event.Text.Unicode > 47 && Event.Text.Unicode < 58)
                {
                    std::cout << "THREE" << std::endl;
                    XCoord += static_cast<int>(Event.Text.Unicode);
                    text.SetText(XCoord);
                    myState = State2;
                }
                else {
                    text.SetText("");
                }
            }
        }



        float ElapsedTime = App.GetFrameTime();

        // Move the map around the screen
        float Offset = 2000.f * App.GetFrameTime();
        if (App.GetInput().IsKeyDown(sf::Key::Up))    View.Move( 0,      -Offset);
        if (App.GetInput().IsKeyDown(sf::Key::Down))  View.Move( 0,      Offset);
        if (App.GetInput().IsKeyDown(sf::Key::Left))  View.Move(-Offset,  0);
        if (App.GetInput().IsKeyDown(sf::Key::Right)) View.Move(Offset,  0);

        // Zoom and unzoom using + and - keys
        if (App.GetInput().IsKeyDown(sf::Key::Add))      View.Zoom(1.005f);
        if (App.GetInput().IsKeyDown(sf::Key::Subtract)) View.Zoom(0.994f);

        App.SetView(View);

            App.Clear();

            App.Draw(MapPh);
            App.Draw(PhMid);
            App.Draw(DrMid);

        // Reset to the default view to draw the interface
        App.SetView(App.GetDefaultView());

            App.Draw(TopLeft);

            if (help == true)
                App.Draw(Help);
            else
                App.Draw(Main);

            if (PressA == true)
                App.Draw(text);

            App.Draw(CopyRight);

            App.Display();
    }



    return 0;
}
-Wander

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Posts: 4321
    • View Profile
    • Email
Getting Integer Input
« Reply #26 on: August 15, 2010, 02:30:49 pm »
Each time the loop restart your state returns to s0. You have to create the var outside the loop.
SFML / OS X developer

Wander

  • Full Member
  • ***
  • Posts: 170
    • View Profile
    • Email
Getting Integer Input
« Reply #27 on: August 15, 2010, 02:33:26 pm »
IT WORKS!!!!! YEAH!!!! YOU'RE AWESOME!!!!!!! HAHAHA
Now, I need to make it accept up to four digits in the number and submit the number when the user hits ENTER.
-Wander

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Posts: 4321
    • View Profile
    • Email
Getting Integer Input
« Reply #28 on: August 15, 2010, 02:39:47 pm »
have fun!  :)

PS : there are so many way to do it, but you may want to use two state machine  :wink: (=> less brain damage for you)

Code: [Select]
enum STATEMACHINE1 { waiting_for_A, waiting_for_four_digits_first_time, *_second_time, ...};
enum STATEMACHINE2 { waiting_for_digits_1, *_2, ... };

--

if (myState == s1 && Event.Type == sf::Event::TextEntered) {
 do stuff with my_state_2



or use a counter, here it's much more light.

Code: [Select]

if (myState == s1 && Event.Type == sf::Event::TextEntered) {
if my_count < 4 then get the number and ++my_count.
SFML / OS X developer

Wander

  • Full Member
  • ***
  • Posts: 170
    • View Profile
    • Email
Getting Integer Input
« Reply #29 on: August 15, 2010, 02:41:01 pm »
Sweet! A For Loop sounds very nice right now. ;) Thanks again!
-Wander