[SFML] strzelanie, problem z operatorem "<=" w pętli for
Ostatnio zmodyfikowano 2013-03-15 23:55
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 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; 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 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 |
|
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(). |
|
Mrovqa |
» 2013-03-15 08:55:50 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. |
|
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 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 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 :( ) |
|
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. |
|
« 1 » |