为什么[TMXLayer positionAt:CGPoint]不适合我?

时间:2012-05-09 21:55:55

标签: cocos2d-iphone position cgpoint tmx

我正在尝试在.tmx地图中找到特定图块的像素位置。 CCTMXLayer类的方法positionAt:应该可以解决问题,但每当我尝试使用它时,它都会返回一个坐标为(0,0)的CGPoint。这是我正在使用的代码的一部分。

    // CCTMXTiledMap Declaration using my class MapLayer
    //which inherits from CCTMXTiledMap
    MapLayer *tileMap = [MapLayer node];
    CCTMXLayer *myLayer = [tileMap layerNamed: @"Middle"];
    NSLog(@"%i", [myLayer positionAt: CGPointMake(x,y)].x);
    NSLog(@"%i", [myLayer positionAt: CGPointMake(x,y)].y);

无论x和y的值是CGPointMake的值,CGPoint(0,0)的值都会记录下来,我不明白为什么。

编辑:

我刚刚用地图声明我的图层错了吗?这是我的代码。

    //init method for MapLayer.m class file 
    @implementation MapLayer 
    -(id) init { 
    if( (self=[super initWithTMXFile: @"ZombearTilemap.tmx"])) { 
    } 
    return self; 
    } 

    //in my MainScene.m class init method
    MapLayer *tileMap = [MapLayer node]; 
    [self addChild: tileMap];
    CCTMXLayer *tileMapLayer = [tileMap layerNamed: @"Middle"];

    // (tileMapLayer == nil) returns false

    //tileMap.mapSize.width returns 0
    //[[tileMapLayer tileAt:ccp(x,y)] boundingBox].size.height returns 0

1 个答案:

答案 0 :(得分:0)

要检查的事情......

  1. myLayer有效(不是零)吗?如果它为零,则TMX文件中没有名为“Middle”的图层,或者您的TMX文件未加载。
  2. myLayer.mapTileSize.widthmyLayer.mapTileSize.height是否为非零?如果它们为零,那么您的TMX文件和/或CCTMXTiledMap的子类就会出现问题。
  3. 一般建议: Cocos2d是开源的!设置一个断点,进入CCTMXLayer的{​​{1}}代码,找出那里发生的事情。


    编辑:

    如果您使用“Tiled”创建TMX文件,请进入“首选项”并将“将图块层数据存储为:”从“Base64(压缩gzip)”更改为“XML”。 Cocos2d无法读取此TMX编码,但这可以通过在任何类型的文本编辑器或Web浏览器中打开TMX文件轻松查看数据。 (如果您没有使用Tiled,我不知道您是如何创建TMX文件的,但请在此处获取:http://www.mapeditor.org/

    更改优先顺序后,打开并将TMX文件重新保存到其他位置。您可能应该将其重命名为-XML.tmx或其他内容,因此您不会在以后偶然尝试将其提供给cocos2d,并想知道为什么不加载它。 ;)

    您的图层将从地图的-(CGPoint) positionAt:(CGPoint)pos媒体资源中获取mapTileSize媒体资源。此属性是从TMX文件的元素设置的。这是一个例子:tileSize

    如果一切看起来都不错,那么您不小心将此值重置为0,即代码中的某个位置。如果它搞砸了,那么您需要手动调整此xml文件,或者使用正确的tileize值从头开始重新创建TMX文件。

    不要忘记将Tiled中的首选项更改回“Base64(压缩gzip)”,以cocos2d可以加载的格式保存您的工作。