Objective c Cocos2d';捕捉到网格';逻辑

Objective c Cocos2d';捕捉到网格';逻辑,objective-c,cocos2d-iphone,Objective C,Cocos2d Iphone,我正在Cocos2d中构建一个游戏,我很难实现我想要的。想象一个8 x 10的正方形网格。您可以触摸一个正方形并水平/垂直拖动该正方形的行/列,但不能同时拖动这两个行/列。释放行/列后,正方形将根据其最近的行/列位置在栅格中“捕捉”回原位 一切都以编程方式工作,没有重叠、错位或无效位置。然而,我似乎无法让这个“捕捉到网格”以我想要的方式设置动画 我使用MVC设计模式将任何视图从任何游戏逻辑中分离出来。视图只需一个“squaresToUpdate”数组,查看每个正方形,找到相应的精灵,并根据正方形

我正在Cocos2d中构建一个游戏,我很难实现我想要的。想象一个8 x 10的正方形网格。您可以触摸一个正方形并水平/垂直拖动该正方形的行/列,但不能同时拖动这两个行/列。释放行/列后,正方形将根据其最近的行/列位置在栅格中“捕捉”回原位

一切都以编程方式工作,没有重叠、错位或无效位置。然而,我似乎无法让这个“捕捉到网格”以我想要的方式设置动画

我使用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没有做我想做的事情,还是这个问题实际上比我最初想象的要困难得多。有人能帮我解释一下这个逻辑吗

好的旧铅笔和纸给了我这个,但我不确定它是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];
}

我会覆盖cocos2d触摸方式:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
CCtouchBegind将触摸点与每个游戏对象进行比较,并设置“触摸”标志:

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

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


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

你介意告诉我你是如何设置正方形网格的吗?