LukiPRO Temat założony przez niniejszego użytkownika |
[SFML] Strzelanie - mały problem » 2012-06-19 23:22:39 Witam, mam mały problem z moją grą. (tak wiem że nie powinienem tak pisać ale jeszcze się uczę klas itd) Otóż problem polega na tym że jak strzele raz to pocisk zawsze leci w tym samym kierunku nawet gdy obrócę się w innym kierunku. #include <SFML/Graphics.hpp> #include <SFML/System.hpp> #include <iostream> #include <fstream>
#define M_PI 3.14159265 #define BLOCKSIZE 40
sf::VideoMode TrybVideo( 1000, 720, 32 );
float charSpeed = 3.0f, bulletSpeed = 8.0f; bool canShoot = false; int loadCounterX = 0, loadCounterY = 0; int mapSizeX, mapSizeY; int MapFile[ 100 ][ 100 ];
void LoadMap( const char * filename ) { std::fstream openfile( filename ); if( openfile.is_open() ) { openfile >> mapSizeX >> mapSizeY; while( !openfile.eof() ) { openfile >> MapFile[ loadCounterX ][ loadCounterY ]; loadCounterX++; if( loadCounterX >= mapSizeX ) { loadCounterX = 0; loadCounterY++; } } } }
void DrawMap( sf::RenderWindow & game ) { sf::Texture grassTex; grassTex.loadFromFile( "gfx/grass.png" ); sf::Sprite grassSpr( grassTex ); sf::Texture waterTex; waterTex.loadFromFile( "gfx/water.png" ); sf::Sprite waterSpr( waterTex ); sf::Texture roadTex; roadTex.loadFromFile( "gfx/road.png" ); sf::Sprite roadSpr( roadTex ); sf::Sprite tempSpr; for( int i = 0; i < mapSizeX; i++ ) { for( int j = 0; j < mapSizeY; j++ ) { if( MapFile[ i ][ j ] == 0 ) { tempSpr = waterSpr; } else if( MapFile[ i ][ j ] == 1 ) { tempSpr = grassSpr; } else if( MapFile[ i ][ j ] == 2 ) { tempSpr = roadSpr; } tempSpr.setPosition( i * BLOCKSIZE, j * BLOCKSIZE ); game.draw( tempSpr ); } } }
void Controll( sf::Sprite & playerSpr ) { float char_dir = playerSpr.getRotation(); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) || sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) { playerSpr.move( charSpeed *( sin( char_dir * 3.14 / 180 ) ), charSpeed *( - cos( char_dir * 3.14 / 180 ) ) ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) || sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) { playerSpr.move( charSpeed *( - sin( char_dir * 3.14 / 180 ) ), charSpeed *( cos( char_dir * 3.14 / 180 ) ) ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) || sf::Keyboard::isKeyPressed( sf::Keyboard::D ) ) { playerSpr.rotate( 2.0f ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) || sf::Keyboard::isKeyPressed( sf::Keyboard::A ) ) { playerSpr.rotate( - 2.0f ); } }
void MapBorder( sf::Sprite & player ) { if( player.getPosition().x > TrybVideo.width - 32 ) { player.move( - charSpeed, 0.0f ); } if( player.getPosition().x < 32 ) { player.move( charSpeed, 0.0f ); } if( player.getPosition().y > TrybVideo.height - 32 ) { player.move( 0.0f, - charSpeed ); } if( player.getPosition().y < 32 ) { player.move( 0.0f, charSpeed ); } }
int main() { sf::RenderWindow GameWindow( TrybVideo, "Game v1 by luki0700" ); LoadMap( "maps/Map1.txt" ); sf::Texture mainCharTex; if( !mainCharTex.loadFromFile( "gfx/main1.png" ) ) return EXIT_FAILURE; sf::Sprite mainCharSpr( mainCharTex ); mainCharSpr.setPosition( 300.0f, 300.0f ); mainCharSpr.setOrigin( mainCharTex.getSize().x / 2, mainCharTex.getSize().y / 2 ); sf::Texture mainCharTex2; if( !mainCharTex2.loadFromFile( "gfx/main2.png" ) ) return EXIT_FAILURE; sf::Texture bulletTex; if( !bulletTex.loadFromFile( "gfx/bullet.png" ) ) return EXIT_FAILURE; sf::Sprite bulletSpr( bulletTex ); bulletSpr.setPosition( 300.0f, 300.0f ); bulletSpr.setOrigin( bulletTex.getSize().x / 2, bulletTex.getSize().y / 2 ); GameWindow.setFramerateLimit( 60 ); while( GameWindow.isOpen() ) { sf::Event zdarzenie; while( GameWindow.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) GameWindow.close(); if(( zdarzenie.type == sf::Event::KeyPressed ) &&( zdarzenie.key.code == sf::Keyboard::Escape ) ) GameWindow.close(); if(( zdarzenie.type == sf::Event::KeyPressed ) &&( zdarzenie.key.code == sf::Keyboard::LShift ) ) charSpeed = 6.0f; if(( zdarzenie.type == sf::Event::KeyReleased ) &&( zdarzenie.key.code == sf::Keyboard::LShift ) ) charSpeed = 3.0f; if(( zdarzenie.type == sf::Event::KeyPressed ) &&( zdarzenie.key.code == sf::Keyboard::Space ) ) { std::cout << "Test" << std::endl; canShoot = true; bulletSpr.setPosition( mainCharSpr.getPosition().x + 16, mainCharSpr.getPosition().y + 16 ); } } Controll( mainCharSpr ); MapBorder( mainCharSpr ); GameWindow.clear( sf::Color( 255, 255, 255 ) ); DrawMap( GameWindow ); if( canShoot ) { static sf::Vector2f dir( bulletSpeed *( sin( mainCharSpr.getRotation() * 3.14 / 180 ) ), bulletSpeed *( - cos( mainCharSpr.getRotation() * 3.14 / 180 ) ) ); GameWindow.draw( bulletSpr ); bulletSpr.move( dir.x, dir.y ); } GameWindow.draw( mainCharSpr ); GameWindow.display(); } return 0; } Wiem że coś źle zrobiłem w if(canShoot) ale nie wiem co zmienić żeby pocisk leciał tam gdzie się patrzymy. Tutaj exe żeby zobaczyć o co chodzi. https://rapidshare.com/files/4066048104/Zombie_Killer.rarJak coś to jest SFML 2.0 |
|
malan |
» 2012-06-20 01:05:14 |
|
LukiPRO Temat założony przez niniejszego użytkownika |
» 2012-06-20 17:41:06 Ahh tutaj też jest błąd widzę...
No to już wiem czemu leci zawsze w tym samym kierunku. Bo dzięki static wartość jest przechowywana przez cały czas działania aplikacji i się nie zmienia.
To zamiast static muszę czegoś innego użyć tylko nie wiem czego :( Pytałem kumpla co on sądzi i też mi polecił static ;/ Już sam nie wiem. |
|
Drraven |
» 2012-06-20 17:45:03 static sf::Vector2f a samo: sf::Vector2f nie zadziała ? |
|
LukiPRO Temat założony przez niniejszego użytkownika |
» 2012-06-20 18:03:01 jak użyję sf::Vector2f to zawsze strzela tam gdzie patrzę ale gdy się obracam to pocisk też się obraca - czyli patrze się w lewo potem strzelam to pocisk leci w lewo lecz gdy się obrócę w prawo to pocisk też skręca w prawo.
A chciałbym żeby pocisk po strzale leciał tam gdzie się patrzyłem i tak jakby zapomniał o kodzie czyli jak strzelę to moje obracanie nie ma wpływu na tor lotu pocisku. |
|
Drraven |
» 2012-06-20 18:13:02 To niech sobie strzeli a jak ma lecieć zapisz w innej zmiennej :D |
|
LukiPRO Temat założony przez niniejszego użytkownika |
» 2012-06-21 19:11:38 Próbowałem już kilka razy lecz za każdym razem gdy strzelam i się obracam to pocisk też się obraca razem z postacią. Jakieś pomysły jak to zrobić?
Nie proszę o gotowy kod bo nie chciałbym dostać gotowego rozwiązania a tylko podpowiedź/wskazówkę. |
|
waxx |
» 2012-06-21 20:05:47 Wystrzel, zapisz ten twoj wektor kierunku do zmiennej i potem updejtuj w innym miejscu niz tamtne if.
if(canshoot) { dir = sf::Vector2f(...); shooting = true; canshoot = false; }
if(shooting) { ruch czy co tam }
Choc najlepiej przeniesc pociski do osobnych obiektow :P
|
|
« 1 » 2 |