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

Programowanie c++/SFML Potrzebna Pomoc

42 Warsaw Coding Academy
0 głosów
337 wizyt
pytanie zadane 30 marca 2016 w C i C++ przez cza213 Początkujący (370 p.)

Witajcie. Jestem w trakcie nauki programowania obiektowego i chciałem przetestować to w praktyce aby jak najlepiej zrozumieć wskaźniki z użyciem klas itp..

Chciałbym w prostu sposób stworzyć okienko, gracza oraz możliwość nim poruszania wszystko przy pomocy metod. Niestety gracz (textura) się nie wyświetla a gdy już narysowałem postać ale musiałem pozmieniać textury na publicznie czego nie chce robić to postać się nie porusza. Okno się wyświetla poprawnie.

Całość składa się z:

- main.cpp

- game.h

- game.cpp

main.cpp

#include <SFML/Graphics.hpp>
#include <windows.h>
#include <iostream>
#include "game.h"

int main()
{
    okno_klasa oknow;
    oknow.okienko->create(sf::VideoMode(1280,700,32),"TEST");
    Player gracz;
    while(oknow.okienko->isOpen())
    {
            if(gracz.pobierz_textura_player() == true)
            {
                    gracz.pozycja_player();
                    sf::Event zdarzenie;
                    while(oknow.okienko->pollEvent(zdarzenie))
                    {
                if(zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape)
                {
                    oknow.okienko->close();
                }
                if(zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Left)
                {
                    gracz.ruch_player_left();
                }
                if(zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Right)
                {
                    gracz.ruch_player_right();
                }
                if(zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up)
                {
                    gracz.ruch_player_up();
                }
                if(zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down)
                {
                    gracz.ruch_player_down();
                }
                }
            } else { return 0; }
                oknow.okienko->clear(sf::Color::Green);
                gracz.draw_player();
                oknow.okienko->display();
    }
    return 0;
}

 

game.h

#include <iostream>
#include <windows.h>
#include <SFML/Graphics.hpp>
class okno_klasa
{
public:
    sf::RenderWindow okno1;
    sf::RenderWindow *okienko = &okno1;

};
class Player : public okno_klasa
{
private:
    int x,y;
    int wartosc;
    sf::Texture textura_player;
    sf::Sprite sprite_player;
public:
    bool pobierz_textura_player();
    void pozycja_player();
    void ruch_player_up();
    void ruch_player_down();
    void ruch_player_right();
    void ruch_player_left();
    void draw_player();
};

 game.cpp

 


#include <iostream>
#include <string>
#include <windows.h>
#include "game.h"
#include <SFML/Graphics.hpp>


    bool Player::pobierz_textura_player()
    {
        if(!textura_player.loadFromFile("player.png"))
        {
            MessageBox(NULL,"NIE ZALADOWANO TEXTURY","ERROR",NULL);
            return false;
        } else
        {
            sprite_player.setTexture(textura_player);
            return true;
        }
    }
    void Player::pozycja_player()
    {
        sprite_player.setPosition(700,350);
    }
    void Player::ruch_player_left()
    {
        sprite_player.move(-10,0);
    }
    void Player::ruch_player_right()
    {
        sprite_player.move(10,0);
    }
    void Player::ruch_player_up()
    {
        sprite_player.move(0,10);
    }
    void Player::ruch_player_down()
    {
        sprite_player.move(0,-10);
    }
    void Player::draw_player()
    {
        okienko->draw(sprite_player);
    }

 

2 odpowiedzi

+1 głos
odpowiedź 30 marca 2016 przez Grzyboo Nałogowiec (28,880 p.)
wybrane 30 marca 2016 przez cza213
 
Najlepsza

Ładowanie tekstury jest bardzo zasobożernym procesem, a ty to robisz w głównej pętli. Załaduj teksturę raz!

 

Nie ruszasz się zapewne dlatego, że w każdym obiegu pętli ustawiasz stałą pozycję 700 / 350

gracz.pozycja_player();

 

Przerób kurs SFML, np.

http://szymonsiarkiewicz.pl/poradniki/sfml-kurs-podstawowy/sfml-kurs-dla-poczatkujacych/

Ponieważ Twój kod to jeden wielki bałagan.

+1 głos
odpowiedź 30 marca 2016 przez maly Nałogowiec (37,190 p.)

Player dziedziczący po okno_klasa posiada własną instancję klasy sf::RenderWindow więc rysujesz w nim a nie w oknie które stworzyłeś w main.

Zamiast tego powinieneś przekazać w konstruktorze Player wskaźnik na istniejące już okno.

class Player
{
private:
	okno_klasa *okno;
public:
	Player(okno_klasa *okno)
	:okno(okno)
	{
	}
}

main()
{
	okno_klasa oknow;
	
	Player gracz(&oknow);
}

i to pod warunkiem że okno_klasa będzie miała coś wiecej niż dziwaczną konstrukcję

sf::RenderWindow okno1;
sf::RenderWindow *okienko = &okno1;

bo rozsądniejszą opcją w tej chwili jest po prostu

class Player
{
private:
	sf::RenderWindow *okno;
public:
	Player(sf::RenderWindow *okno)
	:okno(okno)
	{
	}
}

main()
{
	sf::RenderWindow oknow(sf::VideoMode(1280,700,32),"TEST");
	
	Player gracz(&oknow);
}

 

komentarz 30 marca 2016 przez cza213 Początkujący (370 p.)
Dzięki wielkie, wszystko już gra. Tak właśnie wychodzi nauka i pisanie kodów po godzinach szczerze mówiąc to ok 12 w nocy się za to zabrałem ;)

Podobne pytania

–1 głos
1 odpowiedź 359 wizyt
–5 głosów
1 odpowiedź 247 wizyt
pytanie zadane 16 maja 2017 w C i C++ przez KacperKow Nowicjusz (180 p.)
0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 17 grudnia 2015 w C i C++ przez Piotreek Nowicjusz (120 p.)

93,381 zapytań

142,380 odpowiedzi

322,536 komentarzy

62,738 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...