使用类? c ++和sfml,标题中包含15个字符

时间:2018-09-27 09:19:14

标签: c++ sfml

使用类时?

这个问题可能对您很明显,但是我知道并学习了如何创建类以及它是如何工作的,但是我不知道何时使用它。

我认为我可以在课堂上削减程序,但是我不知道什么时候必须这样做。

我想分享我的代码,但不能将其完全粘贴到主题文章中。

包含

#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"

主要

    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 :(得分:0)

由于变量似乎是用法语编写的,所以我很难理解您的很多代码,但是我可以给您一些一般性的建议。

在决定何时使用类时,首先应该从对象的角度考虑程序的内容。例如:如果有一个角色/人,或者您会在现实世界中将某个对象视为一个独立的对象,那么就有合理的机会应该属于自己的类。该类应包含描述对象所需的所有内容,例如对象的位置,比例,子画面等。这是一个示例:

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类派生,以节省您的时间和精力。如果您想像许多默认SFML对象一样使用sf::Drawable绘制对象,也可以从window.draw(person)派生。

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类型,以在某些情况下开始使用。

随时询问是否有您不了解的内容。