SFML createMaskFromColor() 无法正常工作
SFML createMaskFromColor() not working correctly
我正在创建一个游戏,其中有 3 个单独的对象要显示。一层、一个玩家精灵和多个箱子。以下是所有三个的代码。
#include <iostream>
#include <fstream>
#include "Game.h"
Game::Game()
{
std::ifstream fileHndl;
fileHndl.open("Assets/mapdata.txt");
fileHndl >> mapCols;
fileHndl >> mapRows;
playerX = mapCols / 2;
playerY = mapRows / 2;
mapData = new int *[mapRows];
for (int i = 0; i < mapRows; i++) {
mapData[i] = new int[mapCols];
}
for (int i = 0; i < mapRows; i++) {
for (int j = 0; j < mapCols; j++) {
fileHndl >> mapData[i][j];
}
}
window.create(sf::VideoMode(1280, 1024), "COMP2501 Demo");
window.setFramerateLimit(5);
playerImage.loadFromFile("Assets/actor.png");
playerImage.createMaskFromColor(sf::Color::White);
playerTexture.loadFromImage(playerImage);
playerTexture.setSmooth(true);
playerSprite.setTexture(this->playerTexture);
floorTexture.loadFromFile("Assets/floor.png");
floorTexture.setSmooth(true);
crateImage.loadFromFile("Assets/crate.png");
crateImage.createMaskFromColor(sf::Color::White);
crateTexture.loadFromImage(crateImage);
crateTexture.setSmooth(true);
mapSprites = new sf::Sprite *[mapRows];
for (int i = 0; i < mapRows; i++) {
mapSprites[i] = new sf::Sprite[mapCols];
}
for (int i = 0; i < mapRows; i++)
{
for (int j = 0; j < mapCols; j++)
{
mapSprites[i][j].setPosition(j * 64, i * 64);
if (mapData[i][j] == 1)
{
mapSprites[i][j].setTexture(this->floorTexture);
}
else
{
mapSprites[i][j].setTexture(this->crateTexture);
}
}
}
}
我试图删除所有 3 个图像的白色背景,因为它们都是 .png,但是这样做时我得到了以下结果。
http://i.stack.imgur.com/KG3H2.png
这些板条箱似乎在它们周围绘制了黑色边框。有没有更好的方法来去除 PNG 上的白色背景作为纹理?
在没有其他信息的情况下,这将是我猜测的逻辑链:
由于我们看到 createMaskFromColor()
函数对播放器模型工作正常,所以它不是错误源。由于我们看到其他两个对象调用了相同的代码,因此色度键控在那里也能正常工作。因此,以下答案:
箱子精灵后面只有黑色背景。色度键控工作正常,并愉快地向我们展示了透明角后面的黑色背景。
如何修复:
确保地板精灵也出现在板条箱精灵后面。也许创建一个额外的精灵,"crate over a floor",以便在每次遇到这样的组合时不覆盖它们(不知道这是否真的影响性能,只是一个猜测。)
我正在创建一个游戏,其中有 3 个单独的对象要显示。一层、一个玩家精灵和多个箱子。以下是所有三个的代码。
#include <iostream>
#include <fstream>
#include "Game.h"
Game::Game()
{
std::ifstream fileHndl;
fileHndl.open("Assets/mapdata.txt");
fileHndl >> mapCols;
fileHndl >> mapRows;
playerX = mapCols / 2;
playerY = mapRows / 2;
mapData = new int *[mapRows];
for (int i = 0; i < mapRows; i++) {
mapData[i] = new int[mapCols];
}
for (int i = 0; i < mapRows; i++) {
for (int j = 0; j < mapCols; j++) {
fileHndl >> mapData[i][j];
}
}
window.create(sf::VideoMode(1280, 1024), "COMP2501 Demo");
window.setFramerateLimit(5);
playerImage.loadFromFile("Assets/actor.png");
playerImage.createMaskFromColor(sf::Color::White);
playerTexture.loadFromImage(playerImage);
playerTexture.setSmooth(true);
playerSprite.setTexture(this->playerTexture);
floorTexture.loadFromFile("Assets/floor.png");
floorTexture.setSmooth(true);
crateImage.loadFromFile("Assets/crate.png");
crateImage.createMaskFromColor(sf::Color::White);
crateTexture.loadFromImage(crateImage);
crateTexture.setSmooth(true);
mapSprites = new sf::Sprite *[mapRows];
for (int i = 0; i < mapRows; i++) {
mapSprites[i] = new sf::Sprite[mapCols];
}
for (int i = 0; i < mapRows; i++)
{
for (int j = 0; j < mapCols; j++)
{
mapSprites[i][j].setPosition(j * 64, i * 64);
if (mapData[i][j] == 1)
{
mapSprites[i][j].setTexture(this->floorTexture);
}
else
{
mapSprites[i][j].setTexture(this->crateTexture);
}
}
}
}
我试图删除所有 3 个图像的白色背景,因为它们都是 .png,但是这样做时我得到了以下结果。
http://i.stack.imgur.com/KG3H2.png
这些板条箱似乎在它们周围绘制了黑色边框。有没有更好的方法来去除 PNG 上的白色背景作为纹理?
在没有其他信息的情况下,这将是我猜测的逻辑链:
由于我们看到 createMaskFromColor()
函数对播放器模型工作正常,所以它不是错误源。由于我们看到其他两个对象调用了相同的代码,因此色度键控在那里也能正常工作。因此,以下答案:
箱子精灵后面只有黑色背景。色度键控工作正常,并愉快地向我们展示了透明角后面的黑色背景。
如何修复:
确保地板精灵也出现在板条箱精灵后面。也许创建一个额外的精灵,"crate over a floor",以便在每次遇到这样的组合时不覆盖它们(不知道这是否真的影响性能,只是一个猜测。)