[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 » |