动画| 类似Windows的气泡屏保效果

本文详解一款类似Windows的气泡碰撞效果的屏保动画。

效果

效果

实现步骤解析

  • 1、在一个for循环中随机创建3个圆的中心点,需要保证的是 这三个中心点不能彼此有重叠部分,而且必须在屏幕内部。

          //不重叠
          BOOL containsPoint = NO;
          for (int j = 0; j < ballArray.count; j++) {
              
              UIButton *btnn = ballArray[j];
              
              if (CGRectIntersectsRect(btnn.frame,CGRectMake(cx  , cy  , BALL_WIDTH, BALL_WIDTH))) {
                  containsPoint = YES;
              }
          }
          
          //在屏幕范围内
          if (cx > BALL_WIDTH && cy > BALL_WIDTH  && cx < SCREEN_WIDTH_NEW - BALL_WIDTH  && cy < SCREEN_WIDTH_NEW - BALL_WIDTH && containsPoint == NO) {
              
              qualified = YES;
          }else{
              continue;
          }
    
  • 2、创建视图并把视图的中心点设置为满足条件而创建的此点。把这些视图保存在Aarray中

  • 3、并随机给小球创建一个方向(一个很小的 CGPointMake量值),并用Barray保存这些方向addObject:[NSValue valueWithCGPoint:CGPointMake(randomX, randomY)

     //随机生成3个移动方向
      double randomX = (double)arc4random() / ARC4RAND_MAX * 2.0f - 1.0f;
      double randomY = (double)arc4random() / ARC4RAND_MAX * 2.0f - 1.0f;
      NSLog(@"%f %f",randomX,randomY);
      
      [ballDirectionArray addObject:[NSValue valueWithCGPoint:CGPointMake(randomX, randomY)]];
    
  • 4、开启一个定时器,设置的时间间隔足够小 (本文例子中设置的为:0.004),并绑定相应的事件。

  • 5、在定时器的事件中遍历Aarray中视图,并取出此视图的方向,如果视图碰到屏幕四边需要把对应的 x/y上的方向换成相反方向(-x/-y)。把视图的中心点在方向的左右下移动。并更新保存视图的最新方向。

      for (int j = 0; j < ballArray.count; j++) {
          UIButton *btn = ballArray[j];
          NSValue *val = [ballDirectionArray objectAtIndex:j];
          CGPoint p = [val CGPointValue];
          
          //移动方向
          __block  float vx = p.x;
          __block float vy = p.y;
          
          //掉头
          if (btn.right > SCREEN_WIDTH_NEW  || btn.left < 0) {
              vx = -vx;
              CGPoint p = [val CGPointValue];
              p.x = vx;
              [ballDirectionArray setObject:[NSValue valueWithCGPoint:p] atIndexedSubscript:j];
          }
          if (btn.bottom > SCREEN_HEIGHT_NEW || btn.top <0) {
              vy = -vy;
              CGPoint p = [val CGPointValue];
              p.y = vy;
              [ballDirectionArray setObject:[NSValue valueWithCGPoint:p] atIndexedSubscript:j];
          }
          
          //设置移动方向
          btn.centerX += vx;
          btn.centerY += vy;
    
  • 6、在定时器的事件中也要处理两球碰撞时的方向变化,并更新保存碰撞两球的的最新方向。

       //两球中心点之间的距离
        float distance = sqrt(pow((btn.centerX - otherbtn.centerX), 2) + pow((btn.centerY - otherbtn.centerY), 2));
        if(distance <= BALL_WIDTH){  //发生了碰撞
    
        }
    

备注

有时候我们在打印一些CG类型的变量是,无法打印,利用UIKIT中的API可以很方便的实现 字符串和CG变量之间的转换。

利用NSValue也可以封装很多CG变量,并保存到数组中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容