- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在基类中有一个纹理和 sprite 正在被另一个类扩展,但是在绘制时,sprite 显示为一个白色框。我知道这与 Sprite 失去它与纹理对象的链接有关,但我是 C++ 的新手,所以我不太确定这是怎么发生的。
这是代码(我删除了一些不相关的部分以减小大小):
皮卡.h:
#ifndef PICKUPS_PICKUP_H
#define PICKUPS_PICKUP_H
#include <SFML\Graphics.hpp>
#include "..\Player.h"
namespace Pickups
{
class Pickup
{
private:
sf::Vector2f position;
sf::Texture texture;
sf::Sprite sprite;
public:
Pickup();
bool drop(float dt);
void draw(sf::RenderWindow* window);
void setTexture(sf::String name);
void setPos(sf::Vector2f position);
sf::Vector2f getPos();
void isColliding(Player* player);
virtual void onCollect(Player* player) = 0;
};
}
#endif
皮卡.cpp:
#include "Pickup.h"
namespace Pickups
{
Pickup::Pickup()
{
}
void Pickup::draw(sf::RenderWindow* window)
{
window->draw(sprite);
}
void Pickup::setTexture(sf::String name)
{
if (!texture.loadFromFile("images/pickups/" + name + ".png"))
std::cout << "Error loading image: images/pickups/" + name.toAnsiString() + ".png" << std::endl;
else
sprite.setTexture(texture);
}
}
健康.h:
#ifndef PICKUPS_HEALTH_H
#define PICKUPS_HEALTH_H
#include "Pickup.h"
namespace Pickups
{
class Health : public Pickup
{
private:
int worth;
public:
Health(sf::Vector2f position, int worth);
void onCollect(Player* player);
};
}
#endif
健康.cpp:
#include "Health.h"
namespace Pickups
{
Health::Health(sf::Vector2f position, int worth)
{
setTexture("health");
setPos(position);
this->worth = worth;
}
void Health::onCollect(Player* player)
{
player->addLives(worth);
}
}
(我不知道这是否是问题的一部分,但我也可以发布它)我将拾音器存储在一个 vector 中,如下所示:
std::vector<Pickups::Health> pickups;
最佳答案
A std::vector
复制或移动插入的元素,所以只要您有默认的复制构造函数,或者只要您不更改这种肮脏的 每个元素一个纹理 样式,(元素只需要有一个公共(public)的纹理对象实际指向,所以你浪费了很多内存) sf::Sprite
的指针对象持有的纹理变得无效。要了解为什么我们需要考虑插入时会发生什么:
你设置了一个很好的Pickup
ish 对象并将其添加到调用复制构造函数的 vector 中。假设您想添加的漂亮对象是对象 A
现在添加/复制的对象是 B
.两者都有 Sprite S
和纹理 T
.两种纹理都有效,但问题是:A
的 S
指向 A
的 T
, 所以在将其复制到 B
之后B
的 S
还指向 A
的 T
!正如我假设 A
只是暂时的,所以它连同它的纹理一起被破坏,然后你就拥有了它,一个漂亮的白色盒子。
你可以用其他一些肮脏的方式解决这个问题,比如在 Pickup
中创建你自己的复制构造函数像这样:
Pickup::Pickup(const Pickup& other)
: position(other.position), texture(other.texture), sprite(other.sprite)
{ sprite.setTexture(texture); }
或通过存储 std::unique_ptr<Pickups::Health>
的,而不仅仅是 Pickups::Health
的。
然而,您应该使用某种更好的方法 Resourcemanager
,它只存储所有相关的纹理,理想情况下是一个,一个大的 tileset,因为加载一次但大的比加载多个但小的纹理更快。您可以编写自己的非常简单的管理器或使用其他一些管理器,例如来自伟大的 Thor
图书馆。要将特定图 block 设置为 Sprite 的纹理,只需调用 sf::Sprite::setTextureRect
.
我想提一下您设计的一些额外改进。让Pickup
派生自 sf::Drawable
并定义其纯虚拟 draw
函数,您可以将其设为私有(private)。因此你来自 Pickup
派生对象不需要知道任何 sf::RenderTarget
你可以做 target.draw(myPickupObject)
.
不用存储位置,让Pickup
即可派生自 sf::Transformable
, 也。您不必实现任何功能,您唯一需要做的就是将矩阵应用于 sf::RenderStates
传递给 draw
的对象.
您的总体 draw
函数可能如下所示:
void Pickup::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
//'applying' transformation-matrix
states.transform *= getTransform();
target.draw(sprite, states);
}
所以你的 Pickup
现在只有sf::Sprite
作为成员(member)和整体,您的标题只需要包含 SFML/Graphics/Sprite.hpp
.
关于c++ - SFML 纹理显示为白色框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27951870/
我有一个包含纹理的文件。我加载到 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) 方面 显示这样的窗口... 我的目标是以全屏模式执行程序并放置旧的 '窗口' (检查图像
我是一名优秀的程序员,十分优秀!