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) #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 ); 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; 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; 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 ); 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 ) 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 ); window.draw( pocisk ); window.display(); sf::sleep( sf::milliseconds( 10 ) ); } 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ć... |
|
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. |
|
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 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 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ą? |
|
ridic14 |
» 2013-11-24 21:05:15 Sprawdź czy "iloscPociskow" ma poprawną wartość... a skoro pociski masz w wektorze to użyj size(); |
|
SeaMonster131 |
» 2013-11-24 21:38:33 Ja zawszę robię to w ten sposób: if( strzal ) v_pociski.push_back(...);
for( int i = 0; i < v_pociski.size(); ++i ) { if( kolizja ) v_pociski.erase( v_pociski.begin() + i ); }
|
|
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/ |
|
« 1 » |