- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找不到解决代码中此错误的方法,在谷歌搜索并检查源代码后,我找不到解决它的方法。
错误:
Error 1 error C2248: 'sf::NonCopyable::NonCopyable' : cannot access private member declared in class 'sf::NonCopyable' d:\sfml-2.3.1\include\sfml\window\window.hpp 521
和
Error 2 error C2248: 'sf::NonCopyable::NonCopyable' : cannot access private member declared in class 'sf::NonCopyable' d:\sfml-2.3.1\include\sfml\graphics\rendertarget.hpp 419
这是我认为错误所在的代码,否则就是很多代码。如果您需要完整代码,请提出要求,我会快速编辑这篇文章。
#ifndef SCENENODE_H
#define SCENENODE_H
#include <SFML/Graphics/Drawable.hpp>
#include <SFML/Graphics/Transformable.hpp>
#include <SFML/System/NonCopyable.hpp>
#include <SFML/System/Time.hpp>
#include <vector>
#include <memory>
class SceneNode : public sf::Transformable, public sf::Drawable, private sf::NonCopyable
{
public:
typedef std::unique_ptr<SceneNode> Ptr;
private:
std::vector<Ptr> children;
SceneNode* parent;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
virtual void drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const;
void drawChildren(sf::RenderTarget& target, sf::RenderStates states) const;
virtual void updateCurrent(sf::Time dt);
void updateChildren(sf::Time dt);
public:
SceneNode();
void update(sf::Time dt);
void attachChild(Ptr child);
Ptr detachChild(const SceneNode& node);
sf::Transform getWorldTransform() const;
sf::Vector2f getWorldPosition() const;
};
#endif
#include "SceneNode.h"
#include <cassert>
SceneNode::SceneNode() : parent(nullptr) {}
void SceneNode::attachChild(Ptr child){
child->parent = this;
children.push_back(std::move(child));
}
SceneNode::Ptr SceneNode::detachChild(const SceneNode& node){
auto found = std::find_if(children.begin(), children.end(),
[&](Ptr& p) {return p.get() == &node; });
assert(found != children.end());
Ptr result = std::move(*found);
result->parent = nullptr;
children.erase(found);
return result;
}
void SceneNode::drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const{}
void SceneNode::draw(sf::RenderTarget& target, sf::RenderStates states) const{
states.transform *= getTransform();
drawCurrent(target, states);
drawChildren(target, states);
}
void SceneNode::update(sf::Time dt){
updateChildren(dt);
updateCurrent(dt);
}
void SceneNode::updateChildren(sf::Time dt){
for (Ptr& child : children)
child->update(dt);
}
void SceneNode::updateCurrent(sf::Time dt){
for (Ptr& child : children)
child->update(dt);
}
void SceneNode::drawChildren(sf::RenderTarget& target, sf::RenderStates states) const{
for(const Ptr& child : children)
child->draw(target, states);
}
sf::Transform SceneNode::getWorldTransform() const{
sf::Transform transform = sf::Transform::Identity;
for (const SceneNode* node = this; node != nullptr; node = node->parent)
transform = node->getTransform() * transform;
return transform;
}
sf::Vector2f SceneNode::getWorldPosition() const{
return getWorldTransform() * sf::Vector2f();
}
#ifndef AIRPLANE_H
#define AIRPLANE_H
#include "Entity.h"
#include "ResourceIdentifiers.h"
#include <SFML/Graphics/Sprite.hpp>
class Airplane : public Entity
{
public:
enum Type{
Raptor, Eagle,
};
Airplane(Type type, const TextureHolder& textures);
private:
virtual void drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const;
Type type;
sf::Sprite sprite;
};
#endif
#include "Airplane.h"
#include "ResourceHolder.h"
Textures::ID toTextureID(Airplane::Type type){
switch (type){
case Airplane::Eagle:
return Textures::Eagle;
case Airplane::Raptor:
return Textures::Raptor;
}
return Textures::Eagle;
}
Airplane::Airplane(Type _type, const TextureHolder& textures)
: type(_type), sprite(textures.get(toTextureID(type)))
{
sf::FloatRect bounds = sprite.getLocalBounds();
sprite.setOrigin(bounds.width / 2.f, bounds.height / 2.f);
}
void Airplane::drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const{
target.draw(sprite, states);
}
#ifndef SPRITENODE_H
#define SPRITENODE_H
#include "SceneNode.h"
#include <SFML/Graphics/Sprite.hpp>
#include <SFML/Graphics/RenderStates.hpp>
#include <SFML/Graphics/RenderTarget.hpp>
class SpriteNode : public SceneNode
{
sf::Sprite sprite;
virtual void drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const;
public:
explicit SpriteNode(const sf::Texture& texture);
SpriteNode(const sf::Texture& texture, const sf::IntRect& rect);
};
#endif
#include "SpriteNode.h"
SpriteNode::SpriteNode(const sf::Texture& texture) : sprite(texture)
{ }
SpriteNode::SpriteNode(const sf::Texture& texture, const sf::IntRect& rect) : sprite(texture, rect)
{ }
void SpriteNode::drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const{
target.draw(sprite, states);
}
#ifndef WORLD_H
#define WORLD_H
#include <SFML/System/NonCopyable.hpp>
#include <SFML/Graphics/View.hpp>
#include <SFML/Graphics/Texture.hpp>
#include <array>
#include "ResourceIdentifiers.h"
#include "ResourceHolder.h"
#include "SceneNode.h"
#include "SpriteNode.h"
#include "Airplane.h"
class World : private sf::NonCopyable
{
enum Layer{
Background,
Air,
LayerCount
};
sf::RenderWindow window;
sf::View worldView;
TextureHolder textures;
SceneNode sceneGraph;
std::array<SceneNode*, LayerCount> sceneLayers;
sf::FloatRect worldBounds;
sf::Vector2f spawnPosition;
float scrollSpeed;
Airplane* playerAirplane;
void loadTextures();
void buildScene();
public:
explicit World(sf::RenderWindow& window);
void update(sf::Time dt);
void draw();
};
#endif
#include "World.h"
World::World(sf::RenderWindow& win) : window(win),
worldView(win.getDefaultView()),
worldBounds(0.f, 0.f, worldView.getSize().x, 2000.f),
spawnPosition(worldView.getSize().x / 2.f, worldBounds.height - worldView.getSize().y / 2.f),
scrollSpeed(-50.f),
playerAirplane(nullptr),
textures()
{
loadTextures();
buildScene();
worldView.setCenter(spawnPosition);
}
void World::loadTextures(){
textures.load(Textures::Eagle, "D:/SFMLpro/Eagle.png");
textures.load(Textures::Raptor, "D:/SFMLpro/Raptor.png");
textures.load(Textures::Desert, "D:/SFMLpro/Desert.png");
}
void World::buildScene(){
for (std::size_t i = 0; i < LayerCount; ++i){
SceneNode::Ptr layer(new SceneNode());
sceneLayers[i] = layer.get();
sceneGraph.attachChild(std::move(layer));
}
sf::Texture& texture = textures.get(Textures::Desert);
sf::IntRect textureRect(worldBounds);
texture.setRepeated(true);
std::unique_ptr<SpriteNode> backgroundSprite(new SpriteNode(texture, textureRect));
backgroundSprite->setPosition(worldBounds.left, worldBounds.top);
sceneLayers[Background]->attachChild(std::move(backgroundSprite));
std::unique_ptr<Airplane> leader(new Airplane(Airplane::Eagle, textures));
playerAirplane = leader.get();
playerAirplane->setPosition(spawnPosition);
playerAirplane->setVelocity(40.f, scrollSpeed);
sceneLayers[Air]->attachChild(std::move(leader));
std::unique_ptr<Airplane> leftEscort(new Airplane(Airplane::Raptor, textures));
leftEscort->setPosition(-80.f, 50.f);
playerAirplane->attachChild(std::move(leftEscort));
std::unique_ptr<Airplane> rightEscort(new Airplane(Airplane::Raptor, textures));
rightEscort->setPosition(80.f, 50.f);
playerAirplane->attachChild(std::move(leftEscort));
}
void World::draw(){
window.setView(worldView);
window.draw(sceneGraph);
}
void World::update(sf::Time dt){
worldView.move(0.f, scrollSpeed * dt.asSeconds());
sf::Vector2f position = playerAirplane->getPosition();
sf::Vector2f velocity = playerAirplane->getVelocity();
if (position.x <= worldBounds.left + 150 || position.x >= worldBounds.left + worldBounds.width - 150){
velocity.x = -velocity.x;
playerAirplane->setVelocity(velocity);
}
sceneGraph.update(dt);
}
#ifndef GAME_H
#define GAME_H
#include "ResourceHolder.h"
#include "World.h"
#include <SFML/Graphics/RenderStates.hpp>
#include <SFML/Graphics/RenderTarget.hpp>
class Game{
sf::RenderWindow window;
World world;
void processEvents();
void update(sf::Time deltaTime);
void render();
void handlePlayerInput(sf::Keyboard::Key key, bool isPressed);
public:
Game();
void run();
};
#endif
#include "Game.h"
Game::Game() : window(sf::VideoMode(1600, 900), "SFML"), world(window) {}
void Game::run(){
sf::Clock clock;
sf::Time timeSinceLastUpdate = sf::Time::Zero;
const sf::Time timePerFrame = sf::seconds(1.f / 60.f);
while (window.isOpen()){
processEvents();
timeSinceLastUpdate += clock.restart();
while (timeSinceLastUpdate > timePerFrame){
timeSinceLastUpdate -= timePerFrame;
processEvents();
update(timePerFrame);
}
render();
}
}
void Game::processEvents(){
sf::Event evt;
while (window.pollEvent(evt)){
switch (evt.type){
case sf::Event::Closed:
window.close();
break;
case sf::Event::KeyPressed:
handlePlayerInput(evt.key.code, true);
break;
case sf::Event::KeyReleased:
handlePlayerInput(evt.key.code, false);
}
}
}
void Game::update(sf::Time deltaTime){
world.update(deltaTime);
}
void Game::render(){
window.clear();
world.draw();
window.setView(window.getDefaultView());
window.display();
}
void Game::handlePlayerInput(sf::Keyboard::Key key, bool isPressed){}
谢谢
最佳答案
很多代码,但是在这里
World::World(sf::RenderWindow& win) : window(win)
您想复制 sf::RenderWindow
,但它似乎通过从 NonCopyable
派生来禁用复制构造函数。
编辑(回应评论):如果你的意思是他问如何修复,如果他确定 sf::RenderWindow
的实例将在整个生命周期内保持有效,则该成员可以作为引用World
对象的...
关于C++ SFML 错误 sf::NonCopyable::Noncopyable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32768203/
我有一个包含纹理的文件。我加载到 sf::Texture并用 setTextureRect 拆分成 Sprite . 现在假设一个 Sprite 包含 20 像素宽的纹理的一部分。如何渲染它以适应例如
一段时间以来,我一直在使用 SDL 来制作小东西的原型(prototype)并了解有关图形编程的更多信息。 然后我看到了SFML并想试一试,发现它更面向对象并修复了我认为 SDL 存在的一些问题。 但
我正在使用 rust-sfml ( rsfml::graphics ) 目前,将像素绘制到屏幕上。 (我只是从 Rust 和项目开始。)我将数据存储在 Image 中。 , 然后复制到 Texture
我试图在 SFML 2 中获取关键输入,在 SFML 1.6 im 中使用 while (App.GetEvent(Event)) { if (App.GetI
我做了一个非常简单的双人游戏,一个是水母,另一个是SFML中的鲨鱼。唯一的问题是一次只能有一个 Sprite 移动。这可能修复吗?我该如何修复? 编辑:我的尝试是这样的: if (event.type
我已经尝试了几个小时,但似乎无法做到我已经下载了扩展程序并寻求帮助,但此时一切都让我感到困惑。 我想在我的项目中包含 SFML 库,我正在尝试使用 Visual Studio Code 编辑器,但由于
下面链接中的图片包含 20 多张图片(每个 body 部位和盔甲类型都在单独的文件中)。这个角色在名为“Spriter”的软件中被动画化。该代码采用 spriter 的输出文件 (.scml),然后计
我的第一个问题是 C++ 是否: pTexture.getSize().x 等于 C#(因为这对我来说没有结果): pTexture.Size().X 第二个问题是关于C++代码的(如何在SFML.n
我正在尝试在 Windows 10 下用 sfml 构建游戏。它在构建时显示成功。每当我调试解决方案时,它都会显示如下错误消息: Unhandled exception at 0x00007FFA62
我开始使用 SFML 和 C++ 创建游戏。但是,我遇到了一个问题。我有基本的骨架类代码,但由于某种原因,当我创建一个窗口(sf::Window)时,我立即崩溃了!此代码不包含任何事件检查代码,但它包
我的项目中有 2 个 CMakeLists.txt 文件。 CMakeLists.txt cmake_minimum_required(VERSION 3.2) project(Game) set(C
所以我正在尝试编写一些与网络相关的代码,特别是使用 SFML 的端口扫描器。我正在运行 VS 2017 并下载了 2015 年的 SFML 版本,但是人们说这应该适用于 2017 年。 到目前为止,我
我刚刚开始使用 C++ 和 SFML,最终一切都运行良好。在出现 undefined reference 错误之前,我意识到我一直在下载错误类型的 SFML,得到的是 SJLJ 而不是 DW2。问题已
尝试将新的 C++ 项目与 SFML 链接,我执行了以下操作: 创建了一个空项目。 C/C++ >> 常规:附加包含目录:添加了 SFML 包含目录并从项目默认值继承。 链接器 >> 附加库目录:添加
当我运行代码时,除了不播放声音外,一切正常。链接很好,当我放置断点并查看声音对象时,它显示 .我在正确的位置添加了 sfml-audio-d.lib 和 sfml-audio.lib。欢迎提出任何建议
下面的代码给出了未捕获的异常(特别是 txtr.loadFromFile("C:/Users/kidz/Documents/Visual Studio 2012/Projects/SFML/Debug
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
我想知道是否可以使用 SFML 库在 C 中使用颜色设置碰撞?因为我使用的是带有图 block 的 map ,我不知道它是否可以一起工作。 谢谢! 最佳答案 据我所知,您使用具有两种颜色的图像来定义碰
我正在制作 Frogger 的 C++ SFML 版本,目前正在尝试实现 Frog 和其他物体(汽车、卡车、原木等)之间的碰撞检测。我为 Frog 和游戏对象有单独的类,并希望使用边界框来检测交叉点,
嗨,大家好 为了缩放我的 sfml 应用程序,我正在尝试解决这个问题,该程序最初使用 运行(640, 480) 方面 显示这样的窗口... 我的目标是以全屏模式执行程序并放置旧的 '窗口' (检查图像
我是一名优秀的程序员,十分优秀!