Cocos2d'对齐网格'逻辑

时间:2013-04-19 21:33:35

标签: objective-c cocos2d-iphone

我在Cocos2d中构建游戏,我很难实现我想要的东西。想象一下8 x 10的正方形网格。您可以触摸正方形并水平/垂直拖动该正方形的行/列,但不能同时拖动两者。释放行/列后,方块将“快速”按下'根据最近的行/列位置返回到网格中的位置。

一切都以编程方式工作,没有重叠或错位的方块或无效的位置。但是,我似乎无法得到这个' snap to grid'动画我想要的方式。

我使用MVC设计模式将任何视图与任何游戏逻辑分开。视图只是递送一组' squaresToUpdate',查看每个方块,找到相应的精灵,并根据方块的位置更新精灵的位置。

当尝试按照以下方式做某事时会出现问题:

-update():
for each square in squaresToUpdate:
  if square is not being dragged at the moment:
    setup a 'CCMoveTo' to bring the sprite in line with square  

我无法让这些方块在被拖动时自由移动,但是当没有被拖动时CCMoveTo。要么我每次更新都要创建一个新动作,要么广场就是吓坏了。

我不知道我的逻辑是否被破坏,如果CCMoveTo没有做我想做的事,或者这个问题实际上比我最初想的要困难得多。有人可以帮我解决这个问题吗?

好的旧铅笔和纸给了我这个,但我不确定它是100%:

- (void)update:(ccTime)dt {
    NSMutableArray *toDraw = [self.rootView whatAmIDrawing];
    for (GameObject *o in toDraw) {
        CCSprite *sprite = (CCSprite*)[self.batch getChildByTag:o.tag];
        if (o.moving == NO) {
            if (o.snapping == NO) {
                o.snapping = YES;
                CCMoveTo *move = [CCMoveTo actionWithDuration:self.rootView.model.activeGame.snapSpeed position:o.position];
                [sprite runAction:move];
            }
        } else {
            o.snapping = NO;
            sprite.position = o.position;
            sprite.rotation = o.rotation;
        }
    }
    [super update:dt];
}

1 个答案:

答案 0 :(得分:0)

我会覆盖cocos2d触摸方法:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event

ccTouchBegan会将触摸点与每个游戏对象进行比较并设置“触摸”标记:

ccTouchMoved会将任何“已触摸”对象的位置设置为新触摸位置,并设置“移动”标记。

ccTouchEnded将清除所有“触摸”标志,将CCMoveTo运行到具有“移动”标志的任何对象的新位置,然后清除所有“移动”标志。

update()方法只需将每个精灵的位置更改为对象的位置。