【问题标题】:Trouble with sprites (loading and removing)-cocos2d iphone精灵问题(加载和删除)-cocos2d iphone
【发布时间】:2010-07-22 18:16:20
【问题描述】:

基本上,我有一个 Sprite 数组要按顺序一个一个地加载和删除。 我有一个数组中的动物名称列表,例如

 const NSString *Animal1[30] = {@"Lion .png",@"Zebra .png",...........

要加载精灵,我使用以下代码

image[i]= [Sprite spriteWithFile: [NSString stringWithFormat:@"%@",Animal1[i]]];
image[i].position = ccp( 240,180 );
[self addChild: image[i]];

然后在使用后删除精灵我使用以下代码

[self removeChild:image[i] cleanup:YES];

当我在模拟器中运行代码时,精灵会一个接一个地加载,直到第 20 只动物。在第 20 只动物之后,应用程序崩溃。 我不知道是什么问题。如果我的数组小于 20,它可以正常工作,但是当它超过应用程序崩溃时。 任何人都可以帮助解决这个问题。

【问题讨论】:

    标签: iphone cocos2d-iphone


    【解决方案1】:

    如果它适用于前 20 个,听起来您可能有一个错误的图像或第 21 个图像的错误文件名。如果您尝试从不受支持或不存在的图像创建精灵,那么您将遇到崩溃。

    检查并确保列出的所有文件名实际上都在您的包中(也要检查大小写,因为它们区分大小写!)。确保文件名完全匹配 - 在上面粘贴的代码示例中,标题中似乎有空格。

    如果文件都在那里,请确保您没有将其中一个文件保存为 Photoshop 文档,而不是保存为 .png 或其他文件。即使文件名以 .png 结尾,也并不意味着它是以该格式保存的。

    【讨论】:

    • 非常感谢您的回复。我检查了每张图片的扩展名、案例、位置,但它仍然崩溃。我什至更改了图像集,但在第 20 张图像后仍然崩溃。
    • 你能发布更多代码吗?向我们展示整个代码块。
    【解决方案2】:

    根据您对问题的描述,它甚至可能是一个错误的索引,而您只是在增加超出范围之类的东西。清除它的最好方法是进行一些基本的调试。

    1. 将最后一项放在中间 数组。它是否仍然爆炸 最后一个或在同一个条目上 它在什么位置?
    2. 删除有问题的项目,看看是否 没有它,代码也可以工作
    3. 通过代码跟踪并查看 爆炸的入口点, 检查您的堆栈跟踪等。

    【讨论】:

    • 您好,感谢您的回复,我尝试更换该项目并将其移除,但仍然无效。
    【解决方案3】:

    要验证您的所有文件是否正常,请尝试手动加载每个文件,而不是使用类似数组(在每一行放置一个断点并使用 Build & Debug):

    (pseudo code)
    add the lion sprite
    add the tiger sprite
    add the bear sprite
    ...etc...
    

    如果可行,那么通过不使用循环来加载精灵来测试您的数组,通过调用它的索引来加载每个精灵(在每一行上放置一个断点并使用构建和调试):

    (pseudo code)
    add image[1]
    add image[2]
    add image[3]
    ...etc...
    

    如果效果很好,我会将您的精灵设置为精灵数组,例如:

    (pseudo code)
    create the sprite with image[i]
    add the sprite to spriteArray
    ---repeat for each sprite---
    

    然后执行另一个循环将精灵添加到图层中,例如:

    CGSize size = [[CCDirector sharedDirector] winSize];
    for CCSprite *aSprite in SpriteArray {
             aSprite.position = ccp((size.width - (aSprite.contentSize.width / 2)), (aSprite.contentSize.height / 2));  //positions the sprite to the lower right corner
             [self addChild aSprite];
        }
    

    我喜欢将我的精灵放在一个数组中,这样当我需要使用它们时就可以更容易地遍历数组。另外,我喜欢使用相对于窗口大小和精灵大小的坐标,而不是使用绝对坐标。通过以这种方式定位它们,无论您使用什么类型的显示或方向或精灵大小,它都会转换坐标。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多