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

[SFML 2.1] wiele pocisków na planszy

Ostatnio zmodyfikowano 2013-11-25 16:36
Autor Wiadomość
Raciawelli
Temat założony przez niniejszego użytkownika
[SFML 2.1] wiele pocisków na planszy
» 2013-11-23 17:38:43
na początek kod (fragment który nas interesuje)
C/C++
#include <SFML/Graphics.hpp>
#include <iostream>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <vector>

using namespace std;



int main()
{
    sf::RenderWindow window( sf::VideoMode( 660, 660, 32 ), "grom w gre!" );
   
    sf::Texture tekstura1;
    tekstura1.loadFromFile( "pionek.png" );
    sf::Sprite pionek;
    pionek.setTexture( tekstura1 ); //tworzenie pionka
    pionek.setPosition( 300, 300 );
    pionek.setOrigin( 15, 15 );
   
   
    sf::Texture tekstura4;
    tekstura4.loadFromFile( "pocisk.png" );
    sf::Sprite pocisk;
    pocisk.setTexture( tekstura4 );
    pocisk.setOrigin( 5, 5 );
   
    vector < sf::Sprite > pociski;
   
   
    //zmienne
    double radiany = 0, radiany2 = 0, radiany3 = 0;
    float xpionka = 0, ypionka = 0, xmyszy = 0, ymyszy = 0;
    int iloscPociskow = 0, wystrzelony = 0;
    vector < double > radianyPociski;
    float xpocisku = 0, ypocisku = 0;
   
    //vector<float> xpocisku;
    //vector<float> ypocisku;
   
    while( window.isOpen() )
    {
        window.clear( sf::Color() );
        sf::Event event;
        while( window.pollEvent( event ) )
        {
            xpionka = pionek.getPosition().x;
            ypionka = pionek.getPosition().y;
            xmyszy = sf::Mouse::getPosition( window ).x;
            ymyszy = sf::Mouse::getPosition( window ).y;
            radiany = atan2( ymyszy - ypionka, xmyszy - xpionka ); //obliczanie radianów
           
           
            if( event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left )
            {
               
                radiany3 = radiany;
                pocisk.setPosition( xpionka, ypionka );
                pociski[ 0 ] = pocisk;
                wystrzelony = 1;
               
            }
           
            if( event.type == sf::Event::Closed ) //zamykanie
                 window.close();
           
            if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape )
                 window.close();
           
        }
       
       
        if( wystrzelony == 1 )
        {
            pocisk = pociski[ 0 ];
            pocisk.move(( cos( radiany3 ) ),( sin( radiany3 ) ) );
            xpocisku = pocisk.getPosition().x;
            ypocisku = pocisk.getPosition().y;
            if((( xpocisku <=( xprzeciwnika + 15 ) ) and( xpocisku >=( xprzeciwnika - 15 ) ) ) and
            (( ypocisku <=( yprzeciwnika + 15 ) ) and( ypocisku >=( yprzeciwnika - 15 ) ) ) )
            {
                wystrzelony = 0;
                przeciwnik.setPosition( 50, 50 );
                pocisk.setPosition( - 10, - 10 );
            }
        }
       
       
        window.draw( pionek ); //rysowanie pionka
        window.draw( pocisk );
        window.display();
        sf::sleep( sf::milliseconds( 10 ) ); //odciazenie procesora
    }
    return 0;
}

A wiec po kolei. Robię właśnie strzelankę i chcę zrobić możliwość wysłania w stronę przeciwnika wielu pocisków jednocześnie. Postanowiłem zrobić to na sprajtach z teksturą ładowaną z obrazka png. Przy jednym pocisku wszystko działa, ale jeśli kliknie się ponownie by wystrzelić kolejny pocisk, ten pierwszy znika. Postanowiłem więc umieścić pociski w vektorach. Niestety i tutaj jest problem. Za diabła nie chce działać coś takiego jak pociski[1].setPosition czy .setTexture . Program się co prawda kompilował, ale po kliknięciu wysypywał. Stwierdziłem dobra, przypiszę zwykły sprait do vectorów ( jak powyżej) tylko tymczasowo, a operację będę wykonywać na normalnym. niestety i ta próba nie zadziałała. Po prostu skończyły mi się pomysły jak to zrobić...
P-97180
Monika90
» 2013-11-23 17:44:12
Ten vector jest pusty, jak jest pusty to element o indeksie 0 nie istnieje. Mozesz dodawać elementy do wektora za pomocą push_back. Ale najpierw upewnij się, czy obiekty typu sf::Sprite w ogóle nadają się do tego by je trzymać w wektorze.
P-97182
Raciawelli
Temat założony przez niniejszego użytkownika
» 2013-11-23 19:37:48
o, dzięki wielkie! Myślałem, że w wektorach wpisanie nieistniejącej wartości wektora [] wystarczy by ten się utworzył. wyszło mi coś takiego:
-zdarzenie
C/C++
if( event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left )
{
    radianyPociski.push_back( radiany );
    pocisk.setPosition( xpionka, ypionka );
    pociski.push_back( pocisk );
    iloscPociskow += 1;
}
-pętla tworząca pociski
C/C++
if( iloscPociskow > 0 )
{
    for( int i = 0; i < iloscPociskow; i++ )
    {
        pocisk = pociski[ i ];
        pocisk.move(( cos( radianyPociski[ i ] ) ),( sin( radianyPociski[ i ] ) ) );
        window.draw( pocisk );
        xpocisku = pocisk.getPosition().x;
        ypocisku = pocisk.getPosition().y;
       
        if((( xpocisku <=( xprzeciwnika + 15 ) ) and( xpocisku >=( xprzeciwnika - 15 ) ) ) and
        (( ypocisku <=( yprzeciwnika + 15 ) ) and( ypocisku >=( yprzeciwnika - 15 ) ) ) )
        {
            przeciwnik.setPosition( 50, 50 );
            iloscPociskow -= 1;
            radianyPociski.push_back( radianyPociski[ i ] );
            radianyPociski[ i ] = radianyPociski[ iloscPociskow ];
            radianyPociski.pop_back();
            radianyPociski.pop_back();
           
            pociski.push_back( pociski[ i ] );
            pociski[ i ] = pociski[ iloscPociskow ];
            pociski.pop_back();
            pociski.pop_back();
           
        }
        else
        {
            pociski[ i ] = pocisk;
        }
    }
}
z tym, że powstał nowy problem. Jak wysyłam pociski i trafiają na przeciwnika to ładnie znikają aż do ostatniego, który po prostu zostaje na planszy (nieruchomy). To chyba oznacza że ostatnia pozycja vektora jest... nienaruszalna. Vektor nie traci ostatniej wartości aż nie zdobędzie nowej. Więc, czy jest jakiś sposób na pozbycie się tej wartości, czy też muszę ją zastąpić tymczasowo inną wartością?
P-97195
ridic14
» 2013-11-24 21:05:15
Sprawdź czy "iloscPociskow" ma poprawną wartość... a skoro pociski masz w wektorze to użyj size();
P-97401
SeaMonster131
» 2013-11-24 21:38:33
Ja zawszę robię to w ten sposób:
C/C++
if( strzal )
     v_pociski.push_back(...);

for( int i = 0; i < v_pociski.size(); ++i )
{
    if( kolizja )
         v_pociski.erase( v_pociski.begin() + i );
   
}
P-97405
Raciawelli
Temat założony przez niniejszego użytkownika
» 2013-11-25 16:36:49
o właśnie, to było to czego potrzebowałem :) dzięki wielkie o/
P-97432
« 1 »
  Strona 1 z 1