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

[SFML] strzelanie, problem z operatorem "<=" w pętli for

Ostatnio zmodyfikowano 2013-03-15 23:55
Autor Wiadomość
sajmon
Temat założony przez niniejszego użytkownika
[SFML] strzelanie, problem z operatorem "<=" w pętli for
» 2013-03-15 00:08:10
Witam wszystkich :) od razu zadręcze was moim problemem :P
Najpierw co wyrzuca mi kompilator:
1>------ Build started: Project: empty001, Configuration: Debug Win32 ------
1>  main.cpp
1>d:\programy\mvc2010\projects\empty001\empty001\main.cpp(39): warning C4018: '<=' : signed/unsigned mismatch
1>  LINK : D:\PROGRAMY\MVC2010\PROJECTS\empty001\Debug\empty001.exe not found or not built by the last incremental link; performing full link
1>  empty001.vcxproj -> D:\PROGRAMY\MVC2010\PROJECTS\empty001\Debug\empty001.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Mam 2 klasy Player oraz bullet dziedziczące z sf::Sprite. w klasie player mam map w którym przechowuje bullety aby je potem wyświetlić w głównym oknie
C/C++
class Bullet
    : public sf::Sprite
{
private:
    float maxSpeed;
   
public:
    float directionAngle;
    sf::Vector2f startPosition;
    Bullet();
    void move();
};

class Player
    : public sf::Sprite
{
public:
    std::map < int, Bullet > bullets;
    int bulletsNumber;

C/C++
void Player::shot()
{
    Bullet b;
   
    this->bullets[ this->bulletsNumber ] = b;
   
    b.startPosition.x = this->getPosition().x + this->getOrigin().x;
    b.startPosition.y = this->getPosition().y + this->getOrigin().y;
    b.directionAngle = this->rotationAngle;
    b.move();
   
    this->bulletsNumber++;
}

Bullet::Bullet()
{
    this->setOrigin( 2.5f, 2.5f );
    sf::Texture tekstura;
    tekstura.loadFromFile( "bullet.png" );
    this->setTexture( tekstura );
    this->setPosition( this->startPosition );
    this->maxSpeed = 20.f;
}

void Bullet::move()
{
    this->setPosition( this->getPosition().x +( this->maxSpeed * std::cos( this->directionAngle ) * - 1.f ), this->getPosition().y +( this->maxSpeed * std::sin( this->directionAngle ) * - 1.f ) );
}

No i teraz problematyczna linijka :C
C/C++
if( !player.bullets.empty() )
{
    for( int i = 0; i <= player.bullets.size(); i++ )
    {
        player.bullets[ i ].move();
        okno.draw( player.bullets[ i ] );
    }
}

Nie wiem dlaczego tak się dzieje :((((
Proszę grzecznie o pomoc :)

#EDIT:
zapomniałem dodać, że oczywiście po wywołaniu player.shot() okienko przywiesza się :CCCCCCC
P-78399
Admixior
» 2013-03-15 00:29:47
Problem (z tym błędem w linkerze[ aczkolwiek to nawet raczej nie w linkerze]) nie jest związany z "<=". Chociaż dozmiennej "i" może dodać unsigned
O ile jest z tym jakiś problem

//------------
1.Zerujesz zmienne?: bulletsNumber
2.Bullets to pocisk więc jak trafi w coś to jak go usuwasz? Czy "deinkrementujesz" wartość bulletsNumber? Jeśli tak to źle
3.
for( int i = 0; i <= player.bullets.size(); i++ )
: Czy aby jesteś świadom iż mapa nie koniecznie ma elementy  numerami po kolei?
tzn.. może być: [1], [2], [3], [6] ,[61], [234], ... // i co wtedy
Jeżeli nie deinkrementujesz bulletsnumber i nie usuwasz obiektów to nie powinno być problemów. Aczkolwiek lepiej użyć iterator i funkcji .front().
P-78400
Mrovqa
» 2013-03-15 08:55:50
C/C++
for( unsigned int i = 0; i <= player.bullets.size(); i++ )
Funkcje size() ze standardowych pojemników STLa zwracają ci typ unsigned (patrz dokumentacja), bo bez sens jest przecież ujemny rozmiar.
P-78406
sajmon
Temat założony przez niniejszego użytkownika
» 2013-03-15 10:49:10
pozmieniałem sobie kod ale nie ogarniam zbytnio tych iteratorów :C

C/C++
vector < Bullet >::iterator it_tab = player.bullets.begin();
for(; it_tab != player.bullets.end(); it_tab++ )
{
    player.moveBullet( * it_tab );
    okno.draw( * it_tab; );
}
/***********************************************************************/

void Player::moveBullet( Bullet b )
{
    b.move();
}

i pociski się rysują, ale nie wiem jak zmusić je do poruszania :C

zrobiłem to takim prostym sposobem, że ich nie usuwam tylko ukrywam
C/C++
for( size_t i = 0; i < player.bullets.size(); i++ )
{
    if( !player.bullets[ i ].dead )
    {
        player.bullets[ i ].move();
        okno.draw( player.bullets[ i ] );
    }
}
 ale boje się, że jak będzie pełno pocisków to zacznie zjadać za dużo pamięci (tak mi się wydaje bo nie znam się na tym :( )
P-78410
Admixior
» 2013-03-15 23:55:14
Pierwsze pytanie: co cię zmusza do używania map zamiast vector?
Kluczem w mapie jest index int, więc czemu nie zastosujesz vectora. Tam wszystko będziesz miał po kolei od 0 do n, i jak usuwasz nie będziesz musiał się bać o nic, zaś wystarczy że będziesz sobie trzymał wskaźniki do bulletów (tworzył je new i usuwał delete) dodając do vectora i nie będzie żadnych problemów z prędkością programu.

Drugie pytanie: w czym jest problem jeśli chodzi o poruszanie pocisków jak przecież wywołujesz metodę move. Wystarczy na spricie wywołać metodę move i podać odpowiednie przesunięcie.

ale boje się, że jak będzie pełno pocisków to zacznie zjadać za dużo pamięci (tak mi się wydaje bo nie znam się na tym :( )
Twoje obawy są słuszne. Natomiast przy wektorach będziesz mógł spokojnie usuwać funkcją erase: vector.erase( vector.begin() + ity_element);


//Jeśli nie masz pojęcia co to mapa i wektor to sobie poczytaj na cioci wiki lub w wujku google.
P-78501
« 1 »
  Strona 1 z 1