我正在创建一个游戏,我要显示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上的白色背景作为纹理?
答案 0 :(得分:0)
如果没有其他信息,这将是我猜测的逻辑链:
由于我们看到createMaskFromColor()
函数适用于播放器模型,因此它不是错误源。由于我们看到为其他两个对象调用了相同的代码,因此色度键控也可以正常工作。因此,以下答案:
只有板条箱精灵背后的黑色背景。色度键控工作正常,并愉快地向我们展示透明角落背后的黑色背景。
如何解决:
确保地板精灵也出现在板条箱精灵后面。也许创建一个额外的精灵,并且#34; crate over a floor&#34;,以便在每次遇到这样的组合时不覆盖它们(不知道这是否真的会影响性能,只是猜测。)