SFML和指针。具有vector和shared_ptr的图像未显示

问题描述 投票:-1回答:1

图像输出问题。如果您直接使用“图片”类,那么一切都很好。如果使用类“菜单”,则不会显示图像。

Source.cpp-直接使用类“ picture”的工作代码

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <windows.h>
#include <conio.h>
#include "Menu.h"


int main()
{
    sf::RenderWindow window(sf::VideoMode(960, 540), "Programmer Simulator", sf::Style::Close | sf::Style::Titlebar  /*sf::Style::Fullscreen*/);

    sf::Image icon;
    if (!icon.loadFromFile("image/icon.png")) throw;
    window.setIcon(32, 32, icon.getPixelsPtr());

    try
    {
        /*menu mainMenu(window);          // problem
        mainMenu.posСorrection();*/       // problem

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

            /*mainMenu.draw();*/          // problem

            picture picture_background(window, "image/background/0.png");
            picture_background.putFullscreen();
            picture picture_menu_newgame(window, "image/menu/newgame.png");
            picture picture_menu_continue(window, "image/menu/continue.png");
            picture picture_menu_exit(window, "image/menu/exit.png");

            picture_menu_continue.putCenterOver();
            picture_menu_newgame.putOverObj(picture_menu_continue, 30);
            picture_menu_exit.putUnderObj(picture_menu_continue, 30);

            picture_background.draw();
            picture_menu_newgame.draw();
            picture_menu_continue.draw();
            picture_menu_exit.draw();
            window.display();
        }

    }
    catch (const char* msg)
    {
        MessageBoxA(0, msg, "GAME ERROR", MB_OK | MB_ICONASTERISK);
    }
    return 0;
}

Menu.h

#pragma once
#include <memory>
#include <iterator>
#include "Picture.h"

class menu
{
    const int menuPictCount;
    std::vector<std::shared_ptr<picture>> menuPicture;
public:
    menu(sf::RenderWindow& usableArea);
    void draw();
    void posСorrection();
    void shineButton(sf::Color color);
};

Menu.cpp-问题代码

#include "Menu.h"

menu::menu(sf::RenderWindow& usableArea) : menuPictCount(4)
{
    this->menuPicture.resize(this->menuPictCount);

    //background
    menuPicture[0] = std::shared_ptr<picture>(new picture(usableArea, "image/background/0.png"));

    //buttons
    menuPicture[1] = std::shared_ptr<picture>(new picture(usableArea, "image/menu/newgame.png"));
    menuPicture[2] = std::shared_ptr<picture>(new picture(usableArea, "image/menu/continue.png"));
    menuPicture[3] = std::shared_ptr<picture>(new picture(usableArea, "image/menu/exit.png"));
}
void menu::draw()
{
    for (size_t i = 0; i < this->menuPictCount; i++) this->menuPicture[i]->draw();
}
void menu::posСorrection()
{
    const int buttonsCount = this->menuPictCount - 1;

    if (buttonsCount % 2 == 0)
    {
        int indexCenterOver = buttonsCount / 2;
        int indexCenterUnder = indexCenterOver + 1;
        this->menuPicture[indexCenterOver]->putCenterOver();
        this->menuPicture[indexCenterUnder]->putCenterUnder();

        for (size_t i = indexCenterOver - 1; i > 0; i--)
        {
            this->menuPicture[i]->putOverObj(*this->menuPicture[i + 1]);
        }
        for (size_t i = indexCenterUnder + 1; i <= buttonsCount; i++)
        {
            this->menuPicture[i]->putUnderObj(*this->menuPicture[i - 1]);
        }
    }
    else
    {
        const int indexCenter = buttonsCount / 2 + 1;

        this->menuPicture[indexCenter]->putCenter();

        for (size_t i = indexCenter - 1; i > 0; i--)
        {
            this->menuPicture[i]->putOverObj(*this->menuPicture[i + 1]);
        }
        for (size_t i = indexCenter + 1; i <= buttonsCount; i++)
        {
            this->menuPicture[i]->putUnderObj(*this->menuPicture[i - 1]);
        }
    }
}
void menu::shineButton(sf::Color color)
{
    /*for (size_t i = 0; i <= this->buttons.GetCount(); i++)
    {
        if (this->buttons.GetElement(i)->data.trackContainsCursor())
            if (this->buttons.GetElement(i)->data.getColor() != color)
            {
                this->buttons.GetElement(i)->data.setColor(color);
            }
        if (!this->buttons.GetElement(i)->data.trackContainsCursor())
            if (this->buttons.GetElement(i)->data.getColor() == color)
            {
                this->buttons.GetElement(i)->data.setColor(color);
            }
    }*/
}

stackoverflow正在询问详细信息,但我没有更多详细信息-对不起。stackoverflow正在询问详细信息,但我没有更多详细信息-对不起。stackoverflow正在询问详细信息,但我没有更多详细信息-对不起。stackoverflow正在询问详细信息,但我没有更多详细信息-对不起。stackoverflow正在询问详细信息,但我没有更多详细信息,对不起。

c++ pointers vector sfml
1个回答
0
投票

没问题。当使用“菜单”类时,我没有使用“显示”方法。

© www.soinside.com 2019 - 2024. All rights reserved.