所以我正在尝试使用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;
答案 0 :(得分:0)
每当你有这样的嵌套if语句(高cyclomatic complexity)时,你应该立即停下来思考其他设计。大型嵌套if语句不仅容易出错,而且一目了然也无法真正理解。
更好的设计可以从将事物分成多个函数开始,每个函数都有自己的single responsibility。其他步骤涉及思考逻辑足够难以找到消除条件的方法,即当情况X持续时,Y跟随并且不需要进一步检查。然后还有一些情况,你可以构造一个在构造之后具有正确设置的对象,而不是使用if语句。
关于代码的优化:
setTextureRect
基本上是一个自由函数,在一直切换纹理时,可能会导致性能问题。doesBlockExist
的实现,至少要确保在找到块时向右返回并且不要继续迭代。这意味着,在if-body内部只需编写return true
并在循环之后写return false
并删除变量returnVal。doesBlockExist
功能似乎很难实现。究竟是什么检查的?你刚检查周围的瓷砖吗?如果是这样,那么您可以轻松地检查周围的8个图块,而不需要遍历所有图块。doesBlockExist
,您将不得不考虑,是否无法只调用一次并立即报告所有周围的瓷砖。int(round(x / 20) * 20);
因为x已经int
x / 20
无论如何都是整数除法,因此没有理由进行舍入。或者你可以使用像Tiled这样的平铺编辑器,并在设计关卡时相应地放置平铺,然后只需加载平铺贴图。
至于标题中的问题,我不知道你对边界的意思。