0

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 です。更新ごとに新しいアクションを作成するか、四角形が狂ってしまいます。

私のロジックが壊れているのか、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];
}
4

1 に答える 1