Lukasz1212 Temat założony przez niniejszego użytkownika |
[SFML2] Pobranie pozycji obiektu innej klasy » 2016-01-04 20:14:11 Tworzę projekt gry w SFML no i mam gracza, chciałbym ,żeby po naciśnięciu spacji wystrzelił do góry pionowo pocisk z pozycji gracza. Mam klasę gracz i obiekt statek, oraz klasę Pocisk i w niej taką metodę ,która ma wprawić w ruch pocisk: void Pocisk::Klawisze() { perfectFrameTime = 1.f / 60; timeModifier = iterationTime.asSeconds() / perfectFrameTime; controlClock.restart(); speed2 = 500; speed = 20; bool strzal = false; if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) ) { kulka->setPosition( 100, 30 ); strzal = true; } if( strzal == true ) { for( int i = 0; i < 750; i++ ) { kulka->move( sf::Vector2f( 0, 1 ) * speed * perfectFrameTime ); } } }
To co zakomentowane nie działa, nie mogę się dobrać do tych współrzędnych, próbowałem Gracz::statek.getPosition().x ale wtedy jest błąd invalid use of non-static data member 'Gracz::statek' Może to głupi błąd ale nie mam pomysłu jak inaczej to rozwiązać. |
|
pekfos |
» 2016-01-04 20:17:26 ivalid use non static .... |
Kod programu dobrze przepisałeś, bo nie wiem czy go czytać? |
|
Lukasz1212 Temat założony przez niniejszego użytkownika |
» 2016-01-04 20:21:58 Już poprawiłem, kod jest skopiowany. |
|
pekfos |
» 2016-01-04 20:24:41 Co to jest statek? Gdzie to jest? |
|
Lukasz1212 Temat założony przez niniejszego użytkownika |
» 2016-01-04 20:26:26 Statek jest to obiekt klasy gracz ,której nie wkleiłem tutaj bo jest tego sporo. Jeśli chcesz mogę wkleić wszystko, nie chciałem zaśmiecać. Może jednak dla jasności, plik .h klasa Gracz #ifndef GRACZ_H #define GRACZ_H #include <SFML/Graphics.hpp> using namespace sf;
class Pocisk { public: Pocisk(); ~Pocisk(); void Klawisze(); void Rysuj( sf::RenderWindow & window ); Pocisk & Ustaw( int x, int y ); private: CircleShape * kulka; sf::Clock controlClock; sf::Time iterationTime = controlClock.getElapsedTime(); float perfectFrameTime; float speed; float speed2; float timeModifier; };
class Gracz { public: Gracz(); virtual ~Gracz(); void Rysuj( RenderWindow & window ); int Pobierz(); void Klawisze(); void Pozycja( int x, int y ); static const int wys = 50; static const int szer = 50; sf::RectangleShape statek; sf::Clock controlClock; sf::Time iterationTime = controlClock.getElapsedTime(); float perfectFrameTime; float speed; float speed2; float timeModifier; };
#endif
plik cpp klasy gracz #include <SFML/Graphics.hpp> #include <windows.h> #include <iostream> #include <cstdlib> #include <time.h> #include "gracz.h" #include "gra.h" using namespace sf;
Gracz::Gracz() : statek( sf::Vector2f( Gracz::szer, Gracz::wys ) ) { statek.setPosition( 100, 100 ); } void Gracz::Rysuj( sf::RenderWindow & window ) { window.draw( statek ); } Gracz::~Gracz() { }
int Gracz::Pobierz() { int x = statek.getPosition().x; int y = statek.getPosition().y; return x, y; }
void Gracz::Klawisze() { perfectFrameTime = 1.f / 60; timeModifier = iterationTime.asSeconds() / perfectFrameTime; controlClock.restart(); speed2 = 500; speed = 100; if( statek.getPosition().y >= 0 ) {; if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) statek.move( sf::Vector2f( 0, - 1 ) * speed2 * perfectFrameTime ); } if( statek.getPosition().y <= 550 ) { if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) statek.move( sf::Vector2f( 0, 1 ) * speed2 * perfectFrameTime ); } if( statek.getPosition().x >= 0 ) { if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) statek.move( sf::Vector2f( - 1, 0 ) * speed2 * perfectFrameTime ); } if( statek.getPosition().x <= 748 ) { if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) statek.move( sf::Vector2f( 1, 0 ) * speed2 * perfectFrameTime ); } }
void Gracz::Pozycja( int x, int y ) { statek.setPosition( x, y ); } Pocisk::Pocisk() { kulka = new CircleShape( 10 ); } void Pocisk::Rysuj( sf::RenderWindow & window ) { window.draw( * kulka ); }
Pocisk::~Pocisk() { delete kulka; }
void Pocisk::Klawisze() { perfectFrameTime = 1.f / 60; timeModifier = iterationTime.asSeconds() / perfectFrameTime; controlClock.restart(); speed2 = 500; speed = 20; bool strzal = false; if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) ) { kulka->setPosition( 100, 30 ); strzal = true; } if( strzal == true ) { for( int i = 0; i < 750; i++ ) { kulka->move( sf::Vector2f( 0, 1 ) * Gracz::speed * perfectFrameTime ); } } }
|
|
pekfos |
» 2016-01-04 20:30:38 Gdzie tworzysz gracza i pociski? Ile jest graczy i pocisków? Dlaczego chcesz mieć informację o graczu w pocisku? |
|
Lukasz1212 Temat założony przez niniejszego użytkownika |
» 2016-01-04 20:36:01 wrzuciłem wyżej całość, jestem początkujący więc zerknij czy to ma sens. Zamysł jest taki ,że gracz przesuwa się na dole okienka i strzela pionowo do góry pociskami w wysuwających się z góry ekranu przeciwników. Chcę ,żeby pocisk został wystrzelony z pozycji gracza czyli chcę pobrać współrzędne gracza ,żeby ustawić nowy pocisk w tym samym miejscu co gracza w momencie strzału. |
|
pekfos |
» 2016-01-04 20:41:57 Pocisk::Pocisk() { kulka = new CircleShape( 10 ); } |
Niepotrzebna dynamiczna alokacja. int Gracz::Pobierz() { int x = statek.getPosition().x; int y = statek.getPosition().y; return x, y; } |
Bez sensu. void Pocisk::Klawisze() { perfectFrameTime = 1.f / 60; timeModifier = iterationTime.asSeconds() / perfectFrameTime; controlClock.restart(); speed2 = 500; speed = 20; bool strzal = false; if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) ) { kulka->setPosition( 100, 30 ); strzal = true; } if( strzal == true ) { for( int i = 0; i < 750; i++ ) { kulka->move( sf::Vector2f( 0, 1 ) * Gracz::speed * perfectFrameTime ); } } } |
Jak wyżej. Zamysł jest taki ,że gracz przesuwa się na dole okienka i strzela pionowo do góry pociskami w wysuwających się z góry ekranu przeciwników. |
W takim scenariuszu, informacje o graczu w pocisku nie są do niczego potrzebne. |
|
« 1 » 2 |