【发布时间】:2019-03-21 19:04:07
【问题描述】:
所以,我试图用 opengl 和 sfml 制作 2d 游戏, 所以我在输入命名空间中创建了一个按钮类, 我在其中创建了一个 render() 函数,但是当我调用它时(无论我使用指针还是不使用指针),即使我传递了所有必需的参数,它仍然给出 我一个错误,说我正在尝试访问已删除的功能 这是按钮标题:
#pragma once
#include <SFML/Graphics.hpp>
#include "InputManager.h"
namespace input {
class Button {
private:
bool m_Selected, m_Clicked;
sf::Vector2f m_Position;
sf::Sprite m_Sprite;
sf::Texture m_Texture;
public:
Button(sf::Vector2f position, sf::Sprite sprite);
Button(sf::Vector2f position, sf::Texture texture);
Button(sf::Vector2f position);
Button();
~Button();
void update(engine::InputManager inputManager);
void render(sf::RenderWindow window);
inline bool isClicked() { return m_Clicked; }
inline bool isSelected() { return m_Selected; }
inline sf::Vector2f getPosition() { return m_Position; }
void setPosition(sf::Vector2f position) { m_Position = position; }
};
}
这里是 Button.cpp:
#include "Button.h"
namespace input {
Button::Button(sf::Vector2f position, sf::Sprite texture) : m_Position(position), m_Sprite(texture) {
m_Sprite.setPosition(m_Position);
}
Button::Button(sf::Vector2f position, sf::Texture texture) : m_Position(position), m_Texture(texture) {
m_Sprite.setTexture(m_Texture);
m_Sprite.setPosition(m_Position);
}
Button::Button(sf::Vector2f position) : m_Position(position) {
m_Sprite.setPosition(m_Position);
}
void Button::update(engine::InputManager inputManager) {}
void Button::render(sf::RenderWindow window) {
window.draw(m_Sprite);
}
Button::~Button() {
delete &m_Position;
delete &m_Texture;
delete &m_Clicked;
delete &m_Selected;
}
}
这里是main.cpp代码:
#include <iostream>
#include <vector>
#include "InputManager.h"
#include "Button.h"
#define WIDTH 800
#define HEIGHT 600
#define TITLE "C++ Platformer"
int main() {
sf::RenderWindow window(sf::VideoMode(WIDTH, HEIGHT), TITLE, sf::Style::Close | sf::Style::Titlebar);
sf::Texture ButtonTexture;
ButtonTexture.loadFromFile("Texture.png");
sf::Sprite sprite;
sprite.setTexture(ButtonTexture);
input::Button* button = new input::Button(sf::Vector2f(100.f, 100.f), sprite);
int fps = 0;
int ticks = 0;
sf::Clock clock;
sf::Clock FpsClock;
sf::Time time;
sf::Time Fpstime;
long delta = 0;
long target = 1000000 / 60;
engine::InputManager IManager;
sf::Event ev;
while (window.isOpen()) {
while (window.pollEvent(ev)) {
if (ev.type == sf::Event::Closed) window.close();
if (ev.key.code == sf::Keyboard::Escape) window.close();
if (ev.type == sf::Event::KeyPressed) IManager.onKeyDown(ev.key.code);
}
time = clock.getElapsedTime();
if (target > time.asMicroseconds()) {
clock.restart();
// UPDATE
button->update(IManager);
delta = time.asMicroseconds() % 60;
target = 1000000 / 60 + delta;
ticks++;
} Fpstime = FpsClock.getElapsedTime();
if (Fpstime.asSeconds() >= 1) {
std::cout << "FPS: " << fps << " Ticks: " << ticks << std::endl;
FpsClock.restart();
fps = 0;
}
fps++;
// RENDER
button->render(window);
}
return EXIT_SUCCESS;
}
我搜索了微软文档和其他 stackoverflow 问题,但找不到像我这样的案例,希望有人能提供帮助,谢谢
【问题讨论】:
-
请附上完整的错误信息
-
请将编译器的完整错误信息添加到您的帖子中。
-
sf::RenderWindow的基类是sf::Window,它派生自NonCopyable。您不能将RenderWindow按值传递给Button::render。看diagram。使用参考。 -
不是问题,但你的析构函数会使你的程序崩溃。你只在你打电话给
new的事情上打电话给delete。你不要在班级成员上调用new,所以你不应该在他们身上调用delete。 -
我真的怎么强调都不过分。不要使用 sfml 将您的第一个程序变成游戏!实在是太消化不了了!学习使用更简单的主题在 C++ 中编程,比如可能是文本处理或小型数据管理器或类似的东西。尝试实现一个科学计算器或其他不会让您接触到庞大而复杂的库的东西。基本上,你需要在练习潜水之前学习如何游泳——尽管潜水可能更有趣。
标签: c++ sfml deleted-functions