0

我目前正在开发一款将为玩家随机生成地牢的游戏。这是由从不同文件调用的一大堆不同方法组成的。我似乎让代码能够计算出门的另一侧有多少可用空间。

但是有一个问题。该代码似乎仅在我使用 CCLOG 输出到控制台时才有效。我在没有测试的情况下编写了一大段代码,然后决定逐步完成它以查看代码是如何工作的(我想我会让它在没有错误的情况下运行,接下来我将检查我的值)。

在我确定代码已成功检查每个方向的可用空间并列出它检查过的位置后,我决定要删除 CCLOG 输出。不幸的是,这样做会导致代码停止工作。

//First check "forward"
bottom = CGPointMake(startLocation.x + forwardDirectionModifier.x, startLocation.y + forwardDirectionModifier.y);

top = bottom;

do
{
    currentLocation = CGPointMake(top.x + forwardDirectionModifier.x, top.y + forwardDirectionModifier.y);
    tileType = [tileCache getTileType:currentLocation];
    if (tileType == TileTypeFiller)
    {
        top = currentLocation;
        CCLOG(@"Top location is %@", NSStringFromCGPoint(top));
    }

} while (tileType == TileTypeFiller || top.y != 63);

这是代码中的一小段;这是我认为最有可能出现问题的代码部分。本质上的问题是,如果我注释掉或删除该行CCLOG(@"Top location is %@", NSStringFromCGPoint(top));,它将停止工作。

以下是更多细节:

  • 我有好几小块这样的代码,只要我CCLOG在每一个,它就能移动到下一个。如果我要注释掉其中的任何一个,它将停止进入下一个块。
  • 我可以更改 CCLOG 以输出任何内容,它仍然可以工作,它必须在那里。
  • 我试过清理项目。
  • 还有更多的 CCLOG 没有在任何循环中使用,它们可以被删除而不会产生任何后果。

有人对此有解决方案吗?据我所知,无论我是否将某些内容输出到控制台,它都不应该影响代码是否会执行。

提前致谢。

编辑:在 Ben Trengrove 的建议下,我正在添加更多使用 CCLOG 的示例。

此代码紧跟前面列出的代码。

//Check left relative to door
farLeft = CGPointMake(startLocation.x + leftDirectionModifier.x, startLocation.y + leftDirectionModifier.y);

do
{
    currentLocation = CGPointMake(farLeft.x + leftDirectionModifier.x, farLeft.y + leftDirectionModifier.y);
    tileType = [tileCache getTileType:currentLocation];
    if (tileType == TileTypeFiller)
    {
        farLeft = currentLocation;
        CCLOG(@"Far Left location is %@", NSStringFromCGPoint(farLeft));
    }

} while (tileType == TileTypeFiller || farLeft.x !=0);

//Check forwards from far left
top2 = farLeft;

do
{
    currentLocation = CGPointMake(top2.x + forwardDirectionModifier.x, top2.y + forwardDirectionModifier.y);
    tileType = [tileCache getTileType:currentLocation];
    if (tileType == TileTypeFiller)
    {
        top2 = currentLocation;
        CCLOG(@"Top2 location is %@", NSStringFromCGPoint(top2));
    }

} while ((tileType == TileTypeFiller)|| (top2.y != 63));
4

2 回答 2

0

当 currentLocation 没有切片时,您的切片缓存会以 tileType 的形式返回什么?TileTypeFiller 有没有机会?如果是的话,在适当的情况下,你几乎可以肯定那里有一个永无止境的循环......

编辑 :

请在循环后添加一行

CCLOG(@"");

并在该行上放置一个断点。看看程序是否停在那里。

于 2013-04-04T01:30:19.693 回答
0

所以问题现在已经解决了,看来我的逻辑有一部分是错误的。这是我现在所做的工作:

do
{
    currentLocation = CGPointMake(top.x + forwardDirectionModifier.x, top.y + forwardDirectionModifier.y);
    tileType = [tileCache getTileType:currentLocation];
    if (tileType == TileTypeFiller)
    {
        top = currentLocation;
    }
    locationCount++;

} while ((tileType == TileTypeFiller) && (locationCount != 15));
CCLOG(@"Top location is %@", NSStringFromCGPoint(top));

变化是我已经切换到 AND 而不是 OR。我还更改了第二部分,因为我意识到由于我的最大房间大小,我不需要在任何给定方向检查超过 15 个位置。

非常感谢所有帮助过的人。我仍然不完全确定 CCLOG 的使用如何能够以某种方式帮助克服逻辑错误,但至少它现在正在工作。

于 2013-04-05T15:56:27.580 回答