используя класс?c ++ & sfml и 15 символов в заголовке - PullRequest
0 голосов
/ 27 сентября 2018

При использовании класса?

Этот вопрос, вероятно, очевиден для вас, но я знаю и научился создавать класс и как он работает, но я не знаю, когда его использую.

Iдумаю, что я могу сократить свою программу с помощью класса, но я не знаю, когда я должен это сделать.

Я хотел бы поделиться своим кодом, но я не могу вставить его полностью в тему сообщения.

Включить

#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include <cstdlib>
#include <cmath>

Константы

//Constantes ecran
    int tailleEcranX = 1280;
    int tailleEcranY = 720;

//Constantes perso
        int scalePerso = 3;
        int tailleSpriteX = 32;
        int tailleSpriteY = 48;
        int speed(4);
        int speedSprinte(20);
        int milieuSpriteX = (tailleSpriteX/2)*scalePerso;
        int milieuSpriteY = (tailleSpriteY/2)*scalePerso;

        int pv = 100;
        unsigned int pvMax = 100;

Инициализация

//Initiation des dessins
    sf::RenderWindow window;
    sf::RectangleShape rect;
    sf::Texture perso;
    sf::Sprite sprite_perso;
    sf::View view;
    sf::RectangleShape rectCol;

    sf::RectangleShape pvBar;
    sf::RectangleShape pvMaxBar;

    enum Dir{Down,Left,Right,Up};

sf::Vector2i anim (1,Down);

#include "gestion_clavier.h"

Main

    int main()
    {
    //{ Positionnement des objets

        window.create(sf::VideoMode(tailleEcranX , tailleEcranY), "The Game I");
        window.setPosition(sf::Vector2i(500,250));
        window.setFramerateLimit(60);

        rect.setFillColor(sf::Color(255,0,0));
        rect.setSize(sf::Vector2f(tailleEcranX-10,tailleEcranY-10));
        rect.setPosition(5,5);
        rect.setOutlineColor(sf::Color(255,255,255));
        rect.setOutlineThickness(3);

        rectCol.setFillColor(sf::Color(0,0,200));
        rectCol.setSize(sf::Vector2f(50,50));
        rectCol.setPosition(400,500);
        rectCol.setOutlineColor(sf::Color(255,255,255));
        rectCol.setOutlineThickness(1);

        sf::Clock time;

    //}

    //{Chargement des Sprites

    if (!perso.loadFromFile("link/srpite.png",sf::IntRect(0,0,96,192)))
    {
        std::cout<<"erreur chargement player image"<<std::endl;
    }
    sprite_perso.setTexture(perso);
    sprite_perso.setPosition(tailleEcranX/2-milieuSpriteX,tailleEcranY/2-milieuSpriteY);

    //}

    //{ Game Loop

        while (window.isOpen())
        {
            sf::Event event;
            while (window.pollEvent(event))
            {
                if (event.type == sf::Event::Closed)
                    window.close();
            }


    ProcessInput();
    //gestion_clavier();


    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Z)||sf::Keyboard::isKeyPressed(sf::Keyboard::S)||sf::Keyboard::isKeyPressed(sf::Keyboard::D)||sf::Keyboard::isKeyPressed(sf::Keyboard::Q))
    {
        if (time.getElapsedTime().asMilliseconds()>= 50)
        {
                    anim.x++;
            if(anim.x*tailleSpriteX >= perso.getSize().x)
               anim.x=0;

                time.restart();
        }
    }


    sprite_perso.setTextureRect(sf::IntRect(anim.x*tailleSpriteX,anim.y*tailleSpriteY,tailleSpriteX,tailleSpriteY));
    sprite_perso.setScale(scalePerso,scalePerso);

        pvBar.setFillColor(sf::Color(20,255,30));
        pvBar.setSize(sf::Vector2f(4*pv,10));
        pvBar.setPosition(20,20);

        pvMaxBar.setFillColor(sf::Color(0,0,0));
        pvMaxBar.setSize(sf::Vector2f(4*pvMax,10));
        pvMaxBar.setPosition(20,20);
        pvMaxBar.setOutlineColor(sf::Color(255,255,255));
        pvMaxBar.setOutlineThickness(2);

        if(pv>=pvMax)
        {
            pv=pvMax;
        }

        if(pv<=0)
        {
            pv=0;
        }

    if(
    (std::abs((sprite_perso.getPosition().x+milieuSpriteX)-(rectCol.getPosition().x+50/2))<50)
       &&
    (std::abs((sprite_perso.getPosition().y+milieuSpriteY)-(rectCol.getPosition().y+50/2))<50)
       )
    {
        std::cout<<"collision"<<std::endl;
        pv--;
        std::cout<<pv<<std::endl;
    }

    //Dessinage
            window.draw(rect);
            window.draw(rectCol);
            window.draw(sprite_perso);

            window.draw(pvMaxBar);
            window.draw(pvBar);


            window.display();
            window.clear();

    }

    //}


        return 0;
    }
    //}

1 Ответ

0 голосов
/ 03 октября 2018

Я изо всех сил пытался понять большую часть вашего кода, так как переменные, кажется, написаны на французском языке, но я могу дать вам несколько общих советов.

При принятии решения, когда использовать класс, вы должны сначала подуматьо содержании вашей программы с точки зрения объектов.Например: если есть персонаж / человек, или что-то, что вы считаете независимым объектом в реальном мире, есть разумный шанс, что это должен быть его собственный класс.Класс должен содержать все, что необходимо для описания объекта, например, его положение, масштаб, спрайт и т. Д. Вот пример:

class Person
{
    private:
        sf::Vector2f position;
        sf::Sprite sprite;
    public:
        void setPosition(sf::Vector2f newPosition);
        sf::Vector2f getPosition();
        void draw(sf::RenderWindow& window);
}

Если вы хотите, чтобы у вашего класса была позиция и тому подобное, я рекомендую извлечь изsf::Transformable класс, чтобы сэкономить ваше время и усилия.Вы также можете получить из sf::Drawable, если хотите нарисовать свой объект, используя window.draw(person), как это могут сделать многие объекты SFML по умолчанию.

class Person : public sf::Transformable, public sf::Drawable
{
    private:
        sf::Sprite sprite;
        void draw(sf::RenderTarget& target, sf::RenderStates states) const
        {
            states.transform *= getTransform();
            target.draw(sprite, states);
        }
}

У вас есть ряд переменных, которые вы называете константами.Если это так, то рекомендуется помечать их как таковые с помощью const.Например:

const int scalePerso = 3;

Это мешает вам изменить значение в будущем и вызвать ошибки, которые вам нужно отследить.

Я также заметил, что вы определяете отдельные переменные для позиций X и Y,В этом нет необходимости, поскольку SFML определяет тип sf :: Vector2.Например:

const sf::Vector2f tailleSpritePosition(32.f, 48.f);

вместо

int tailleSpriteX = 32;
int tailleSpriteY = 48;

Вы также немного смешиваете типы, передавая целые числа в функции, которые принимают значения с плавающей запятой.Это также считается плохой практикой.Если вы хотите преобразовать целое число в число с плавающей точкой, вы должны явно привести его, используя (float), например, так:

rect.setSize(sf::Vector2f((float)tailleEcranX - 10.f, (float)tailleEcranY - 10.f));

, убедившись, что добавили букву f в конце ваших литералов,компилятор это тоже значения с плавающей точкой.Кроме того, в некоторых случаях вы можете просто определить переменные типа float, с которых можно начинать.

Не стесняйтесь спрашивать, есть ли что-то, чего вы не понимаете.

...