我在我的场景中有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;
}
答案 0 :(得分:0)
(我不知道这种编程语言所以这纯粹是一种算法视角)
首先,计算用户试图从中移动球的起始位置和结束位置。如果移动不是来自填充空间,请拒绝。如果移动不是空的,请拒绝。
其次,计算球的运动 - xDelta = xEnd - xStart,yDelta = yEnd - yStart。要使运动有效,两者中的一个必须为真:
如果两者都不属实,请拒绝。
最后,计算中点单元格。 xMid = xStart + xDelta / 2,yMid = yStart + yDelta / 2。如果这是一个球,请通过清空xStart,yStart,清空xMid,yMid并填充xEnd,yEnd来执行移动。如果它没有填满球,请拒绝。