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

[SFML, C++] Joystick, a szybkość działania gry

Ostatnio zmodyfikowano 2014-04-13 11:21
Autor Wiadomość
Tony_Smith
Temat założony przez niniejszego użytkownika
[SFML, C++] Joystick, a szybkość działania gry
» 2014-04-07 23:58:26
Witam. Jest to mój pierwszy temat.
Przerabiam kurs SFML 2.0 z Youtube i mój kod wygląda następująco

C/C++
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <iostream>
#include <cstdlib>
#include <string>
#include <ctime>
#include <cstdlib>

int main()
{
   
   
   
   
    enum Direction { Down, Left, Right, Up };
   
    sf::Vector2i source( 1, Down );
   
    float frameCounter = 0, switchFrame = 100, frameSpeed = 500;
   
   
    // Create the main window
    sf::RenderWindow app;
    app.create( sf::VideoMode( 800, 600 ), "My first game" );
   
   
    sf::Texture pTexture;
    sf::Sprite playerImage;
    sf::Clock clock;
   
    bool updateFrame = true;
   
    if( !pTexture.loadFromFile( "image.png" ) )
         std::cout << "Error could not load player image" << std::endl;
   
    playerImage.setTexture( pTexture );
    //playerImage.setPosition(100, 100);
   
    //sf::Vector2u size(600,600);
    //std::cout << size.x << " " << size.y << std::endl;
   
    app.setSize( sf::Vector2u( 600, 600 ) );
    app.setTitle( "Coding made easy" );
    app.setPosition( sf::Vector2i( 500, 300 ) );
   
   
   
    if( sf::Joystick::isConnected( 0 ) )
         std::cout << "Joystick 1 is connected." << std::endl;
    else
         std::cout << "Joystick 1 is NOT connected." << std::endl;
   
    int buttonCount = sf::Joystick::getButtonCount( 0 );
    std::cout << buttonCount << std::endl;
   
    //bool hasAxis = sf::Joystick::hasAxis(0, sf::Joystick::Z);
   
   
   
    // Start the game loop
    while( app.isOpen() )
    {
        // Process events
       
        sf::Event event;
        while( app.pollEvent( event ) )
        {
            switch( event.type )
            {
            case sf::Event::Closed:
                app.close();
                break;
            case sf::Event::GainedFocus:
                std::cout << "Window is active. " << std::endl;
                break;
            case sf::Event::LostFocus:
                std::cout << "Window is NOT active. " << std::endl;
                break;
            case sf::Event::Resized:
                std::cout << "Width: " << event.size.width << " Height: " << event.size.height << std::endl;
                break;
            case sf::Event::JoystickConnected:
                std::cout << "Joystick " << event.joystickConnect.joystickId + 1 << " is connected" << std::endl;
                break;
            case sf::Event::JoystickDisconnected:
                std::cout << "Joystick " << event.joystickConnect.joystickId + 1 << " is diconnected" << std::endl;
                break;
            case sf::Event::JoystickButtonPressed:
                std::cout << "Button: " << event.joystickButton.button << std::endl;
                break;
               
               
            }
            // Close window : exit
            if( event.type == sf::Event::Closed )
                 app.close();
           
            if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape )
                 app.close();
           
           
        }
       
        sf::Vector2f moveSpeed( sf::Joystick::getAxisPosition( 0, sf::Joystick::X ),
        sf::Joystick::getAxisPosition( 0, sf::Joystick::Y ) );
       
        if( moveSpeed.x > 0 )
             source.y = Right;
        else if( moveSpeed.x < 0 )
             source.y = Left;
        else if( moveSpeed.y < 0 )
             source.y = Up;
        else if( moveSpeed.y > 0 )
             source.y = Down;
       
        playerImage.move( moveSpeed.x * clock.getElapsedTime().asSeconds(),
        moveSpeed.y * clock.getElapsedTime().asSeconds() );
       
        /*if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
        {
        source.y = Up;
        playerImage.move(0, -1);
        }
       
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
        {
        source.y = Down;
        playerImage.move(0, 1);
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
        {
        source.y = Right;
        playerImage.move(1, 0);
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
        {
        source.y = Left;
        playerImage.move(-1, -0);
        }*/
       
       
       
       
       
        if( sf::Joystick::isButtonPressed( 0, 1 ) )
             updateFrame = true;
        else if( sf::Joystick::isButtonPressed( 0, 2 ) )
             updateFrame = false;
       
       
       
       
        // Update the window
        std::cout << clock.getElapsedTime().asSeconds() << std::endl;
       
       
        frameCounter =( updateFrame ) ? frameCounter + frameSpeed * clock.restart().asSeconds()
            : 0;
       
        if( frameCounter >= switchFrame )
        {
            frameCounter = 0;
            source.x++;
            if( source.x * 32 >= pTexture.getSize().x )
                 source.x = 0;
           
        }
       
       
       
       
       
        playerImage.setTextureRect( sf::IntRect( source.x * 32, source.y * 32, 32, 32 ) );
        app.draw( playerImage );
        app.display();
        app.clear();
       
       
       
    }
   
    return EXIT_SUCCESS;
   
   
}
Moja postać to tesktura 12 postaci w różnej fazie ruchu, w różnym kierunku, a wygląda to tak http://www.famitsu.com/freegame/tool/chibi/index1.html
Dodałem kod app.setVerticalSyncEnabled( true ); i skoro SFML działa ns vsync'u to limit klatek się ustawił i postać porusza się z taką samą prędkością klatek na każdym komputerze niezależnie od parametrów pceta. Pytanie czy pad od xboxa to dobry kontroler pod SFML? Ponieważ gdy ustawię sterowanie klawiaturą(kod skomentowany wyżej) i zatrzymam odświeżanie animacji to ona działa poprawnie(zatrzymuje się jedna figura z dwunastu), a gdy steruję padem i zatrzymam odświerzanie(updateFrame = false) to moja postać ucieka mi za ekran. Co tu jest nie tak w kodzie od sterowania joystickiem lub to wina pada?
Wybaczcie za poprzednio źle sprecyzowane pytanie i poprzedni tytuł tematu.


Pozdrawiam
Tony.
P-107880
DejaVu
» 2014-04-08 10:32:12
Zweryfikuj jaką wartość zwraca Ci metoda statyczna:
sf::Joystick::getAxisPosition( 0, sf::Joystick::X )
.
P-107890
Tony_Smith
Temat założony przez niniejszego użytkownika
» 2014-04-08 19:37:54
W jaki sposób mam to zrobić? sf::Vector2f moveSpeed (sf::Joystick::getAxisPosition(0, sf::Joystick::X) mam to wziąć w cout?
Z dokumentacji wynika, że:
If the joystick is not connected, this function returns 0.
Returns
    Current position of the axis, in range [-100 .. 100]
Gdy steruję klawiaturą to postać nie przemieszcza się gdy nie używam strzałek, natomiast w przypadku udziału analogu postać cały czas się rusza, gdy nadam jej kierunek i przemieszcza się powoli, nawet gdy puszczę analog.

Przed dotknięciem analogu zaraz po uruchomieniu aplikacji wartość zwracana na konsoli to : - 0,0015259 przy użyciu std::cout << sf::Joystick::getAxisPosition(0, sf::Joystick::X)  << std::endl;   :)
P-107925
Wasilek
» 2014-04-13 11:21:09
Musisz zapewne dodać martwą strefę przez co minimalne odchylenia gałki nie będą powodowały poruszania.
P-108101
« 1 »
  Strona 1 z 1