我有一个派生自Humanoid和Humanoid的Player类派生自Sprite
Sprite -> Humanoid -> Player
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.Sprite有虚方法
virtual sf::Sprite getSprite() { return sprite_; }
Run Code Online (Sandbox Code Playgroud)
sprite是一个可以绘制到屏幕上的图像对象.
人形机器人宣称 virtual sf::Sprite getSprite();
玩家定义 virtual sf::Sprite getSprite() { return sprite_; }
雪碧有一个成员sprite_; 这就是我想要做的:
1)在传递精灵的同时创建一个玩家类
Player::Player(sf::Image image)
: Humanoid()
{
sprite_.SetImage(image); // Converts sf::Image to sf::Sprite
}
Run Code Online (Sandbox Code Playgroud)
2)从我的Game类中将它绘制在屏幕上
sf::Image playerImage;
if(!playerImage.LoadFromFile("Link/Link.png"))
std::cin.get();
Player *player = new Player(playerImage);
/* ... */
App.Draw(player->GetSprite());
Run Code Online (Sandbox Code Playgroud)
测试程序,我发现该player->getSprite()方法确实被调用,但我担心我可能隐藏了该Sprite::getSprite()方法而不是实际导出和使用它.由于Sprite类有一个受保护的sprite_成员,我很困惑在调用函数时我实际返回的是哪个sprite_对象.
此外,似乎图像文件在该行的某处丢失,在我在SFML论坛中发帖之前,我想确认我的继承树是否实际上是正确的.
嘿所以我刚刚开始像一天前开始使用SDL,因为我计划最终进入OpenGL,但最近研究了SFML,它显然更现代,更容易.我没有听到任何东西或看过SFML上的任何书籍,我听说有人说OpenGL + SDL非常好.将SFML与OpenGL一起使用也是如此吗?
gameObjects是一个std::map<sf::String,VisibleGameObject*>,results是一个std::map<sf::String,VisibleGameObject*>::iterator.当这运行:
return gameObjects.erase(results);
Run Code Online (Sandbox Code Playgroud)
我期望VisibleGameObject的析构函数运行,这是:
VisibleGameObject::~VisibleGameObject(){
m_pSceneManager->removeSprite(name);
}
Run Code Online (Sandbox Code Playgroud)
永远不会运行,直到持有的类gameObjects被销毁,然后运行:
GameObjectManager::~GameObjectManager(){
std::for_each(gameObjects.begin(),gameObjects.end(),GameObjectDeallocator());
}
struct GameObjectDeallocator{
void operator()(const std::pair<sf::String,VisibleGameObject*>&p) const{
delete p.second;
}
};
Run Code Online (Sandbox Code Playgroud)
然后它确实运行.为什么不在第一种情况下运行?
使用SFML 2.0
谢谢
好的,所以我有一个使用SFML的C ++项目,我希望能够使用MinGW从CMD进行编译。我有它,所以我可以编译comp.cpp,但是,我只需要知道我还要做些什么才能使其与SFML一起使用。我尝试使用CodeBlocks和MinGW对其进行编译,并且可以正常运行,直到尝试运行它为止,此时它告诉我计算机中缺少sfml-system.dll。这是否表示我安装不正确?据我所知,我一直遵循CodeBlocks的安装...我将include \ SFML放入MinGW的include \中,并将所有* .a都从lib \放入了MinGW的\ lib中。感谢您的帮助!
我有一个精灵,一个正方形,仅用于正交投影.现在我想以一种非常基本的,简单的等距方式投影它.(我知道这可能不太漂亮,但我只是想弄清楚这一点)
鉴于我的方格,我将它旋转45度.现在,如果我理解正确,我仍然应该将我的身高除以2.这在SFML中是不可能的.有一个比例函数,但是如果我在y轴方向上以0.5的比例缩放,我的立方体就会被拉伸,而不是钻石形状.看起来SFML根据它自己的相对轴(在...之前旋转)来转换精灵.
既然你无法访问精灵的高度,我想知道这是否可能?
我可以在SFML中将方形精灵转换为菱形吗?
我在SFML 2.1中有以下代码
类ResourceManager:
shared_ptr<Sprite> ResourceManager::getSprite(string name) {
shared_ptr<Texture> texture(new Texture);
if(!texture->loadFromFile(resPath+spritesPath+name))
throw new NotSuchFileException();
shared_ptr<Sprite> sprite(new Sprite(*texture));
return sprite;
}
Run Code Online (Sandbox Code Playgroud)
主要方法:(我将省略大部分不相关的代码
shared_ptr<Sprite> sprite = ResourceManager::getSprite("sprite.png");
...
while(renderWindow.isOpen())
renderWindow.draw(*sprite);
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这使我的精灵渲染完全变白,但如果我这样做:
shared_ptr<Sprite> ResourceManager::getSprite(string name) {
Texture* texture = new Texture; // <------- From shared pointer to pointer
if(!texture->loadFromFile(resPath+spritesPath+name))
throw new NotSuchFileException();
shared_ptr<Sprite> sprite(new Sprite(*texture));
return sprite;
}
Run Code Online (Sandbox Code Playgroud)
它完美地运作.
那么这里发生了什么?我假设共享指针只能用作指针.它会被删除吗?我的主要方法是保留对它的引用,所以我真的不明白这里发生了什么:S
编辑:我完全知道删除精灵不会删除纹理,这是产生我必须处理的内存泄漏,这就是为什么我试图在第一个地方使用智能指针...
关于StackOverflow的第一个问题.我要为我糟糕的英语道歉.
我实际上正在为视频游戏开发一个菜单.我想清除代码,所以我想用vector来调用不同的函数(比如为图片充电或修改文本)
这是代码:
Menu.hh:
class Menu
{
int _position
std::vector<Menu> _graph;
std::list<sf::Text> _text;
public:
//constructors and destructors
virtual std::list<sf::Text> &modifyText();
}
Run Code Online (Sandbox Code Playgroud)
Menu.cpp
std::list<sf::Text> &modifyText()
{
std::cout << this->_position << std::endl;
this->_text = this->_graph[this->_position].modifyText();
return (this->_text); // don't care of the return
}
void Menu::initGame()
{
this->_graph.push_back(MenuBase());
// if i Put this code on the constructor, the constructor call himself and not the MenuBase constructor
this->modifyText();
}
Run Code Online (Sandbox Code Playgroud)
MenuBase.hpp
class MenuBase : public Menu
{
//constructor and destructor
std::list<sf::Text &modifyText(){std::cout << "work" …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试配置我的Cmake文件以包含SFML库.我的CMakeLists.txt.如果重要的话,我正在使用OS X Yosemite.
cmake_minimum_required(VERSION 2.8.4)
project(SFMLTest)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=lib++")
set(SOURCE_FILES main.cpp)
add_executable(SFMLTest ${SOURCE_FILES})
#Detect and add SFML
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/Users/Home/SFML-2.2-osx-clang-universal/cmake/Modules" ${CMAKE_MODULE_PATH})
find_package(SFML 2.2 REQUIRED system window graphics network audio)
if (SFML_FOUND)
include_directories(${SFML_INCLUDE_DIR})
target_link_libraries(${main.cpp} ${SFML_Libraries})
endif()
Run Code Online (Sandbox Code Playgroud)
而我目前得到的错误是
Error:By not providing "FindSFML.cmake" in CMAKE_MODULE_PATH this project has asked
CMake to find a package configuration file provided by "SFML", but CMake did notfind one.
Could not find a package configuration file provided by "SFML" (requested version 2.2)
with any of the following names: …Run Code Online (Sandbox Code Playgroud) 我使用右手坐标(x =右,y =向上)将我的物体放在世界空间中.
当我必须使用SFML渲染它们时,我遇到了问题,因为我无法在sf :: View中使用(y = up)矩阵设置View矩阵,然后全部渲染y-flipped.
我正在考虑的一个解决方案是在渲染之前在每个对象上翻转y轴:
ObjectTransformMatrix * MatrixScale(1.0f,-1.0f)
Run Code Online (Sandbox Code Playgroud)
但我想我必须将sf :: View中心移动到:
y = y - (view_size.y / 2.0)
Run Code Online (Sandbox Code Playgroud)
为什么sf :: View是y-inverted?我的解决方案是否正确
sf::RenderWindow::getPosition()0, 0当我从创建窗口的同一范围调用它时,总是返回而不是正确的位置.
以下是重现问题的示例代码:
#include <iostream>
#include <memory>
#include <SFML/Graphics.hpp>
int main() {
std::unique_ptr<sf::RenderWindow> window_;
window_ = std::unique_ptr<sf::RenderWindow>(
new sf::RenderWindow(sf::VideoMode(800, 600), "asd", sf::Style::Default)
);
window_->setFramerateLimit(30);
window_->setVerticalSyncEnabled(false);
while (window_->isOpen()) {
sf::Event evt;
while (window_->pollEvent(evt)) {
if (evt.type == sf::Event::Closed) { window_->close(); }
}
window_->clear();
window_->display();
}
const sf::Vector2i wpos = window_->getPosition();
std::cout << "window position: " << wpos.x << "/" << wpos.y <<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是:我有一个MainMenu我传递的类sf::RenderWindow *(带window_.get()).
当我打电话window_->getPosition()给MainMenu它报告正确的位置时,所以getPosition() …