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

[SFML2] Pobranie pozycji obiektu innej klasy

Ostatnio zmodyfikowano 2016-01-04 21:02
Autor Wiadomość
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:
C/C++
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 ) ) {
        //  int x= statek.getPosition().x;
        //      int y= statek.getPosition().y;
       
        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ć.
P-142858
pekfos
» 2016-01-04 20:17:26
ivalid use non static ....
Kod programu dobrze przepisałeś, bo nie wiem czy go czytać?
P-142859
Lukasz1212
Temat założony przez niniejszego użytkownika
» 2016-01-04 20:21:58
Już poprawiłem, kod jest skopiowany.
P-142862
pekfos
» 2016-01-04 20:24:41
Co to jest statek? Gdzie to jest?
P-142864
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
C/C++
#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 // GRACZ_H

plik cpp klasy gracz

C/C++
#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 ) ) {
        //  int x= statek.getPosition().x;
        //      int y= statek.getPosition().y;
       
        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 );
        }
    }
   
}
P-142865
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?
P-142867
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.
P-142868
pekfos
» 2016-01-04 20:41:57
C/C++
Pocisk::Pocisk() {
    kulka = new CircleShape( 10 );
}
Niepotrzebna dynamiczna alokacja.

C/C++
int Gracz::Pobierz()
{
    int x = statek.getPosition().x;
    int y = statek.getPosition().y;
    return x, y;
}
Bez sensu.

C/C++
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 ) ) {
        //  int x= statek.getPosition().x;
        //      int y= statek.getPosition().y;
       
        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.
P-142871
« 1 » 2
  Strona 1 z 2 Następna strona