代码之家  ›  专栏  ›  技术社区  ›  Allisone

在iOS中扩展动画线条的应用程序…howto

  •  1
  • Allisone  · 技术社区  · 14 年前

    基本思想
    这很简单。你可以说。。。一条蛇形的线是由一条3px线实现的,它在屏幕上扩展,收集和交互不同的东西,可以通过用户输入来控制。就像你用笔画的一条连续的线。

    正如我现在所了解的,我需要将呈现代码放入UIView的drawRect中。 然后我需要设置一个计时器(在这里和那里找到一些答案/帖子,但没有具体的东西),它每秒触发x次并调用UIView上的setNeedsDisplay。

    问题:
    如何实现: 我希望您能提供一些示例代码或一些细节,我应该使用哪些类以及如何使用它们/进行哪些调用的策略。



    Daniel Bleisteiner )
    所以我现在转向了OpenGL,我正在研究它,阅读示例,jefflamarche的OpenGL博客,等等。。 我想我可以划清界限了。我想我会为曲线、直线/方向变化等创建类,然后在用户输入时,我会创建相关对象(取决于steer输入)将它们存储在一个数组中,然后通过读取每个帧上存储在数组中的对象的对象属性来重新创建和重绘整条线。我想画一条简单的线(从iPhone开发开始的代码)

    glDisable(GL_TEXTURE_2D);
    GLfloat vertices[4];    
    // Convert coordinates
    vertices[0] = start.x;
    vertices[1] = start.y;
    vertices[2] = end.x;
    vertices[3] = end.y;
    glLineWidth(3.0);
    glVertexPointer (2, GL_FLOAT , 0, vertices);
    glDrawArrays (GL_LINES, 0, 2);
    

    也许我会找到一种方法来消除它,但是

    1. 现在我更好奇的是,我的想法是否足够好,或者是否有更好的策略
    2. 也许有人能告诉我如何分离抬头显示器的代码,线条画本身和一些菜单,我将不得不在开始时显示f.e。。。所以很容易从一个“视图”过渡到另一个(比如渐变)?一些提示?

    也许你也读过一本书,它会解释如何解决这类问题? 或者你可以给我指出另一个很好的答案/示例代码,因为我在寻找“动画绘制”示例时遇到了很大的问题。

    this 让我更进一步,但对我来说还是有点模糊。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Daniel Bleisteiner    14 年前

    不要尝试合并不同的视图。。。setNeedsDisplay有一个rect参数,它告诉核心图形部分只有屏幕的某一部分需要再次渲染。在drawRect方法中尊重这个参数,对于标准的2D游戏和工具来说应该足够了。

        2
  •  0
  •   dontWatchMyProfile    13 年前

    使用OpenGL ES。然后您要做的是创建一个run循环函数或方法,该函数或方法由 CADisplayLink 每秒30到60次。60是最大值。

    @property (nonatomic, assign) CADisplayLink *displayLink;
    

    2) 创建并安排CADisplayLink:

    - (void)startRunloop {
        if (!animating) {
            CADisplayLink *dl = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];
            [dl setFrameInterval:1];
            [dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            self.displayLink = dl;
    
            animating = YES;
        }
    }
    

    这里需要注意的是: -setFrameInterval:1 告诉CADisplayLink不要跳过任何帧。这意味着:你得到最大的fps。但是:如果您的代码需要超过1/60秒,这可能是不好的。在这种情况下,最好设置为2,例如。使动画更流畅。

    3) 在-drawFrame方法中,像往常一样绘制OpenGL ES。唯一的区别是,该代码每秒被调用多次。只需跟踪时间,并在代码中确定要绘制的内容以及绘制方式。如果要以1秒的动画持续时间设置从左下角到右上角移动的矩形的动画,只需通过应用一个需要时间的函数在开始和结束之间插入动画帧 t型 作为论据。有成千上万种方法可以做到这一点。这是其中之一。

    4) 当您完成或想要停止OpenGL ES绘图时,只需使您的CADisplayLink无效或暂停即可。像这样:

    - (void)stopRunloop {
        if (animating) {
            [self.displayLink invalidate];
            self.displayLink = nil;
            animating = NO;
        }
    }