C ++ / SFML图形应用程序 - 重复纹理/精灵

时间:2016-04-26 20:12:51

标签: c++ textures sprite sfml repeat

我正在接受创建程序的挑战,该程序用于使用C ++和SFML 2.3.2绘制简单的数学方程。图形库,我有图纸纹理渲染精细。然而,我遇到的问题是当我滚动时让它重复。

我使用sf :: View来让它平移,它运行良好,但只要它超出了预定义的精灵大小,它就只是一个空白的背景。

我想过确定我何时超出精灵的范围,然后扩展精灵的大小或移动它,但是如果精灵被改变,那么绘图(如图形)将不会持续存在/复位。

我需要知道的是如何创建纹理的背景,在这种情况下是图形纸,将在每个方向上平铺/重复,并允许在其上方绘制图纸,如果它们离开屏幕则会持续存在

代码如下:

GraphPaper.h:

#pragma once
#include "stdafx.h"

class GraphPaper
{
    public:
        GraphPaper();
        ~GraphPaper();
        bool isObjectLoaded();
        sf::Sprite getSprite();

    private:
        void load(std::string filename);
        bool isLoaded;

        sf::Texture texture;
        sf::Sprite sprite;

        const std::string file = "images/Graph-Paper.png";
};

GraphPaper.cpp:这是我创建和加载所需精灵和纹理的地方。 我将纹理设置为在“load(string filename)”方法内重复,但这只会影响它在精灵矩形设置的范围内。

#include "GraphPaper.h"

GraphPaper::GraphPaper() : isLoaded(false)
{
    load(file);
    assert(isObjectLoaded());
}
GraphPaper::~GraphPaper() {};

void GraphPaper::load(std::string filename)
{
    if (texture.loadFromFile(filename) == false)
        isLoaded = false;
    else
    {
        texture.setRepeated(true);
        sprite.setTexture(texture);
        //Huge size to at least make it look like it's infinite, 
        //but a temporary solution.
        sprite.setTextureRect(sf::IntRect(0,0,10000,10000));
        isLoaded = true;
    }
}
bool GraphPaper::isObjectLoaded()
{
    return isLoaded;
}
sf::Sprite GraphPaper::getSprite()
{
    return sprite;
}

MainWindow.h:

#pragma once
#include "GraphPaper.h"
#include "stdafx.h"

class MainWindow
{
    public:
         void close();
         void start();
         void moveCamera(sf::Event);

    private:
        bool leftMousePressed, rightMousePressed, isExiting;
        int r, g, b, mouseX, mouseY;

        GraphPaper paper;

        const sf::Color white = sf::Color(255, 255, 255);

        sf::RenderWindow mainWindow;
        sf::View view;
};

MainWindow.cpp:这是处理所有绘图的工具,此时还处理所有输入处理。 “start()”只是从main方法调用。

#include "MainWindow.h"
#include "GraphPaper.h"
#include "stdafx.h"

void MainWindow::start()
{
    sf::RectangleShape rectangle = sf::RectangleShape(sf::Vector2f(120, 50));
    rectangle.setFillColor(sf::Color(0,0,0));
    mainWindow.create(sf::VideoMode(1024, 768, 32), "Test");

    sf::View view(sf::FloatRect(0,0,1000,600));
    mainWindow.setView(view);

    leftMousePressed, rightMousePressed, isExiting = false;

    sf::Event currentEvent;
    mainWindow.clear(white);
    mainWindow.draw(paper.getSprite());
    mainWindow.display();

    while (!isExiting)
    {
        while (mainWindow.pollEvent(currentEvent))
        {
            switch (currentEvent.type)
            {
            case sf::Event::MouseMoved:
            {
                if (rightMousePressed == true)
                {
                    std::cout << "Mouse Panned\n";
                }
                if (leftMousePressed == true)
                {
                    std::cout << "Mouse is Drawing\n";
                }
                break;
            }
            case sf::Event::MouseButtonPressed:
            {
                std::cout << "Mouse Pressed\n";

                mouseX = currentEvent.mouseButton.x;
                mouseY = currentEvent.mouseButton.y;

                if (currentEvent.mouseButton.button == sf::Mouse::Left)
                {
                    leftMousePressed = true;
                }
                else if (currentEvent.mouseButton.button == sf::Mouse::Right)
                {
                    rightMousePressed = true;
                }
                break;
            }
            case sf::Event::MouseButtonReleased:
            {
                std::cout << "Mouse Released\n";
                if (currentEvent.mouseButton.button == sf::Mouse::Left)
                {
                    leftMousePressed = false;
                }
                else if(currentEvent.mouseButton.button == sf::Mouse::Right)
                {
                    rightMousePressed = false;
                }
                break;
            }
            case sf::Event::KeyPressed:
            {
                if (currentEvent.key.code == sf::Keyboard::Escape)
                {
                    close();
                }
                //No right movement yet, was testing.
                else if (currentEvent.key.code == sf::Keyboard::Left)
                {
                    moveCamera(currentEvent);
                }
                break;
            }
            case sf::Event::Closed:
            {
                close();
                break;
            }
            }
        }
    }
}
void MainWindow::moveCamera(sf::Event key)
{
    std::cout << "Inside moveCamera\n";
    //No right movement yet, was testing.
    //Movement is also hardcoded for testing as well.
    view.move(100, 0);
    mainWindow.setView(view);
    mainWindow.clear(white);
    mainWindow.draw(paper.getSprite());
    mainWindow.display();
    std::cout << "Leaving moveCamera\n";
}
void draw()
{
    //mainWindow.draw();
}
void MainWindow::close()
{
    std::cout << "Closing...\n";
    mainWindow.close();
    isExiting = true;
}

0 个答案:

没有答案