• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z vectorem obiektów sfml

Object Storage Arubacloud
0 głosów
214 wizyt
pytanie zadane 29 grudnia 2018 w C i C++ przez midlas12 Nowicjusz (140 p.)

Mam problem z vectorem obiektów które mają się rysować z odstępami a rysuje się tylko jeden/ jeden na drugim i nie za bardzo wiem dlaczego.

//int main

//przed pętlą główną

std::vector <Skala> skaly(5);
    for(auto &x : skaly)
    {
        x.setPos(300,500);
        x.setSize(0.5,0.5);
        x.moveSkl(100,0);
    }

//w pętli głównej

window.clear();
        for(auto &x : skaly)
        {
            x.drawSkala(window);
        }
        window.display();

//ciała klas

#include <SFML\Graphics.hpp>
#include "Player.h"
#include <vector>
class Skala :public Player
{
 public:
    Skala(){

    }

    void drawSkala(sf::RenderWindow &window)
    {
        if(!sTexture.loadFromFile("coble.png"))
        {
            std::cout<<"error"<<std::endl;
        }

        sSprite.setTexture(sTexture);
        window.draw(sSprite);
    }

    void setPos(float xPos, float yPos)
    {
        sSprite.setPosition(xPos,yPos);
    }

    void setSize(float xSize, float ySize)
    {
        sSprite.setScale(xSize,ySize);
    }
    void moveSkl(float x, float y)
    {
        sSprite.move(x,y);
    }

 private:
    sf::Texture sTexture;
    sf::Sprite sSprite;
};

 

komentarz 29 grudnia 2018 przez niezalogowany
Nie ładuj ciągle tych samych tekstur. Tylko niepotrzebnie spowolnisz swój program. Wystarczy raz.

1 odpowiedź

0 głosów
odpowiedź 29 grudnia 2018 przez Michał Gibas Pasjonat (19,610 p.)
for(auto &x : skaly)
    {
        x.setPos(300,500);
        x.setSize(0.5,0.5);
        x.moveSkl(100,0);
    }

Nie ma tu żadnej zmiany położenia kolejnych obiektów względem siebie. Ustawiasz pozycje każdego obiektu na (300, 500) a później przesuwasz go o wektor (100, 0) co w efekcie daje, że każdy obiekt zostaje na jednej tej samej pozycji: (400, 500) [= (300, 500) + (100, 0)]. Musisz zrobić np. pętlę for z iteratorem, który pomnożony razy jakiś offset ( ang. przesunięcie/przemieszczenie) da ci to przesunięcie kolejnych obiektów np.:

x.move(i*OFFSET, 0);

Pozdrawiam!

komentarz 29 grudnia 2018 przez Michał Gibas Pasjonat (19,610 p.)
PS. Jeszcze takich kilka porad na przyszłość, bo boli mnie trochę jak widzę tak napisany kod ;)

- Nie używaj polskich nazw w programach, a nazwy method funkcji, zapisuj raczej w całości a nie w skrócie: np. setPosition() an nie setPos() (no chyba, że jakoś dobrze uzasadnisz skrócenie takiej nazwy).

- Dokumentacja i tutoriale do biblioteki nie gryzą :) W SFMLu jest klasa, która definiuje ci metody typu setPosition, setSize, move, scale etc.: sf::Transform (https://www.sfml-dev.org/documentation/2.5.1/classsf_1_1Transform.php, https://www.sfml-dev.org/tutorials/2.5/graphics-transform.php#transforming-your-own-classes) oraz sf::Drawable (https://www.sfml-dev.org/documentation/2.5.1/classsf_1_1Drawable.php)

Pozdrawiam!
komentarz 29 grudnia 2018 przez midlas12 Nowicjusz (140 p.)

@Michał Gibas, bo dobra to dodałem iterator 

for(auto &x : skaly)
            {

                x.setPos(300,500);
                x.setSize(0.5,0.5);
                x.moveSkl(i*100,0);
                i++;
            }

tylko teraz lecą w nieskończoność w prawo. Próbowałem ifem ale też coś nie wyszło.

std::vector <Skala> skaly(liczba_tablic);


           for(auto &x : skaly)
            {

                x.setPos(300,500);
                x.setSize(0.5,0.5);
                if(i<=liczba_tablic)
                {
                 x.moveSkl(i*100,0);
                 i++;
                }

            }

 

komentarz 29 grudnia 2018 przez Michał Gibas Pasjonat (19,610 p.)
No bo myślałem, że taki efekt chcesz uzyskać, żeby obiekty były porozstawiane z odstępem w prawo. Co dokładnie chciałeś osiągnąć? Bo trochę niejasno wyjaśniłeś to w treści pytania.
komentarz 29 grudnia 2018 przez midlas12 Nowicjusz (140 p.)

coś takiego

komentarz 29 grudnia 2018 przez Michał Gibas Pasjonat (19,610 p.)
No to moje rozwiązanie powinno tak działać, prześlij cały kod na jakimś pastebin'ie czy czymś.
komentarz 29 grudnia 2018 przez midlas12 Nowicjusz (140 p.)
komentarz 29 grudnia 2018 przez Michał Gibas Pasjonat (19,610 p.)
std::vector <Skala> skaly(liczba_tablic);
 
 
           for(auto &x : skaly)
            {
 
                x.setPos(300,500);
                x.setSize(0.5,0.5);
                if(i<=liczba_tablic)
                {
                 x.moveSkl(i*100,0);
                 i++;
                }
 
            }

To musi być przed główną pętlą, a nie po niej.

komentarz 29 grudnia 2018 przez midlas12 Nowicjusz (140 p.)
Dzięki wielkie za pomoc już wszystko działa.
komentarz 29 grudnia 2018 przez midlas12 Nowicjusz (140 p.)
edycja 29 grudnia 2018 przez midlas12

@Michał Gibas, a jeszcze napotkałem na problem bo chcę zrobić kolizję gracza z obiektami w vektorze. Bo nie wiem jak użyć .intersects w takiej sytuacji. 

próbowałem zrobić nowy vector z graczem ale też nie mogę jej tak użyć

std::vector <Player> player_vec;

for(auto &xy : player_vec)
        {
          for(int i=0; i<skaly.size(); i++)
           {
               if(xy[0].getGlobalBounds().intersects(skaly[i].get))
               {
                std::cout<<"kolizja"<<std::endl;
               }
           }
        }

znaczy wiem że przed .getGlobalBounds().intersects trzeba dać sprajta gracza ale nie zabardzo wiem jak bo ten sprajt jest w klasie player

klasa player:

https://pastebin.com/TTLnD24b

komentarz 1 stycznia 2019 przez Michał Gibas Pasjonat (19,610 p.)
Po prostu tworzysz getter do sprite'a z klasy gracza i tyle ;c Polecam najpierw dobrze nauczyć się C++ i programowania obiektowego, a później zabierać się za projekty z SFML czy innymi bibliotekami ;)

Podobne pytania

0 głosów
1 odpowiedź 396 wizyt
pytanie zadane 30 marca 2017 w C i C++ przez Milesq Nałogowiec (32,020 p.)
0 głosów
1 odpowiedź 716 wizyt
pytanie zadane 25 kwietnia 2018 w C i C++ przez Don Corleone Obywatel (1,210 p.)
0 głosów
1 odpowiedź 144 wizyt
pytanie zadane 19 września 2017 w C i C++ przez CPP_Newbie Użytkownik (770 p.)

92,565 zapytań

141,416 odpowiedzi

319,599 komentarzy

61,950 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...