制作瓷砖的最佳方法是在它们之间没有边框?

时间:2017-08-23 21:25:11

标签: c++ sfml

所以我正在尝试使用SFML和visual c ++制作游戏。目前我在每个可能相互接近的瓦片组合的某些侧面上有不同的精灵,然后使用嵌套的if语句来检查要使用的精灵。但是,这会让我的游戏速度降低到我无法播放的程度。有更好的方法吗?

这是我的代码:

bool doesBlockExist(int x, int y) {
    bool returnVal =  false;
    int findX = int(round(x / 20) * 20);
    int findY = int(round(y / 20) * 20);
    for (int i = 0; i < blockX.size(); i++) {
        if (blockX[i] == findX && blockY[i] == findY) {
            returnVal = true;
        }
    }
    return(returnVal);

    return(true);
}

编辑:这是&#34; doesBlockExist&#34;的代码。功能:

@FXML
Button idOfButton;

1 个答案:

答案 0 :(得分:0)

每当你有这样的嵌套if语句(高cyclomatic complexity)时,你应该立即停下来思考其他设计。大型嵌套if语句不仅容易出错,而且一目了然也无法真正理解。

更好的设计可以从将事物分成多个函数开始,每个函数都有自己的single responsibility。其他步骤涉及思考逻辑足够难以找到消除条件的方法,即当情况X持续时,Y跟随并且不需要进一步检查。然后还有一些情况,你可以构造一个在构造之后具有正确设置的对象,而不是使用if语句。

关于代码的优化:

  • 使用精灵表,不要使用x数量的纹理。 setTextureRect基本上是一个自由函数,在一直切换纹理时,可能会导致性能问题。
  • 如果你保留doesBlockExist的实现,至少要确保在找到块时向右返回并且不要继续迭代。这意味着,在if-body内部只需编写return true并在循环之后写return false并删除变量returnVal。
  • 然而,doesBlockExist功能似乎很难实现。究竟是什么检查的?你刚检查周围的瓷砖吗?如果是这样,那么您可以轻松地检查周围的8个图块,而不需要遍历所有图块。
  • 由于您经常致电doesBlockExist,您将不得不考虑,是否无法只调用一次并立即报告所有周围的瓷砖。
  • int(round(x / 20) * 20);因为x已经int x / 20无论如何都是整数除法,因此没有理由进行舍入。

或者你可以使用像Tiled这样的平铺编辑器,并在设计关卡时相应地放置平铺,然后只需加载平铺贴图。

至于标题中的问题,我不知道你对边界的意思。