如何使用条件和约束移动精灵

时间:2013-02-06 04:37:17

标签: ios objective-c cocos2d-iphone

我在我的场景中有32个精灵,我已经像这样安排了我的精灵

                 o   o   o

                 o   o   o

       o    o    o   o   o    o    o

       o    o    o   .   o    o    o 

       o    o    o   o   o    o    o

                 o   o   o

                 o   o   o

o ---> MovingBall   。 --->空洞

当我移动一个精灵移动到空洞时,中间精灵将被移除,我的精灵和洞应该互换,就像这样。

o  o  . ----->  . . o

可能的方式:

    |            |         |            |          |            |           |
o   |            |    .    |            |   o      |         .  |  .        |       .
o   |   o  o  .  |    o    |  .  o  o   |     o    |       o    |    o      |     o
.   |            |    o    |            |       .  |    o       |      o    |  o
    |            |         |            |          |            |           |

完全移动精灵的可能性为8。

任何人都可以帮我解决这个问题 我应该在代码中更改什么?

我的编码在这里

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{ 
UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:[myTouch view]];
location = [[CCDirector sharedDirector] convertToGL:location];


if(movingBall)
{
    for(int i = 0; i<32; i++)
    {
        CCSprite *currentSprite = (CCSprite *)[self getChildByTag:i];

        if(CGRectContainsPoint([currentSprite boundingBox],location))
        {
            // get moving sprite touched

            if(movingBall.position.x == hole.position.x+(2*75) || movingBall.position.x == hole.position.x-(2*75) || movingBall.position.y == hole.position.y+(2*75) || movingBall.position.y == hole.position.y -(2*75))
            {
                movingBall = (CCSprite *)currentSprite;
                break;
            }
        }
    }
  }
 }
-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch=[touches anyObject];
CGPoint location=[touch locationInView:[touch view]];
location=[[CCDirector sharedDirector]convertToGL:location];
location=[self convertToNodeSpace:location];

if(!movingBall)
{
    return;
}


movingBall.position = location;

for(int i = 0; i<32; i++)
{
    CCSprite *currentSprite = (CCSprite *)[self getChildByTag:i];

    if(CGRectIntersectsRect([movingBall boundingBox],[currentSprite boundingBox]))
    {
        // current sprite touched
        if(currentSprite.tag == hole.tag)
        {
            movingBall.position = hole.position;

            [self removeChild:currentSprite];
            break;
        }

    }
}}

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if(!movingBall)
{
    return;
}

movingBall = nil;
}

1 个答案:

答案 0 :(得分:0)

(我不知道这种编程语言所以这纯粹是一种算法视角)

首先,计算用户试图从中移动球的起始位置和结束位置。如果移动不是来自填充空间,请拒绝。如果移动不是空的,请拒绝。

其次,计算球的运动 - xDelta = xEnd - xStart,yDelta = yEnd - yStart。要使运动有效,两者中的一个必须为真:

  • abs(xDelta)或abs(yDelta)== 2,其他== 0.
  • abs(xDelta)== 2和abs(yDelta)== 2.

如果两者都不属实,请拒绝。

最后,计算中点单元格。 xMid = xStart + xDelta / 2,yMid = yStart + yDelta / 2。如果这是一个球,请通过清空xStart,yStart,清空xMid,yMid并填充xEnd,yEnd来执行移动。如果它没有填满球,请拒绝。