1

我正在尝试从平铺地图编辑器 tmx 文件中制作一些移动瓷砖。我在它们自己的图层中有移动的瓷砖,我只想让它们向上移动,然后当它们到达某个 y 时,再向下移动,等等。

我一直在寻找实现这一目标的明确方法,但我的努力没有成功。

我尝试使用这里的一些方法。

总的来说,我对 cocos2d 开发还是很陌生,所以我很感激对此的任何见解。非常感谢您的宝贵时间。如果您有任何问题,请询问!:) 另外,如果有帮助,我要移动的瓷砖呈大 T 形。

最后更新:

(删除了更多不相关的代码,以便将来任何人都可以轻松找到我的解决方案(完整答案如下),您可以在上面的链接中找到我的层迭代方法)。

好的,所以我终于让它接近我想要的方式了。我认为这并不是最理想的方式,但这就是我所拥有的。

注意:为了让这对你有用,你必须在调试模式下运行你的应用程序,否则它会滞后/使玩家跌倒(至少对我来说是这样......)。

我有一个更新函数,它每帧调用某些函数。(检查碰撞、移动平台等)。

该更新功能调用我的移动平台功能..

像这样:

[self movePlatforms:0.1];

这是我的 movePlatforms 功能..

-(void)movePlatforms: (ccTime) dt{
    if(goingDown){
        moveCount++;
    }else{
        moveCount--;
    }
    CGSize s = [movingTiles layerSize];
    for( int x=0; x<s.width;x++) {
        for( int y=0; y< s.height; y++ ) {
            CCSprite *tile = [movingTiles tileAt:ccp(x,y)];
            if(goingDown){
                CGPoint newPosition = ccp(tile.position.x, tile.position.y - 1);
                tile.position = newPosition;
                if(moveCount >= 100){
                     goingDown = false;
                }
            }else{
                 CGPoint newPosition = ccp(tile.position.x, tile.position.y + 1);
                tile.position = newPosition;
                if(moveCount <= 0){
                    goingDown = true;
                }
            }
        }
    }
}

所以基本上,我创建了一个 int moveCount 和一个 BOOL goingDown 来跟踪我的 movePlatform 函数被调用了多少次。因此,在 100 次调用后,它会切换方向。

(这对我来说很好,如果是这种情况,你可能需要其他东西,比如碰撞检测器,使用这个)。

if (CGRectIntersectsRect([someSprite boundingBox], [someSprite boundingBox])) {
    //Do something
}

希望这对将来的某个人有用,我知道这对我来说很头疼,而且它可能甚至没有正确完成,或者有更好的方法来做到这一点,但如果这对你有帮助,那就太棒了!

4

2 回答 2

2

创建和删除瓷砖会影响你的表现。而不是它,尝试移动瓷砖改变它们的位置:

CCSprite *tile = [movingTiles tileAt:ccp(92,platformY)];
[movingTiles removeTileAt:ccp(92,platformY)];
CGPoint newTilePosition = tile.position;
if (goingDown){
    newTilePosition.y ++;
    if(newTilePosition.y >= 20){
        goingDown = false;
    }
}else{
    newTilePosition.y --;
    if(newTilePosition.y <= 10){
        goingDown = true;
    }
}
tile.position = newTilePosition;
于 2013-06-06T14:35:17.697 回答
1

这是我如何让我的移动瓷砖工作的(某种)一步一步的,这仅与移动瓷砖有关,与其他无关。

注意:您需要将其作为发布版(而不是调试版)运行,以使一切顺利运行,并且不会让您的角色跌倒在地。

在界面中,我创建了这些变量:

@interface HelloWorldLayer(){
    CCTMXTiledMap *map;
    BOOL goingDown;
    int moveCount;
}

CCTMXTiledMap 是我的地图的实例。BOOL 和 int 是我用来跟踪移动图块的两个变量。

-(id) init {
    if( (self=[super init]) ) {
         // add our map
         map = [[CCTMXTiledMap alloc] initWithTMXFile:@"level1-1.tmx"];
         map.position = ccp(0,0);
         [self addChild:map];

         //add our moving platforms layer
         movingTiles = [map layerNamed:@"moving_platforms"];

         //set the variables I use to keep track of the moving platforms
         goingDown = true;
         moveCount = 0;

         //schedule my update method
         [self schedule:@selector(update:)];
    }
    return self;
}

在 init 方法之后,我创建了我的移动平台方法:

-(void)movePlatforms: (ccTime) dt{
    if(goingDown){
        moveCount++;
    }else{
        moveCount--;
    }
    CGSize s = [movingTiles layerSize];
    for( int x=0; x<s.width;x++) {
        for( int y=0; y< s.height; y++ ) {
            CCSprite *tile = [movingTiles tileAt:ccp(x,y)];
            if(goingDown){
                CGPoint newPosition = ccp(tile.position.x, tile.position.y - 1);
                tile.position = newPosition;
                if(moveCount >= 100){
                    goingDown = false;
                }
            }else{
                CGPoint newPosition = ccp(tile.position.x, tile.position.y + 1);
                tile.position = newPosition;
                if(moveCount <= 0){
                    goingDown = true;
                }
            }
        }
    }
}

所以这就是魔法发生的地方,我使用从这里得到的方法,绅士Mauricio Tollin告诉我,我可以更新瓷砖位置而不是破坏并重新创建它们。

所以我遍历了我的移动平台层中的每个图块,并告诉它们每次调用都向下 1,直到 moveCount >= 100,然后它说 goingDown 现在是假的,它会改变它的方向。从那里它只是来回移动,数到 100,然后返回。

如果你想让它移动更长时间,只需增加 100 到 200 或任何你想要的。(或者你可以使用检查来检测碰撞,当它与指定的精灵碰撞时,你可以让它改变。如果你想要的更多,使用它)。

if (CGRectIntersectsRect([someSprite boundingBox], [someSprite boundingBox])) {
    //Do something
}

毕竟,我创建了我的更新方法:

-(void)update:(ccTime)dt{
    [self movePlatforms:0.1];
}

在 init 方法中,它安排每帧调用 update 方法,然后 update 方法将运行 movePlatforms 方法(或任何其他需要经常检查的功能,例如危险检测等)。

您还可以通过更改传递给 movePlatforms 的时间来使平台移动得更慢,或者您可以在 init 方法中安排更慢的更新间隔。

我希望这对未来的人有所帮助,我只是想通过更深入的过程来创建这个答案,因为我的问题帖子在我学习时确实没有组织并且经过大量编辑。

于 2013-06-07T01:21:38.960 回答