登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

【BMPinTu】一款拼图App的demo。多边形凹凸拼图

[复制链接]
来自: birdmichael126 分类: iOS精品源码 上传时间: 2019-2-15 17:20:37
Tag:

项目介绍:

GitHub地址:https://github.com/birdmichael/BMPinTu

项目特点

一款市面少见的拼图demo,很常见的是类似华容道一样的拼图,而不是类似贴图的拼图。

  • 类似”魔法拼图“一样的拼图demo。

  • 支持提示原图

  • 支持自定义模块数量

  • 注释即文档

代码说明

代码主逻辑步骤:

  1. 初始化数据。

  2. 创建切片类型,坐标,旋转属性

  3. 创建贝塞尔曲线

  4. 创建裁剪后的图片

  5. 创建其他视图(顶部标题,求救按钮)

- (void)viewDidLoad {
    [super viewDidLoad];
    [self initializeDataSet];
    [self setupPieceTypePieceCoordinateAndRotationValuesArrays];
    [self setUpPieceBezierPaths];
    [self setUpPuzzlePieceImages];
    [self setupOthersView];
}

切片类型:

typedef NS_ENUM(NSInteger, PieceType) {
    PieceTypeInside = -1,  // 凸
    PieceTypeEmpty, // 空(即边缘平整类型)
    PieceTypeOutside, // 凹
};

首先把一张原始图片切割为若干小图片,存放在pieceTypeArray数组,一张小图片有四个边,使用字典存储。

边类型:

typedef NS_ENUM(NSInteger, PieceSideType) {
    PieceSideTypeLeft = 0, // 左0
    PieceSideTypeTop,  // 上1
    PieceSideTypeRight, // 右2
    PieceSideTypeBottom, // 下3
    PieceSideTypeCount // 占位索引
};

创建小切片

1.双重for循环创建等大小切片

for(int i = 0; i < self.pieceVCount; i++) {
  for(int j = 0; j < self.pieceHCount; j++) {
  
  }
}

2.先定义中间切片边缘情况,上,右随机设置,下,左根据上一个为凸则为凹。

            if(j != 0) {
                mSideL = ([[[self.pieceTypeArray objectAtIndex:mCounter-1] objectForKey:@(PieceSideTypeRight)] intValue] == PieceTypeOutside)?PieceTypeInside:PieceTypeOutside;
            }
            if(i != 0){
                mSideB = ([[[self.pieceTypeArray objectAtIndex:mCounter-self.pieceHCount] objectForKey:@(PieceSideTypeTop)] intValue] == PieceTypeOutside)?PieceTypeInside:PieceTypeOutside;
            }
            // 随机凹凸
            mSideT = ((arc4random() % 2) == 1)?PieceTypeOutside:PieceTypeInside;
            mSideR = ((arc4random() % 2) == 1)?PieceTypeOutside:PieceTypeInside;

3.定义边缘为直线。

            if(i == 0) {
                mSideB = PieceTypeEmpty;
            }
            if(j == 0) {
                mSideL = PieceTypeEmpty;
            }
            if(i == self.pieceVCount-1) {
                mSideT = PieceTypeEmpty;
            }
            if(j == self.pieceHCount - 1) {
                mSideR = PieceTypeEmpty;
            }

4.根据类型是凹还是凸,进行尺寸修正。凸的会多一个deepnessVdeepnessH

            if(mSideL == PieceTypeOutside) {
                mCubeWidth -= self.deepnessV;
            }
            if(mSideR == PieceTypeOutside) {
                mCubeWidth -= self.deepnessV;
            }
            if(mSideT == PieceTypeOutside) {
                mCubeHeight -= self.deepnessH;
            }
            if(mSideB == PieceTypeOutside) {
                mCubeHeight -= self.deepnessH;
            }

5.填装切块类型数组

            NSMutableDictionary *mOnePieceDic = [@{} mutableCopy];

            [mOnePieceDic setObject:[NSNumber numberWithInteger:mSideL] forKey:@(PieceSideTypeLeft)];
            [mOnePieceDic setObject:[NSNumber numberWithInteger:mSideB] forKey:@(PieceSideTypeBottom)];
            [mOnePieceDic setObject:[NSNumber numberWithInteger:mSideT] forKey:@(PieceSideTypeTop)];
            [mOnePieceDic setObject:[NSNumber numberWithInteger:mSideR] forKey:@(PieceSideTypeRight)];
            
            [self.pieceTypeArray addObject:mOnePieceDic];

6.填装尺寸及方向(默认一个方向)数组,并使索引计数器自增。

TODO:

  1. 支持旋转,并在验证添加旋转是否相等验证。

  2. 手势停止后悬停在网格中,而非任意位置。

  3. 使用UIScrollView装载模块,并切换父视图。

相关源码推荐:

我来说两句
*滑动验证:
所有评论(5)
逆鳞九霄 2019-2-18 09:58:11
虽不明,但觉厉!
回复
一人无 2019-2-18 10:04:04
code4app好的代码demo真的很多,谢谢啦~
回复
这是个逗比 2019-2-18 10:04:10
内容很好,棒棒哒
回复
乱世佳人520 2019-2-18 10:05:16
感谢大神~
回复
Ek645 2019-2-18 10:05:26
不错不错,楼主辛苦了。。。
回复
莫应有道 2019-2-18 10:05:38
不错不错,楼主辛苦了。。。
回复
inta加加 2019-2-18 10:05:54
支持,感谢,祝code4app越来越好~
回复
jtd123 2019-2-19 17:43:28
正需要啊,感谢楼主无私分享!
回复
code4app热心网友 2019-2-20 11:32:19
很给力,Code4App有你更精彩!
回复
提取码:  下载次数:24 状态:已购或VIP 售价:0(原价:15)金钱 下载权限:初级码农 
730 0 24
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表