我一直在为iphone开发游戏并遇到了一个重大障碍。游戏的工作原理如下:玩家控制屏幕底部的角色。他们来回移动角色以捕捉从屏幕顶部掉落的球。这些球都是阵列的一部分,导致它们向下移动到屏幕上。它们都有相同的指针。 *球。一个方法在被调用时创建新球。如果球与角色碰撞,则它们堆叠在另一个上面。为此,它们将从移动它们的数组中移除,并添加到另一个数组中,通过使它们的X位置等于字符而使它们成为堆栈的一部分,并且Y位置是它们碰撞时的位置。我的问题是当整个屏幕需要向下滚动时堆栈越来越高。因此角色从屏幕上消失,每增加一个球,底部的一个球也会向下移动并离开屏幕。一次只在屏幕上保留三个球。我已经尝试让第二个数组向下移动但是将它们全部放在同一个位置然后销毁“堆栈”下面是我的更新方法。请通知我如何完成这项工作。我对此有点新意,非常感谢!!
由于 唐纳
if (CGRectIntersectsRect(SealRect, BallRect)) {
BallIsMoving = NO;
BallHasIntersectedSeal = NO;
//BallIntersectedSeal = YES;
[self CollisionRectUpdate];
NumberOfCollisions = NumberOfCollisions + 1;
Ball.position = ccp(SealSprite.position.x + 10, SealSprite.position.y + 20 + (NumberOfCollisions * 60));
[BallArray_ removeObject: Ball];
[BallHasCollidedArray_ addObject: Ball];
}
}
for (CCSprite *Ball in BallHasCollidedArray_) {
Ball.position = ccp(SealSprite.position.x + 10, Ball.position.y);
}
for (CCSprite *SealSprite in AllObjectsArray_) {
if (NumberOfCollisions > 3) {
FullScreenDisplacementSeal = (NumberOfCollisions - 4) * -60;
if (SealSprite.position.y > FullScreenDisplacementSeal) {
SealSprite.position = ccp(SealSprite.position.x, SealSprite.position.y - 5);
}
}
}
for (CCSprite *Ball in BallHasCollidedArray_) {
if (NumberOfCollisions > 3) {
FullScreenDisplacement = (NumberOfCollisions - 4) * 60;
Ball.position = ccp(Ball.position.x, Ball.position.y - FullScreenDisplacement);
}
}
}
我想我需要一种方法来对BallHasCollidedArray中的所有“球”采取行动,同时仍然单独对每一个进行操作。这需要表达,即使有5000个球,它仍然可以工作。
答案 0 :(得分:1)
你所有的球都在线
中完全相同的y坐标Ball.position = ccp(Ball.position.x, FullScreenDisplacement);
因此,由于它们也具有完全相同的x坐标,因此根据定义它们将位于相同的位置(如您所述)。
此外,您决定排量的数学似乎不适合我:
FullScreenDisplacement = ((NumberOfCollisions - 3) * -60) + (NumberOfCollisions * 60)
= (-60 * NumberOfCollisions) + 180 + (60 * numberOfCollisions)
= 180
正如您所看到的,经过一些简化后,您的碰撞次数实际上会因素而异。我认为你真正想要的是将每个球的原始y坐标移动与你移动密封时相同的量(假设它已被正确移位)。我假设您的球高度为60像素(因此您使用的因子为60):
for (CCSprite *Ball in BallHasCollidedArray_)
{
if (NumberOfCollisions > 3)
{
FullScreenDisplacement = (NumberOfCollisions - 3) * -60;
Ball.position = ccp(Ball.position.x, Ball.position.y - FullScreenDisplacement);
}
}
如果是这种情况,怀疑你的印章可能也不在正确的位置,考虑到你为此发布的代码。如果是这样,则采用相同的方法。
最后,您会注意到FullScreenDisplacement
循环不变 - 它的值在循环中的任何位置都不会改变。因此,在循环之外仅计算一次它会更有效。这同样适用于if
测试。
if (NumberOfCollisions > 3)
{
FullScreenDisplacement = (NumberOfCollisions - 3) * -60;
for (CCSprite *Ball in BallHasCollidedArray_)
{
Ball.position = ccp(Ball.position.x, Ball.position.y - FullScreenDisplacement);
}
}
另外,我不确定你调用的这个ccp
函数是做什么的,但是如果它只从参数创建一个新位置,那么以下是一个更简单有效的等价物:
Ball.position.y -= FullScreenDisplacement;
希望以上所有有帮助。如果任何事情没有意义,或者我提出的改变没有帮助,请告诉我,我会调整我的答案。