[SFML, C++] Joystick, a szybkość działania gry
Ostatnio zmodyfikowano 2014-04-13 11:21
| 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
 #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;
 
 
 
 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 );
 
 
 
 
 
 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;
 
 
 
 
 
 
 while( app.isOpen() )
 {
 
 
 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;
 
 
 }
 
 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::Joystick::isButtonPressed( 0, 1 ) )
 updateFrame = true;
 else if( sf::Joystick::isButtonPressed( 0, 2 ) )
 updateFrame = false;
 
 
 
 
 
 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. | 
|  | 
| DejaVu | » 2014-04-08 10:32:12 Zweryfikuj jaką wartość zwraca Ci metoda statyczna:  sf::Joystick::getAxisPosition( 0, sf::Joystick::X ) . | 
|  | 
| 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;   :)
 
 | 
|  | 
| Wasilek | » 2014-04-13 11:21:09 Musisz zapewne dodać martwą strefę przez co minimalne odchylenia gałki nie będą powodowały poruszania.  | 
|  | 
| « 1 » |