我正在尝试将所有纹理存储在一个数组中。 但是图像没有返回,似乎这是我的代码
我假设我的 loadTex 和 loadSpri 函数会返回并将它们数据存储在我制作的数组中,但它似乎不是那样工作的,因为当我运行游戏时它们不会出现,只是空白。我的代码可能看起来很糟糕,但我仍然是初学者,并试图掌握窍门
这是渲染图.cpp
#include "render.h"
texandsprite render::textures[5];
sf::Texture loadTex(std::string);
sf::Sprite loadSpri(sf::Texture);
//Function to start the game
void render::start()
{
_mainWindow.create(sf::VideoMode(1024, 768, 32), "A New Life");
textures[1].tex = loadTex("civilian.png");
textures[1].spri = loadSpri(textures[1].tex);
GameLoop();
}
void render::GameLoop()
{
sf::Event event;
//Load(1, "civilian.png");
float x = 0;
float y = 0;
while(_mainWindow.isOpen())
{
while (_mainWindow.pollEvent(event))
{
//Check the type of event
switch (event.type)
{
//window closed
case sf::Event::Closed:
_mainWindow.close();
break;
case sf::Event::KeyPressed:
switch(event.key.code)
{
case sf::Keyboard::Up:
--y;
break;
case sf::Keyboard::Down:
y += 5;
break;
case sf::Keyboard::Right:
++x;
break;
case sf::Keyboard::Left:
--x;
break;
}
break;
default:
break;
}
}
_mainWindow.clear(sf::Color::White);
//Draw everything here
//_mainWindow.draw(...);
textures[1].spri.setPosition(x,y);
_mainWindow.draw(textures[1].spri);
//End the current frame
_mainWindow.display();
}
}
sf::RenderWindow render::_mainWindow;
sf::Texture render::loadTex(std::string filename)
{
sf::Texture temptex;
if(!temptex.loadFromFile(filename))
{
std::cout << "Error: could not load image" << filename << std::endl;
}
std::cout << filename << " Loaded" << std::endl;
return temptex;
}
sf::Sprite render::loadSpri(sf::Texture temptex)
{
sf::Sprite tempspri;
tempspri.setTexture(temptex);
return tempspri;
}
这是渲染.h
#ifndef RENDER_H_INCLUDED
#define RENDER_H_INCLUDED
#include "SFML/Window.hpp"
#include "SFML/Graphics.hpp"
#include <iostream>
struct texandsprite
{
sf::Texture tex;
sf::Sprite spri;
};
class render
{
public:
static void start();
//Here will go a list of all moving entities
static texandsprite textures[5];
//Here will go a list of all nonmoving entities
//static
private:
static void GameLoop();
static void Rendering();
static sf::Texture loadTex(std::string);
static sf::Sprite loadSpri(sf::Texture);
static sf::Texture texture;
static sf::Sprite sprite;
static sf::RenderWindow _mainWindow;
};
#endif // RENDER_H_INCLUDED
sf::Sprite render::loadSpri(sf::Texture temptex) { sf::Sprite tempspri; tempspri.setTexture(temptex); return tempspri; }
这与sf::纹理作为类成员不起作用?非常相关。也看看我的回答。
发生的情况是,你的子画面被设置为显示temptex
但当函数返回时,这个纹理被破坏了,因为它是按值传递给函数的。
可以通过改用对sf::Texture
的引用来解决此问题。
有关您的评论的更多详细信息,请参见下文。我稍微简化了您的情况和代码,以突出显示真正需要理解的内容。
生成具有如下所示loadTexture()
纹理很好,因为只有返回的副本可供用户访问——他无法设置精灵以使用原始纹理,因此他不会患上白色方块综合症。
sf::Texture loadTexture(std::string name)
{
sf::Texture ret;
if (!ret.loadFromFile(name)) { doSomethingAboutIt(); }
return ret;
}
关于loadSprite()
函数,您可以使用 const ref 按如下方式sf::Texture
以防止任何复制,从而防止出现白色方块问题。
sf::Sprite loadSprite(sf::Texture const& tex)
{
sf::Sprite ret(tex);
return ret;
}
但是仍然有一个陷阱:你必须小心你如何存储loadTexture()
返回的纹理!这种纹理的寿命应该和你的精灵的寿命一样长。您的上面代码(以及下面供参考)应该可以工作:
void render::start()
{
_mainWindow.create(sf::VideoMode(1024, 768, 32), "A New Life");
textures[1].tex = loadTexture("civilian.png");
textures[1].spri = loadSprite(textures[1].tex);
GameLoop();
}