Quantcast
Channel: Forum Pasja Informatyki - Najnowsze pytania bez odpowiedzi
Viewing all articles
Browse latest Browse all 21942

c++ & sfml i usuwanie konkretnych trafionych obiektów

$
0
0

Jako że 2 dni temu zamieściłem podobny wpis, i nie uzyskałem odpowiedzi ponawiam pytanie. Do rzeczy; naszym bohaterem jest statek kosmiczny, który potrafi strzelać (w kodzie: CircleShape - kula, wektor z kulami - kule). Oczywiście usuwanie kul wychodzących poza okno jest. Zeby gra byla ciekawa, postanowilem dodac przeciwnikow (w kodzie: CircleShape - mob, wektor z mobami - potwory). W 1 fali jest 5 potworow (w kodzie: liczba_mobow), okreslajaca ile ma byc potworow. Ale gdy sprobowalem dodaj usuwanie trafionego potwora:

for (int i=0; i<potwory.size(); i++)   // sprawdzenie z kolei kolizji ze wszystkimi potworami 
            {
                if (kula.getGlobalBounds().intersects(potwory[i].getGlobalBounds()) && potwory.size() <= liczba_mobow)   // wykrycie kolizji
                {
                    potwory.erase(potwory.begin() + (i));    //usunięcie z wektora wykrytego trafionego potwora
                    std::cout<<"potwory: "<<potwory.size()<<std::endl;    //test.....
                }
            }

Ale gdy strzelimy w jakiegos potwora to nic sie nie dzieje, poki potwor nie przekroczy pkt x (okolo na wysokosci statku, nie zaleznie na jakiej wysokosci zostal trafiony, bo wszystkie potwory sie poruszaja). Ale jest tego warunek; po trafieniu owego potwora nie mozna wydobyc kolejnych kuli, bo wtedy nawet na pkt x sie nie wykryje. (Bardzo dziwne). A to reszta kodu, ktora moze sie wam przydac:

class Fale    //na razie taka krótka klasa
{
 
protected:
 
    int x,y = -20;
 
};
 
(...)
 
class Fala_1 : public Fale
{
 
public:
 
    void fala1()
    {
        mob.setFillColor(Color::Red);
        liczba_mobow = 5;
        for (int i = 0; i<=liczba_mobow; i++)
        {
            x = rand()%width - 50;     //szerokość ekranu
            if (x < 0)    //tak żeby nie wystawał poza ekran
            {
                x = 30;
            }
 
            mob.setPosition(x,y);
 
            static sf::Clock clock;   //zegar tworzący potwora co sekundę
            if (clock.getElapsedTime().asSeconds() >= 1 && potwory.size() < liczba_mobow)
            {
                potwory.push_back(mob);    //dodanie potwora do wektora
                clock.restart();
            }
        }
 
        if (potwory.size() >= liczba_mobow)   
        {
            wykonano_f1 = true;     //zmienna określająca wykonanie 1 fali  
        }
 
    }
};
 
(...)
 
//w pętli głównej
if (!wykonano_f1)   //jeśli nie wykonano 1 fali to wykonaj
        {
            Fala_1 f1;
            f1.fala1();
        }

Myslalem nad uzyciem sprite jako obiektu, i usuwaniem trafionego za pomoca "this", ale nie wiem jak to zrobic. Prosze o pomoc.

 

ps. jak mogliscie zauwazyc od pewnego momentu nie uzywam polskich znakow, poniewaz podczas pisania cos sie zepsulo i klikajac Alt + a wlacza mi sie jakies menu jak w paincie, w ktorym moge wstawiac tekst i rysowac itp. na aktualnym ekranie, wiec z tym tez prosze o pomoc.


Viewing all articles
Browse latest Browse all 21942

Trending Articles


TRX Antek AVT - 2310 ver 2,0


Автовишка HAULOTTE HA 16 SPX


POTANIACZ


Zrób Sam - rocznik 1985 [PDF] [PL]


Maxgear opinie


BMW E61 2.5d błąd 43E2 - klapa gasząca a DPF


Eveline ➤ Matowe pomadki Velvet Matt Lipstick 500, 506, 5007


Auta / Cars (2006) PLDUB.BRRip.480p.XviD.AC3-LTN / DUBBING PL


Peugeot 508 problem z elektroniką


AŚ Jelenia Góra