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

[SFML] Strzelanie - mały problem

Ostatnio zmodyfikowano 2012-06-22 00:38
Autor Wiadomość
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.

C/C++
#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 );

// ----------------------------------- Global Var ----------------------------------
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" );
   
    // Loading sprites
    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.rar

Jak coś to jest SFML 2.0
P-58735
malan
» 2012-06-20 01:05:14
Wiesz co to jest
static
?
P-58736
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.
P-58775
Drraven
» 2012-06-20 17:45:03
static sf::Vector2f
 a samo:
sf::Vector2f
 nie zadziała ?
P-58777
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.
P-58779
Drraven
» 2012-06-20 18:13:02
To niech sobie strzeli a jak ma lecieć zapisz w innej zmiennej :D
P-58780
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ę.
P-58850
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
P-58856
« 1 » 2
  Strona 1 z 2 Następna strona