在网格 xcode 中移动球

Posted

技术标签:

【中文标题】在网格 xcode 中移动球【英文标题】:moving a ball in a grid xcode 【发布时间】:2013-10-21 18:03:08 【问题描述】:

我正在尝试构建一个 iphone 应用程序,该应用程序具有上下 5 列和来回 8 行的网格。我希望有一个球能够连续遍历这些。我敢肯定,必须有某种方法可以做到这一点,如果有人知道,请告诉我。我目前正在为每一列和每一行使用一个球,其中包含隐藏/显示各种球的 if 语句。所以我可以让球在第一行穿过,当它到达一列时,它会被隐藏,并且该列中的球会显示并上下移动。与第一列中的球相同。当它到达一排时它会上下移动,它会被隐藏,并且该排中的球会显示并移动。当它回到第一排时,它被隐藏起来,第一排的球又开始上下移动。我的问题是让球在内部交叉点上显示/隐藏,即第二行第二列,第二行第三列等。 有什么建议么。关于如何做到这一点。 我正在使用加速度计 motion.gravity 来垂直和水平移动球图像。

这是我用来移动球的一些代码

if (ball.hidden == NO) 
                self.ball.center = CGPointMake(self.ball.center.x + n, 9);
            
            //ROW ONE START
            if (ball.center.x < 9) 
                ball.center = CGPointMake(9, 9);
            
            if (ball.center.x > 311) 
                ball.center = CGPointMake(311, 9);
            

            if(self.ball.center.x > 9)

                self.balla.hidden = YES;
                balla.center = CGPointMake(9, 9);
            

            if (ball.center.x ==9) 


            //balla
            CGPoint a = CGPointMake(9, 9);
            if (CGPointEqualToPoint(ball.center,a)) 
                                balla.hidden = NO;
                self.balla.center = CGPointMake(9, (self.balla.center.y)- y);
                if (balla.center.y > 9) 
                    ball.center = CGPointMake(9,9);
                    ball.hidden = YES;
                    balla.hidden = NO;
                    self.balla.center = CGPointMake(9 , (self.balla.center.y)- y);
                
                if (balla.center.y < 9) 
                    balla.center = CGPointMake(9,9);
                    ball.hidden = NO;
                
                if (balla.center.y > 559) 
                    balla.center = CGPointMake(9, 559);
                

            

这是第一行第一列(这里还有其他列)

我也做了额外的行

我已经用这段代码将最后一列移到了第七行和第八行。

CGPoint e = CGPointMake(311, 9);
            if (CGPointEqualToPoint(ball.center,e)) 

                ball5a.hidden = YES;
                self.ball5a.center = CGPointMake(311, (self.ball5a.center.y)- y);
                if(self.ball.center.x < 311)
                    self.ball5a.hidden = YES;
                
                if (ball5a.center.y < 9) 
                    ball5a.center = CGPointMake(311,9);
                    ball.hidden = NO;
                    ball5a.hidden = YES;
                
                if (ball5a.center.y > 9) 
                    ball.center = CGPointMake(311,9);
                    ball5a.hidden = NO;
                    ball.hidden = YES;
                    self.ball5a.center = CGPointMake(311, (self.ball5a.center.y)- y);
                
                if (self.ball5a.center.y> 480 && self.ball5a.center.y< 482) 
                    ball7.hidden = NO;
                    balla.center = CGPointMake(9, 481);
                    ball7.center = CGPointMake(311 , 481);
                    ball.center = CGPointMake(9, 9);

                
                if (ball5a.center.y > 559) 
                    ball5a.center = CGPointMake(311, 559);
                    ball8.center = CGPointMake(311, 559);
                    ball.center = CGPointMake(9, 9);
                
                if (ball5a.center.y <559) 
                    ball8.center =CGPointMake(9, 559);
                    ball.center = CGPointMake(311, 9);
                    ball8.hidden = YES;
                

我可以用这个让最后一行移到最后一列

//第八行开始

       CGPoint l = CGPointMake(9, 559);
        if (CGPointEqualToPoint(balla.center,l)) 

            balla.hidden = YES;
            balla.center = CGPointMake(9, 559);
            self.ball8.center = CGPointMake(self.ball8.center.x + n, 559);
            ball8.hidden = NO;
        
        if (ball8.center.x > 9) 
            self.ball8.center = CGPointMake(self.ball8.center.x + n, 559);
            balla.hidden = YES;
            balla.center = CGPointMake(9, 559);
        

        if (ball8.center.x < 10) 
            ball8.center = CGPointMake(9, 559);

            ball8.hidden = YES;
            balla.hidden = NO;
        
        if (ball8.center.x > 311) 
            ball8.center = CGPointMake(311, 559);
            ball5a.center = CGPointMake(311, 559);
            ball5a.hidden = YES;
            ball.center = CGPointMake(311, 9);
            ball8.hidden = NO;
        
        if (ball8.center.x < 311) 
            ball5a.center = CGPointMake(311, 9);
            ball5a.hidden = YES;
        

    

但是,当我尝试将第 7 行移动到第 5 列时,我可以将其转移,但第 5 列中的球总是以坐标 (311,9) 而不是我在多个位置指定的坐标 (311,481) 结束。

//第七行开始

       CGPoint k = CGPointMake(9, 481);
        if (CGPointEqualToPoint(balla.center,k)) 
            ball5a.center = CGPointMake(311, 481);
            balla.hidden = YES;
            balla.center = CGPointMake(9, 481);
            self.ball7.center = CGPointMake(self.ball7.center.x + n, 481);
            ball7.hidden = NO;
        
        if (ball7.center.x > 9) 
            self.ball7.center = CGPointMake(self.ball7.center.x + n, 481);
            balla.hidden = YES;
            balla.center = CGPointMake(9, 481);
        

        if (ball7.center.x < 10) 
            ball7.center = CGPointMake(9, 481);
             ball5a.center = CGPointMake(311, 481);
            ball7.hidden = YES;
            balla.hidden = NO;
        
        if (ball7.center.x > 310) 
            ball.center = CGPointMake(311, 9);
            ball5a.center = CGPointMake(311, 481);
            ball7.center = CGPointMake(311, 481);

            ball5a.hidden = YES;
            balla.center = CGPointMake(9, 481);
            ball7.hidden =  NO;

        
        if (ball7.center.x < 310) 
            ball5a.center = CGPointMake(311, 481);
            ball5a.hidden = YES;
        

任何想法为什么这不能正常工作?

【问题讨论】:

您不能简单地在网格中移动单个球实例吗?或者这就是你正在努力解决的问题?你如何代表你的网格? 如上所述,我有 5 列上下移动,每列都有一个 UIImageView(球)。巴拉,ball2a,ball3a,ball4a和ball5a。我还为八行中的每一行提供了一个 UIImageView (球)。球,球1,球2等 你在使用数组吗?您当前的代码是什么?如果你的球在一个数组中(或者可能是一个双数组),你可以简单地通过在数组中移动它来移动球,即。 array[i][j] = array[a][b],将球从 (a,b) 移动到 (i,j),然后像您似乎已经在做的那样根据数组进行绘制。 我编辑了我的帖子以显示我在做什么。我不确定如何编写或使用双数组。你能给我一个例子,我也会做一些研究。谢谢 【参考方案1】:

您可以使用双数组或矩阵(此处相同,只是另一个名称),其中条目可以为空或您的球。 绘制时,您将遍历数组并查看每个条目,如果条目为空;你什么也没画。如果条目不为空,即它是某物,即您的球,则将其绘制在条目表示的位置。

我们可以使用双精度数组来描述具有列和行的坐标系或网格。 考虑一个条目 (i,j) 是网格中的第 i 列和第 j 行。因此,如果球在入口 (2,4) 中,则表示球当前在第 2 列第 4 行,如果我们想将球移动到另一列或另一行,我们只需将入口 (2,4) 设置为为 null 并设置所需的条目,例如 (2,5) 为我们的球。 还有一件事,我们可以简单地让数组中的 null = 0 和 ball = 1,因为可以以某种方式将 ball 作为全局变量保存。

int matrix[20][20];

上面的行将创建一个大小为 20 列和 20 行的 int 类型的矩阵/双数组。 请注意,最好遍历每个条目并将它们设置为某个初始值,在我们的例子中为 0,我不会在这里展示。把它当作一个练习;) 现在我们可以将球定位在某处:

matrix[2][4] = 1;

现在我们的球在第 2 列第 4 行。 如果我们想将它移动到第 10 列和第 15 行:

matrix[2][4] = 0; // Remember to remove the ball from its last position
matrix[10][15] = 1;

当您想绘制球时,您可以遍历矩阵/数组并查看每个条目,并且仅当条目包含数字 1 时才绘制球。

即使在您发布代码之后,我仍然对您的确切问题/问题感到有些困惑,但我希望这有意义并有所帮助!

【讨论】:

我还没有尝试过这个,因为我认为这会将球从一个点瞬间移动到另一个点,而我正在尝试为从一个点到另一个点的移动设置动画。把我的网格想象成街道,把球想象成汽车。汽车沿着街道行驶并转弯。这就是我想要做的,我已经完成了。感谢您提供的信息,我知道它适合它的用途,我很可能有一天会使用它。

以上是关于在网格 xcode 中移动球的主要内容,如果未能解决你的问题,请参考以下文章

Unity中基于网格/平铺移动+碰撞?

如何在网格中移动图像的相对位置?

ExtJs双击网格行应该将项目移动到另一个网格

GridStack 如何禁用移动或拖动网格小部件

html 在鼠标移动中改变网格透视的3d效果

引导列排序网格移动桌面