<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>tengusa64のブログ</title>
<link>https://ameblo.jp/oldamebaman/</link>
<atom:link href="https://rssblog.ameba.jp/oldamebaman/rss20.xml" rel="self" type="application/rss+xml" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<description>ブログの説明を入力します。</description>
<language>ja</language>
<item>
<title>易しくて優しい「２・４」番目のアプリ!（番外編）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><font size="2"><br>「２・４」番目の ほぼ究極の Jigsaw Game はどうでしたか。ブログの更新をサボっていましたが、間に合わせに、ほんの１０分間で作れる簡単なアプリを作ってみました。（番外編）<br>むかし、青年だった年配の人には懐かしいゲームです。<br><br><a href="http://stat.ameba.jp/user_images/20130129/14/oldamebaman/8b/5a/p/o0329039912396850306.png"><img src="https://stat.ameba.jp/user_images/20130129/14/oldamebaman/8b/5a/p/t02200267_0329039912396850306.png" alt="$tengusa64のブログ-arg15a" border="0"></a><br><br><br><br>やりかたは、 black cell に接している cell だけをうごかして、バラバラになった各数字を１～１５まで並べ直すというゲームです。<br>「１５並べとかいっていましたかね？」<br><br><a href="http://stat.ameba.jp/user_images/20130129/14/oldamebaman/ad/6c/p/o0348045512396850805.png"><img src="https://stat.ameba.jp/user_images/20130129/14/oldamebaman/ad/6c/p/t02200288_0348045512396850805.png" alt="$tengusa64のブログ-arg15b" border="0"></a><br><br><br><br>コードをのせときます。<br><br><pre><br>#import "ViewController.h"<br>#import &amp;ltQuartzCore/QuartzCore.h&gt;<br><br>@interface ViewController ()<br>{<br>    NSMutableArray *posAry;<br>    NSMutableArray *stateAry;<br>    NSInteger tate,yoko,anum;<br>    UIView *myView;<br>}<br><br>@end<br><br>@implementation ViewController<br><br>- (void)viewDidLoad<br>{<br>    [super viewDidLoad];<br>// Do any additional setup after loading the view, typically from a nib.<br>    <br>    myView=[[UIView alloc]initWithFrame:CGRectMake(10, 100, 300, 300)];<br>    <br>    [self.view addSubview:myView];<br>    <br>    UIButton *rstbtn = [UIButton buttonWithType:UIButtonTypeCustom];<br>    rstbtn.layer.cornerRadius = 10.0f;<br>    rstbtn.frame = CGRectMake(230,30,70,30);<br>    [rstbtn addTarget:self action:@selector(reset) forControlEvents:UIControlEventTouchDown];<br>    [rstbtn setTitle:@"reset" forState:UIControlStateNormal];<br>    [rstbtn setTitleColor:[ UIColor blueColor] forState:UIControlStateNormal];<br>    rstbtn.backgroundColor = [UIColor yellowColor];<br>    [self.view addSubview:rstbtn];<br>    <br>    self.view.userInteractionEnabled = YES;<br>    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView:)];<br>    [myView addGestureRecognizer:tap];<br>    <br>    [self createTile];<br>    [self reset];<br>}<br>-(void)createTile<br>{<br>   <br>    posAry=[NSMutableArray array];<br>    stateAry=[NSMutableArray array];<br>    <br>    for (int v = 0; v &lt; 4; v++) {<br>        for (int h = 0; h &lt; 4; h++) {<br><br>            CGPoint pos = CGPointMake((37+75*h),<br>                                        (37+75*v));<br>            NSValue *val = [NSValue valueWithCGPoint:pos];<br>            [posAry addObject:val];<br>            [stateAry addObject:[NSString stringWithFormat:@"%d",h+4*v]];<br>            }<br>    }<br>    anum=0;<br>    for (int i=0; i&lt;16; i++) {<br>        CALayer *atile = [CALayer layer];// initWithFrame:CGRectMake(0, 0, 75, 75)];<br>        atile.frame=CGRectMake(0, 0, 75, 75);<br>        UILabel *tile=[[UILabel alloc]init];<br>        tile.frame=CGRectMake(0, 0, 75, 75);<br>        tile.backgroundColor = [UIColor cyanColor];<br>        tile.layer.borderWidth = 2.0;<br>        NSValue *value = [posAry objectAtIndex:i];<br>        CGPoint cp = [value CGPointValue];<br>        tile.text=[NSString stringWithFormat:@"%d",i];<br>        tile.textAlignment = 1;<br>        tile.font = [UIFont boldSystemFontOfSize:24];<br>        tile.center = cp;<br>        tile.tag=i+1;<br>        <br>        if (i==0) {<br>            tile.backgroundColor = [UIColor blackColor];<br>            tile.text=@"x";<br>            <br>        }<br>        atile.contents=tile;<br>        atile.position=cp;<br>        [myView addSubview:tile];<br>    }<br>    <br>}<br>- (void)tapView:(UITapGestureRecognizer*)gesture {<br>    <br>    <br>    CGPoint pos = [gesture locationInView:myView];<br>    NSInteger tilex=(pos.x)/75;<br>    NSInteger tiley=(pos.y)/75;<br>    NSInteger index=tiley*4+tilex;<br>    <br>    NSInteger atile=[[stateAry objectAtIndex:index]intValue];<br>    <br>    tate=anum%4;<br>    yoko=anum/4;<br>    NSValue *value = [posAry objectAtIndex:anum];<br>    CGPoint nilcp = [value CGPointValue];<br>    <br>    NSValue *exvalue = [posAry objectAtIndex:index];<br>    CGPoint excp = [exvalue CGPointValue];<br>    <br>    <br>    if (tate==index%4 || yoko==index/4) {<br>        if (abs(index-anum)==1|| abs(index-anum)==4) {<br>            UILabel *alabel=(UILabel* )[self.view viewWithTag: atile+1 ];<br>            alabel.center=nilcp;<br>            <br>            UILabel *nillabel=(UILabel* )[self.view viewWithTag: 1 ];<br>            nillabel.center=excp;<br>            <br>            [stateAry exchangeObjectAtIndex:index withObjectAtIndex:anum];<br>            anum=index;<br>            <br>        }<br>        <br>    }<br>    <br>}<br>- (void)reset{<br>    <br>    //シャッフル<br>    int i;<br>    stateAry=[NSMutableArray array];<br>    for (i=0; i&lt;16; i++) {<br>        [stateAry addObject:[NSNumber numberWithInt:i]];<br>    }<br>    for (i=0; i&lt;16*3; i++) {<br>        int index=random() % 16;<br>        id obj=[stateAry objectAtIndex:index];<br>        [stateAry removeObjectAtIndex:index];<br>        [stateAry addObject:obj];<br>        <br>    }<br>    for (i=0; i&lt;16; i++) {<br>        NSInteger tile=[[stateAry objectAtIndex:i]intValue];<br>        <br>        <br>        NSValue *value = [posAry objectAtIndex:i];<br>        CGPoint cp = [value CGPointValue];<br>        <br>        UILabel *alabel=(UILabel* )[self.view viewWithTag: tile+1 ];<br>        if (tile==0) {<br>            anum=i;<br>        }<br>        alabel.center=cp;<br>    }<br>    <br>    <br>}<br><br>- (void)didReceiveMemoryWarning<br>{<br>    [super didReceiveMemoryWarning];<br>    // Dispose of any resources that can be recreated.<br>}<br>@end<br><br></pre><br>暇なときの時間つぶしに。<br></font>
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11490740874.html</link>
<pubDate>Fri, 15 Mar 2013 09:14:30 +0900</pubDate>
</item>
<item>
<title>易しくて優しい「２・４」番目のアプリ！ほぼ究極のJigsaw（番外編）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><br><br><br>「２・４」番目のアプリは、完結編も出したし、自分のミスの訂正編も出したし、もうやることはないかなと思っていましたが、ちょっと面白いブログをみたので番外編を出します。<br><br>せっかく苦労してパスルを完成したのになんのご褒美もないのでは少しもの足りないですよね。<br>そこで完成したらご褒美をあげることにします。<br><br>まず、完成したかどうかの判定。<br><br>Game view の panAction メソッド。<br><br>if (sender.state == UIGestureRecognizerStateEnded){　のif 文のなか　tile はあるか　の下に次のコードを追加します。<br><br> //tile があるかに　(!(_isVib))　を追加<br>        CGPoint apos=CGPointMake(160, 80);<br>        _tile=[self.view.layer hitTest:apos];<br>        BOOL bl = [_tile.name hasPrefix:@"tile"];<br>        if (!(bl)&amp;&amp;(_upval&lt;[_itemAry count]-1)&amp;&amp;(!(_isVib))) {<br>            _upval=_upval+1;<br>            [self setTile];<br>        }<br><br>//ここから追加<br>        <br>        NSMutableArray *array=[NSMutableArray array];<br>        for (int i=0; i&lt;[_posAry count]; i++) {<br>            NSValue *value = [_posAry objectAtIndex:i];<br>            CGPoint cpos = [value CGPointValue];<br>            CGPoint apos=CGPointMake(cpos.x+10, cpos.y+160);<br>            CALayer *atile=[self.view.layer hitTest:apos];<br>            CGPoint tpos=atile.position;<br>            BOOL posBl;<br>            if (abs((int)(apos.x-tpos.x))&lt;5 &amp;&amp; abs((int)(apos.y-tpos.y))&lt;5 ) {<br>                posBl=YES;<br>            }else{<br>                posBl=NO;<br>            }<br>            NSNumber *tilespin=[_spinAry objectAtIndex:i];<br>            spin=[tilespin intValue];<br>            if (spin!=0||!(posBl)) {<br><br>                [array addObject:[NSNumber numberWithInt:i]];<br>                <br>            }<br>        }<br>        if ([array count]==0) {<br>           <font color="#FF1493"> [self alertShow];</font><br>            <br>        }<br><br><br><br>-(void)alertShow{<br>    <br>    UIAlertView *alert = [[UIAlertView alloc] init];<br>    alert.delegate = self;<br>    alert.title = @"おめでとう";<br>    alert.message = @"You are perfect!! ";<br>    [alert addButtonWithTitle:@"o k"];<br>    [alert show];<br>    <br>}<br><br>ここの文句はもっとうまく考えてくださいね。<br><br>それでは「Run」してみてください。<br>完成したとき alertview がでましたか。<br><br><br>「これなんじゃい」何のご褒美もないじゃん、と思いでしょうから、いまからご褒美をつくっていきます。<br><br>@property (strong, nonatomic) UIView *v1,*v2,*v3;<br><br>-(void)presentFlower{<br>    <br>    CGPoint flowerPoint = CGPointMake(self.view.center.x,self.view.center.y+50);<br>    <br>    UIView *fire1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 3, 9)];<br>    UIView *fire2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 3, 9)];<br>    UIView *fire3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 3, 9)];<br>    <br>    fire1.center = CGPointMake(100, 460);<br>    fire2.center = CGPointMake(160, 460);<br>    fire3.center = CGPointMake(220, 460);<br>    fire1.backgroundColor = [UIColor yellowColor];<br>    fire2.backgroundColor = [UIColor redColor];<br>    fire3.backgroundColor = [UIColor blueColor];<br>    [self.view addSubview:fire1];<br>    [self.view addSubview:fire2];<br>    [self.view addSubview:fire3];<br>    [UIView animateWithDuration:1.0 animations:^{<br>        fire1.center = CGPointMake(flowerPoint.x-30, flowerPoint.y);<br>        fire2.center = CGPointMake(flowerPoint.x, flowerPoint.y);<br>        fire3.center = CGPointMake(flowerPoint.x+30, flowerPoint.y);<br>        <br>    } completion:^(BOOL finished) {<br>        [fire1 removeFromSuperview];<br>        [fire2 removeFromSuperview];<br>        [fire3 removeFromSuperview];<br>        <br>        [self fire:flowerPoint];<br>    }];<br>}<br><br>//　花　のメイン処理<br>- (void)fire:(CGPoint)center<br>{<br>    UIView *flowerv1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 90, 90)];<br>    UIView *flowerv2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 90, 90)];<br>    UIView *flowerv3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 90, 90)];<br>    flowerv1.center = CGPointMake(center.x-10,center.y);<br>    flowerv2.center = CGPointMake(center.x,center.y);<br>    flowerv3.center = CGPointMake(center.x+10,center.y);<br>    _v1=flowerv1;<br>    _v2=flowerv2;<br>    _v3=flowerv3;<br>    [self.view addSubview:flowerv1];<br>    [self.view addSubview:flowerv2];<br>    [self.view addSubview:flowerv3];<br>    <br>    for (int i=0; i&lt;13; i++) {<br>        //　花　の　を時間差で表示<br>        float time = 0.2 * i * NSEC_PER_SEC;<br>        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, time), dispatch_get_main_queue(), ^{<br>            CGPoint o1 = [flowerv1 convertPoint:center fromView:self.view];<br>            CGPoint o2 = [flowerv2 convertPoint:center fromView:self.view];<br>            CGPoint o3 = [flowerv3 convertPoint:center fromView:self.view];<br>            [self circleInView:flowerv1 center:o1 r:i * 10];<br>            [self circleInView:flowerv2 center:o2 r:i * 10];<br>            [self circleInView:flowerv3 center:o3 r:i * 10];<br>        });<br>    }<br>    <br>    // 花　終了後に実行<br>    float time = 3.5 * NSEC_PER_SEC;<br>    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, time), dispatch_get_main_queue(), ^{<br>        //花　のViewを全部消す<br>        [flowerv1 removeFromSuperview];<br>        [flowerv2 removeFromSuperview];<br>        [flowerv3 removeFromSuperview];<br>    });<br>}<br><br><br>- (void)circleInView:(UIView*)v center:(CGPoint)center r:(float)r<br>{<br>    // 花　の輪を作る<br>    for (int i=0; i&lt; 6 * M_PI; i++) {<br>        UIView *piece1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 4, 4)];<br>        UIView *piece2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 4, 4)];<br>        UIView *piece3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 4, 4)];<br>        float x = center.x + r * sinf(i * M_PI / 6);<br>        float y = center.y + r * cosf(i * M_PI / 6);<br>        piece1.center = CGPointMake(x-30, y);<br>        piece2.center = CGPointMake(x, y);<br>        piece3.center = CGPointMake(x+30, y);<br>        piece1.backgroundColor = [UIColor yellowColor];<br>        piece2.backgroundColor = [UIColor redColor];<br>        piece3.backgroundColor = [UIColor blueColor];<br>        [_v1 addSubview:piece1];<br>        [_v2 addSubview:piece2];<br>        [_v3 addSubview:piece3];<br>        [UIView animateWithDuration:0.2 animations:^{<br>            piece1.alpha = 0;<br>            piece2.alpha = 0;<br>            piece3.alpha = 0;<br>        }];<br>    }<br>}<br><br><br><br>これを表示するようにしましょう。<br>花　がでないうちに alertview がでても困りますので alertView には少し待ってもらいます。<br><br>[self presentFlower];<br>            <br>[self performSelector:@selector(alertShow) withObject:nil afterDelay:4.0];<br><br>うまく花　があがりましたか。（花　＝花火でした）<br><br>デモ、alertview が気になりますね。<br>alertview も作り替えましょうか。<br><br>@property (strong, nonatomic) UIView *mesview;<br><br>-(void)alertShow{<br>    <br>    UIView *mesview = [[UIView alloc] initWithFrame:CGRectMake(30, 200, 260, 200)];<br>    mesview.backgroundColor=[UIColor grayColor];<br>    mesview.alpha=0.5;<br>    _mesview=mesview;<br>    [self.view addSubview:mesview];<br>    <br>    UIButton *okbtn = [UIButton buttonWithType:UIButtonTypeCustom];<br>    okbtn.layer.cornerRadius = 10.0f;<br>    okbtn.frame = CGRectMake(130,350,60,25);<br>    [okbtn addTarget:self action:@selector(okbtn:) forControlEvents:UIControlEventTouchDown];<br>    [okbtn setTitle:@"o k" forState:UIControlStateNormal];<br>    [okbtn setTitleColor:[ UIColor blueColor] forState:UIControlStateNormal];<br>    okbtn.backgroundColor = [UIColor yellowColor];<br>    [self.view addSubview:okbtn];<br>    _btn=okbtn;<br>    <br>    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(45,250,240,50)];<br>    label.text=@"Congratulations your perfect!!";<br>    label.backgroundColor=[UIColor clearColor];<br>    label.textColor=[UIColor yellowColor];<br>    [self.view addSubview:label];<br>    _label=label;<br>    <br>        <br>    /*<br>    <br>    UIAlertView *alert = [[UIAlertView alloc] init];<br>    alert.delegate = self;<br>    alert.title = @"おめでとう";<br>    alert.message = @"You are perfect!! \n ";<br>    [alert addButtonWithTitle:@"o k"];<br>    [alert show];<br>    */<br>}<br>-(void)okbtn:(id)sender{<br>    _tapOff=YES;<br>    [_label removeFromSuperview];<br>    [_btn removeFromSuperview];<br>    [_mesview removeFromSuperview];<br>    _toolbar.hidden=NO;<br>}<br><br><br>それでは　実機用に sound をだすようにしましょう。(実機では線がみにくいので線の width＝２)<br>＊simulator では sound がでない。<br><br>AudioToolbox.framework を QuartzCore.framework を組み込んだ要領で追加してください。<br><br><br>GameViewController.h<br><br>#import &lt;UIKit/UIKit.h&gt;<br>#import &lt;QuartzCore/QuartzCore.h&gt;<br>#import &lt;AudioToolbox/AudioServices.h&gt;<br><br><br><br>AudioServicesPlaySystemSound(1327);<br>            [self presentFlower];<br>            <br>            [self performSelector:@selector(alertShow) withObject:nil afterDelay:4.0];<br><br><br>メヌエットを sound しながら花火があがります。<br><br>花火はあがりましたが、じつのところよくわからないところだらけです。<br><br>花火は下記のサイトにありました。感謝！<br><br>http://lepetit-prince.net/ios/?p=574<br><br>「Effect - タッチしたところに花火を上げる」<br>
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11447329159.html</link>
<pubDate>Sat, 12 Jan 2013 11:48:29 +0900</pubDate>
</item>
<item>
<title>易しくて優しい「２・４」番目のアプリ！ほぼ究極のJigsaw（訂正編）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><br><br>「２・４」番目のアプリの(1) 線を引くところ (2) undo button Action それに(3) indicator animation の終了時に<font color="#FF1493">誤りがありました</font>。初歩的なミスですみません。<br><br>(1) 線を引くところ<br><br>- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{<br>    <br>    UITouch *touch = [touches anyObject];<br>     _spos =[touch locationInView:_canvasX];<br><br>     //<font color="#FF1493">これを追加</font>　線はかならずcanvas の外から引く（たまには　右からまたは下から引く人もいるでしょうが）<br>  <br>    <font color="#FF1493">if ((_spos.x&gt;0)&amp;&amp;(_spos.y&gt;0)) {<br>        _isError=YES;<br>    }</font><br>   <br>    _tpos=_spos;<br><br>    _okbtn.hidden=NO;<br>    _udbtn.hidden=NO;<br>    <br>}<br><br><br>- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{<br>    <br>    <br>    [self posArySet];<br><br>/*    Game Viewの refer back button で帰ったとき touch event の alert がでる。これを止めることができないのでやむなく警告を表示しないようにする。<br>    if (_isError) {<br>        [self showAlert];<br>    }<br>*/    <br>    if (_spos.x&lt;=<font color="#FF1493">10</font>) {//<font color="#FF1493">ここ誤り</font>　canvas 座標を self.view 座標で計算している<br>正解は<br>if (_spos.x&lt;=0)<br><br><br><br>-(void)posArySet{<br>    <br>      //<font color="#FF1493">_isError=NO;誤り</font><br><br>    if (_isError) {<br>        return;<br>    }<br><br> (2) undo button Action<br><br>-(void)undobtn:(id)sender{<br>    <br>    [_canvasX setImage:nil];<br>    [_canvasY setImage:nil];<br>    <br>    //<font color="#FF1493">これを追加</font>　game view から帰ったとき　前の インスタンス を覚えている<br>   <font color="#FF1493"> _cvXimg=nil;<br>    _cvYimg=nil;<br>    _isError=NO;</font><br>}<br><br>(3) indicator animation の終了時<br><br>    [_indicator stopAnimating];<br>    [_indicator <font color="#FF1493">removeFromSuperview</font>];// ここ誤り Game view から帰ったとき _indicator がない　　<br>     _indicator.hidden=YES;<br><br>あとでやってみて、さしあたりこの三つの誤りに気がつきました。<br>じつはもっとあるでしょうね。<br>コメントいただけるとうれしいです。<br><br>訂正よろしくお願いします。<br>
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11444547055.html</link>
<pubDate>Tue, 08 Jan 2013 08:12:28 +0900</pubDate>
</item>
<item>
<title>易しくて優しい「２・４」番目のアプリ！ほぼ究極のJigsaw（その５完結編）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><br><font size="2"><br>「２・３」番目は Jigsaw もどきでしたが、今回は本格的な、ほぼ究極の Jigsaw Game の作成です。世界にふたつとない YOU だけのゲームをつくります。（その５）<br><br><br>（その４）は　説明不足の感は否めませんが、ぼくがやろうとしているところはわかっていただけたでしょうか。<br><br><a href="http://stat.ameba.jp/user_images/20130107/20/oldamebaman/97/24/p/o0342048712367277905.png"><img src="https://stat.ameba.jp/user_images/20130107/20/oldamebaman/97/24/p/t02200313_0342048712367277905.png" alt="$tengusa64のブログ-pos" border="0"></a><br><br>うまく jigsaw できましたか。ちゃんと動きましたか。<br><br>今回は、「２・３」をやられた方は軽く流してくださいね。ほぼ同じことをやります。<br><br>(1) tile は今回は長方形ですよね。したがって tile の回転によって tile 形状が変わってきます。また、(2) tile は free.position で view いっぱいに散らかっているかもしれません。<br><br>(1) の補正は簡単ですね。imageAry の回転された図形のサイズにそのままあわせます。<br><br>(2) で tile を特定するのにどうするかですが、tile を vibration させようと思います。<br><br>それでは Game View の実装をはじめていきます。<br><br>@property (strong, nonatomic) NSMutableArray *stateAry,*spinAry;//<font color="#FF1493">spinAry を追加</font><br><br>@property (assign, nonatomic) BOOL tapOff,isVib;// <font color="#FF1493">isVib を追加</font><br><br><br><font color="#FF1493">-(void)setupdata</font>{　に次のコードを追加<br><br>    _spinAry=[NSMutableArray array];<br>    for (i=0; i&lt;pieces; i++) {<br>        int rval=arc4random() % 4;<br>        [_spinAry addObject:[NSNumber numberWithInt:rval]];<br>   <br><br>arc4random() % 4 で０～３のrandom 数を生成<br><br><font color="#FF1493">-(void)setTile</font>{<br> <br>    CALayer *tile=[CALayer layer];<br>    NSInteger index=[[_stateAry objectAtIndex:_upval]intValue];<br>    tile=[_itemAry objectAtIndex:index];<br>   <br>   <br>      //<font color="#FF1493">ここから追加</font><br>     NSString *str=[tile.name substringFromIndex:7];//tileNO**<br>     int num=[str intValue];<br>    <br>     NSNumber *tilespin=[_spinAry objectAtIndex:num];<br>     int spin=[tilespin intValue];<br>    <br>    if (spin&gt;0) {<br>        CGImageRef imgRef = [[_imageAry objectAtIndex:num] CGImage];<br>        CGContextRef context;<br>        float width = CGImageGetWidth(imgRef);<br>        float height = CGImageGetHeight(imgRef);<br>       <br>        switch (spin) {<br>            case 1:<br>                UIGraphicsBeginImageContext(CGSizeMake(height,width));<br>                context = UIGraphicsGetCurrentContext();<br>                CGContextScaleCTM(context, 1.0, -1.0);<br>                CGContextRotateCTM(context, -M_PI/2.0);<br>                break;<br>            case 2:<br>                UIGraphicsBeginImageContext(CGSizeMake(width,height));<br>                context = UIGraphicsGetCurrentContext();<br>                CGContextTranslateCTM(context,width,0);<br>                CGContextScaleCTM(context, 1.0, -1.0);<br>                CGContextRotateCTM(context, -M_PI);<br>                break;<br>            case 3:<br>                UIGraphicsBeginImageContext(CGSizeMake(height,width));<br>                context = UIGraphicsGetCurrentContext();<br>                CGContextTranslateCTM(context,height,width);<br>                CGContextScaleCTM(context, -1.0, 1.0);<br>                CGContextRotateCTM(context, -M_PI/2.0);<br>                break;<br>               <br>            default:<br>                break;<br>        }<br>    <br>         CGContextDrawImage(context, CGRectMake(0, 0, width,height), imgRef);<br>        UIImage *ret = UIGraphicsGetImageFromCurrentImageContext();<br>        tile.contents=(id)ret.CGImage;<br>       <br>        UIGraphicsEndImageContext();<br>        tile.frame=CGRectMake(0, 0, ret.size.width, ret.size.height);//imageに tileを合わせる<br>    }<br>    //<font color="#FF1493">ここまでを追加</font><br>    tile.position=CGPointMake(160, 80);<br>   <br>    [self.view.layer addSublayer:tile];<br> <br>}<br><br><a href="http://stat.ameba.jp/user_images/20130107/20/oldamebaman/d9/e4/p/o0348046312367298032.png"><img src="https://stat.ameba.jp/user_images/20130107/20/oldamebaman/d9/e4/p/t02200293_0348046312367298032.png" alt="$tengusa64のブログ-rotate" border="0"></a><br><br>tap したときの action<br>tile を vibration させ tile を特定します。そして vibration しているときのみ tile を回転させることができるようにします。<br><br>すでに tile が vibration しているときは解除します。<br><br><font color="#FF1493">- (void)tapView:(UITapGestureRecognizer*)gesture</font> {<br> <br>    CGPoint pos = [gesture locationInView:self.view];<br>    if (_tapOff) {<br>        gesture.cancelsTouchesInView = NO;<br>        return;<br>    }<br>    if (_isVib) {<br>        [_thetile removeAnimationForKey:@"anime"];<br>        _isVib=NO;<br>        return;<br>    }<br>   <br>    if (pos.y&gt;=460) {<br>        _toolbar.hidden=NO;<br>        _tapOff=YES;<br>        return;<br>    }<br>    _thetile=[self.view.layer hitTest:pos];<br>    _tapOff=NO;<br>   <br>    BOOL bl = [_thetile.name hasPrefix:@"tile"];<br>    if (bl) {<br>        CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform"];<br>        animation.duration = 0.3;<br>        animation.toValue = [NSValue valueWithCATransform3D:<br>                     CATransform3DMakeScale(1.1, 1.1, 1.0)];<br>        animation.repeatCount = HUGE_VALF;//無限に繰り返す<br>        animation.autoreverses = YES;<br>        [_thetile addAnimation:animation forKey:@"anime"];<br>        _isVib=YES;<br>    }<br>}<br><br>vibration については　テン＊シー＊シーさんの（その２２１）やCore Animation プログラム言語（p39~) やらを参照してください。<br><br><font color="#FF1493">PanGesture の action</font><br><br>- (void)panAction : (UIPanGestureRecognizer *)sender {<br>     CGPoint spos,pos;   <br> _toolbar.hidden=YES;<br>     _tapOff=NO;<br>    <br>     //<font color="#FF1493"> if文を追加</font><br>    if (_isVib) {<br>        NSString *location;<br>        <br>        if (sender.state == UIGestureRecognizerStateBegan) {<br>            <br>            spos = [sender locationInView:self.view];<br>            pos = [sender translationInView:self.view];<br>            <br>            if (spos.x&gt;=160) {<br>                if (pos.y&gt;0) {<br>                    location=@"right";<br>                }else{<br>                    location=@"left";<br>                }<br>            }else{<br>                if (pos.y&gt;0) {<br>                    location=@"left";<br>                }else{<br>                    location=@"right";<br>                }<br>            }<br>            <br>            [self rotate:(NSString *)location];<br>             <br>        }<br>        return;<br>    }<br>    <br>    if (sender.state == UIGestureRecognizerStateBegan) {<br>        pos = [sender locationInView:self.view];<br>        _tile=[self.view.layer hitTest:pos];<br>        <br>    }<br>    BOOL bl = [_tile.name hasPrefix:@"tile"];<br>    if (bl) {<br>        [_tile removeFromSuperlayer];<br>        [self.view.layer addSublayer:_tile];//tileを前面に出す<br>    }else{<br>        return;<br>    }<br>    if (sender.state == UIGestureRecognizerStateChanged) {<br>        pos = [sender locationInView:self.view];<br>        _tile.position = pos;<br>    }<br>    if (sender.state == UIGestureRecognizerStateEnded){<br>        pos = [sender locationInView:self.view];<br>        <br>        NSString *str=[_tile.name substringFromIndex:7];//tileNO**<br>        int num=[str intValue];<br>        <br>        NSValue *value = [_posAry objectAtIndex:num];<br>        CGPoint cpos = [value CGPointValue];<br>        CGPoint cp=CGPointMake(cpos.x+10, cpos.y+160);<br>        <br>        if (abs((int)(cp.x-pos.x))&lt;5 &amp;&amp; abs((int)(cp.y-pos.y))&lt;5 ) {<br>            _tile.position=cp;<br>        }else{<br>            _tile.position=pos;<br>        }<br>       <br>        //tile があるかに　(!(_isVib))　を追加<br>        CGPoint apos=CGPointMake(160, 80);<br>        _tile=[self.view.layer hitTest:apos];<br>        BOOL bl = [_tile.name hasPrefix:@"tile"];<br>        if (!(bl)&amp;&amp;(_upval&lt;[_itemAry count]-1)&amp;&amp;(!(_isVib))) {<br>            _upval=_upval+1;<br>            [self setTile];<br>        }<br>        <br>    }<br><br>}<br><br>それでは、最後に 回転動作を追加します。<br><br><font color="#FF1493">-(void)rotate:(NSString*)location{</font><br>   <br>   <br>    NSString *str=[_thetile.name substringFromIndex:7];<br>   <br>    int num=[str intValue];<br>   <br>    UIImage *image=[_imageAry objectAtIndex:num];<br>   <br>    CGImageRef imgRef = image.CGImage;<br>    CGContextRef context;<br>    float width = CGImageGetWidth(imgRef);<br>    float height = CGImageGetHeight(imgRef);<br>   <br>   <br>    NSNumber *spin=[_spinAry objectAtIndex:num];<br>    int tilespin=[spin intValue];<br>   <br>    if ([location isEqualToString:@"right"]) {<br>        tilespin=tilespin+1;<br>       <br>    }else{<br>        tilespin=tilespin-1;<br>    }<br>    if (tilespin==4) {<br>        tilespin=0;<br>    }<br>    if (tilespin==-1) {<br>        tilespin=3;<br>    }<br>   <br>    [_spinAry replaceObjectAtIndex:num withObject:[NSNumber numberWithInt:tilespin]];<br>    UIImage *ret;<br>   <br>    CGPoint cp=_thetile.position;<br>   <br>    if (tilespin==0) {<br>        ret=[UIImage imageWithCGImage:imgRef];;<br>        _thetile.contents=(id)ret.CGImage;<br>    }else{<br>       <br>        switch (tilespin) {<br>            case 1:<br>                UIGraphicsBeginImageContext(CGSizeMake(height,width));<br>                context = UIGraphicsGetCurrentContext();<br>                CGContextScaleCTM(context, 1.0, -1.0);<br>                CGContextRotateCTM(context, -M_PI/2.0);<br>                break;<br>            case 2:<br>                UIGraphicsBeginImageContext(CGSizeMake(width,height));<br>                context = UIGraphicsGetCurrentContext();<br>                CGContextTranslateCTM(context,width,0);<br>                CGContextScaleCTM(context, 1.0, -1.0);<br>                CGContextRotateCTM(context, -M_PI);<br>                break;<br>            case 3:<br>                UIGraphicsBeginImageContext(CGSizeMake(height,width));<br>                context = UIGraphicsGetCurrentContext();<br>                CGContextTranslateCTM(context,height,width);<br>                CGContextScaleCTM(context, -1.0, 1.0);<br>                CGContextRotateCTM(context, -M_PI/2.0);<br>                break;<br>            default:<br>                break;<br>        }<br>       <br>        CGContextDrawImage(context, CGRectMake(0, 0, width,height), imgRef);<br>        ret = UIGraphicsGetImageFromCurrentImageContext();<br>       <br>        _thetile.contents=(id)ret.CGImage;<br>       <br>        UIGraphicsEndImageContext();<br>    }<br>   <br>    _thetile.frame=CGRectMake(0, 0, ret.size.width, ret.size.height);<br>    _thetile.position=cp;<br>  <br>}<br><br><br>これで「２・４」番目のアプリは完成です。<br><br><br><br>最後になりますが、うまく動かなかった場合、コメントいただけるとうれしいです。ひょっとしたらぼくが大事なものを書き忘れているかもしれないので。<br>あっ　それから　<font color="#FF1493">ペタをつけてくれた人、ありがとうございます</font>。初心者で、なにかよくわからなくて、お礼の返事も書かないままになっていますが。<br><br>では、ヅアイヂエン！</font>
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11444513767.html</link>
<pubDate>Tue, 08 Jan 2013 05:09:57 +0900</pubDate>
</item>
<item>
<title>易しくて優しい「２・４」番目のアプリ！ほぼ究極のJigsaw（その４）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><br><font size="2"><br>「２・３」番目は Jigsaw もどきでしたが、今回は本格的な、ほぼ究極の Jigsaw Game の作成です。世界にふたつとない YOU だけのゲームをつくります。（その４）<br><br>前回までに piece 画像の生成はできるようになりました。<br>今回は、piece Tile をつくっていきましょう。<br><br>@interfacePhotoViewController () に追加<br><br>@property (strong, nonatomic) NSMutableArray *posAry;//レイヤーのポジション<br>@property (strong, nonatomic) NSMutableArray *itemAry;//tileレイヤー<br>@property (strong, nonatomic) NSMutableArray *imageAry;//tile.image<br><br>-(void)okbtn:(id)sender{　の注釈をすべてはずしてください。<br><br> _itemAry=[NSMutableArray array];//tile<br>    _posAry=[NSMutableArray array];//position<br>    _imageAry=[NSMutableArray array];//image<br><br><br><br>if (i&gt;=xsp &amp;&amp; i&lt;=xep &amp;&amp; j&gt;=ysp &amp;&amp; j&lt;=yep) {<br>                    if (i&lt;xcsp) xcsp=i;<br>                    if (i&gt;xcep) xcep=i;<br>                   <br>                    if (j&lt;ycsp) ycsp=j;<br>                    if (j&gt;ycep) ycep=j;<br><br><br> //cropping data<br>        CGPoint sp = CGPointMake(xcsp,ycsp);<br>        _sp=sp;<br>        CGPoint ep=CGPointMake(xcep,ycep);<br>        _ep=ep;<br><br>ここで切り取る座標を求めています。<br><br><a href="http://stat.ameba.jp/user_images/20130105/05/oldamebaman/e7/7e/p/o0291029112363388044.png"><img src="https://stat.ameba.jp/user_images/20130105/05/oldamebaman/e7/7e/p/t02200220_0291029112363388044.png" alt="$tengusa64のブログ-csp" border="0"></a><br><br><br> for (k=0; k&lt;h*w; k++) {<br><br>これを cell の数だけ loop します。<br><br>それでは tile を作成しましょう。<br><br>//マスクの形に切り抜く<br>    CGImageRef masked = CGImageCreateWithMask([myImage CGImage], mask);<br>    //CGImageをUIImageに変換する<br>    UIImage *maskedImage = [UIImage imageWithCGImage:masked];<br>    <br>ここから追加    <br>    <br>    UIImage *newImage;<br>    CGRect croppingRect =CGRectMake(_sp.x,_sp.y, _ep.x-_sp.x, _ep.y-_sp.y);<br>    CGImageRef imageRef = CGImageCreateWithImageInRect(maskedImage.CGImage, croppingRect);<br>    newImage =[UIImage imageWithCGImage:imageRef];<br>    CGImageRelease(imageRef);<br>    <br>    CGImageRelease(mask);<br>    CGImageRelease(masked);<br>    UIGraphicsEndImageContext();<br><br>     CALayer *tile= [CALayer layer];    <br>    tile.contents = (id)newImage.CGImage;<br>    tile.position = CGPointMake(_sp.x+( _ep.x-_sp.x)/2, _sp.y+( _ep.y-_sp.y)/2);<br>    tile.frame=croppingRect;<br>    <br>    NSString *str= [NSString stringWithFormat:@"%@ %d", @"tileNO", num];<br>    tile.name=str;<br>    <br>    [_itemAry addObject:tile];<br>    <br>    NSValue *nsval = [NSValue valueWithCGPoint:tile.position];<br>    [_posAry addObject:nsval];<br>    [_imageAry addObject:newImage];<br>}<br><br>ぼくのへたな字の図でもわかりますね。<br><br> CGRect croppingRect =CGRectMake(_sp.x,_sp.y, _ep.x-_sp.x, _ep.y-_sp.y);<br>    CGImageRef imageRef = CGImageCreateWithImageInRect(maskedImage.CGImage, croppingRect);<br><br>tile.position = CGPointMake(_sp.x+( _ep.x-_sp.x)/2, _sp.y+( _ep.y-_sp.y)/2);//center position<br><br>これで　piece tile はできました。<br><br><a href="http://stat.ameba.jp/user_images/20130105/06/oldamebaman/3b/e3/p/o0349043512363400282.png"><img src="https://stat.ameba.jp/user_images/20130105/06/oldamebaman/3b/e3/p/t02200274_0349043512363400282.png" alt="$tengusa64のブログ-tile" border="0"></a><br><br>しかし、tile が多くなると少し時間がかかるんですね。そこで <font color="#FF1493">indicator</font> をつけるようにしましょう。あのグルグル回るヤツです。<br><br>@property (strong, nonatomic) UIActivityIndicatorView *indicator;<br><br>viewDidLoad につぎのコードを追加します。<br><br>    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];<br>    <br>    // 画面の中央に表示するようにframeを変更する<br>    indicator.frame = CGRectMake(0, 0, 50, 50);<br>    indicator.center = self.view.center;<br>    indicator.hidden=YES;<br>    _indicator=indicator;<br>    [self.view addSubview:indicator];<br><br><font color="#FF1493">-(void)okbtn:(id)sender</font> を作り替えます。<br><br>-(void)okbtn:(id)sender{<br>    _indicator.hidden=NO;<br>    [_indicator startAnimating];<br>    [self performSelector:@selector(drawMask) withObject:nil afterDelay:0.3];<br>    <br>}<br><br>今までの　-(void)okbtn:(id)sender　メソッドを<br>-(void)drawMask{<br><br>にかえます。<br><br><br>それでは、Game view を作成しましょう。<br><br>game の View　Class を作成します。<br>「ファイル(File)」&gt;「新規(New)」&gt;「ファイル(File)」&gt;「Objective-C」クラス、クラス(Class)」フィールドに　<font color="#FF1493">GameViewController　</font>と入力し、「サブクラス(Subclass)」ポップアップメニューから <font color="#FF1493">UIViewController</font> を選択します。<br><br>storyBoad で view Controller を キャンパスに追加します。<br><br>Identityインスペクタで、「クラス(Class)」ポップアップメニューから<font color="#FF1493">GameViewController </font> を選択。その下にある　<font color="#FF1493">Identity の「StoryBoard ID」に ShowGame を入力</font>します。<br><br><br><font color="#FF1493">GameViewController.h</font><br><br>#import &lt;UIKit/UIKit.h&gt;<br>#import &lt;QuartzCore/QuartzCore.h&gt;<br><br>@interface GameViewController : UIViewController<br><br>@property (strong, nonatomic) NSMutableArray *posAry;//レイヤーのポジション<br>@property (strong, nonatomic) NSMutableArray *itemAry;//tileレイヤー<br>@property (strong, nonatomic) NSMutableArray *imageAry;<br><br>@property (strong, nonatomic) UIView *referview;<br><br><br>@end<br><br><font color="#FF1493">PhotoViewController.m</font><br><br>#import "GameViewController.h"<br><br>-(void)drawMask{ の最後に追加<br><br>CFRelease(data);<br>  <br>[_indicator stopAnimating];<br>    [_indicator removeFromSuperview];  <br>   <br>  GameViewController *gameview = [self.storyboard <br>     instantiateViewControllerWithIdentifier:@"ShowGame"];<br>        gameview.posAry=_posAry;<br>        gameview.imageAry=_imageAry;<br>        gameview.itemAry=_itemAry;<br>        <br>        gameview.referview=self.view;<br>    <br>    [self presentViewController: gameview animated:YES completion: nil];<br><br>Array は tile 作成のところをみてもらうとわかると思いますが、_posAry には本来あるべきcenterPosition,_imageAry にはimage これはあとで使用しますが、_itemAry には tile.name,tile が view 上でとる position,表示する contents をもった tile がはいっています。<br><br>さあ～　これからいよいよゲームを開始していきますが、どのようにしてはじめますかね。<br><br><a href="http://stat.ameba.jp/user_images/20130105/06/oldamebaman/d6/ff/p/o0327048412363403755.png"><img src="https://stat.ameba.jp/user_images/20130105/06/oldamebaman/d6/ff/p/t02200326_0327048412363403755.png" alt="$tengusa64のブログ-games" border="0"></a><br><br><br>ぼくは図のように上から １枚づつ取り出すようにしてみました。<br><br>それでは、Game view を実装していきましょう。<br><br>@interfaceGameViewController ()<br><br>@property (strong, nonatomic) NSMutableArray *stateAry;//<br>@property (strong, nonatomic) CALayer *thetile,*tile;//tile のレイヤー<br><br>@property (strong, nonatomic) UIToolbar *toolbar;<br>@property (assign, nonatomic) BOOL tapOff;<br><br>@property (assign, nonatomic) NSInteger upval;<br>@property (strong, nonatomic) UILabel *label;<br>@property (strong, nonatomic) UIButton *btn;<br><br>@end<br><br>- (void)viewDidLoad<br>{<br>    [super viewDidLoad];<br>    UIApplication *app = [UIApplication sharedApplication];<br>    app.statusBarHidden = YES;//statusBar を表示しない<br>    self.view.layer.sublayers = nil;<br>    <br>    self.view.userInteractionEnabled = YES;<br>    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView:)];<br>    [self.view addGestureRecognizer:tap];<br>    <br>    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];<br>    [self.view addGestureRecognizer:pan];<br>    <br>    <br>    CALayer*    backgroundLayer;<br>    backgroundLayer = [CALayer layer];<br>    backgroundLayer.frame = CGRectMake(0,0, 320, 480);<br>    backgroundLayer.backgroundColor = [UIColor blackColor].CGColor;<br>    <br>    CALayer *layer = [CALayer layer];<br>    layer.frame = CGRectMake(10,160, 300, 300);<br>    layer.backgroundColor =[UIColor colorWithRed:0.6 green:1.0 blue:1.0 alpha:1.0].CGColor;<br>    <br>    [backgroundLayer addSublayer:layer];<br>    <br>    CALayer *toollayer = [CALayer layer];<br>    toollayer.frame = CGRectMake(0,465, 320, 15);<br>    toollayer.backgroundColor = [UIColor grayColor].CGColor;<br>    [backgroundLayer addSublayer:toollayer];<br>    <br>    [self.view.layer addSublayer:backgroundLayer];<br>    <br>    [self setupdata];<br>    [self setToolbar];<br>}<br>-(void)setToolbar{<br>    <br>    UIToolbar *toolBar = [[UIToolbar alloc]init];<br>    toolBar.barStyle = UIBarStyleBlackTranslucent;<br>    [toolBar setFrame:CGRectMake(0, 445,320, 35)];<br>    [self.view addSubview:toolBar];<br>    <br>    _toolbar=toolBar;<br>    <br>    UIBarButtonItem *restartButton =<br>    [[UIBarButtonItem alloc]initWithTitle:@"Restart"<br>                                    style:UIBarButtonItemStyleBordered<br>                                   target:self<br>                                   action:@selector(restart:)];<br>    UIBarButtonItem *referButton =<br>    [[UIBarButtonItem alloc]initWithTitle:@"Refer"<br>                                    style:UIBarButtonItemStyleBordered<br>                                   target:self<br>                                   action:@selector(referbtn:)];<br><br>    UIBarButtonItem *spacer = [[UIBarButtonItem alloc]<br>                               initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace<br>                               target:nil action:nil];<br>    <br>    [toolBar setItems:[NSArray arrayWithObjects:spacer,restartButton,spacer,referButton,<br>                       spacer, nil]];<br>}<br><br>//　各 button の action<br>-(void)restart:(id)dender{<br>    <br>    [self dismissViewControllerAnimated:YES completion:nil];<br>}<br><br>-(void)referbtn:(id)sender{<br>    <br>    [UIView beginAnimations:@"flipping view" context:nil];<br>    [UIView setAnimationDuration:0.7];<br>    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];<br>    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown<br>                           forView:self.viewcache:YES];<br>    <br>    [self.view addSubview:_referview];<br>    [UIView commitAnimations];<br>    <br>    UIButton *backbtn = [UIButton buttonWithType:UIButtonTypeCustom];<br>    backbtn.layer.cornerRadius = 10.0f;<br>    backbtn.frame = CGRectMake(100,430,140,25);<br>    [backbtn addTarget:self action:@selector(pushbkbtn:) forControlEvents:UIControlEventTouchDown];<br>    [backbtn setTitle:@"Back Game" forState:UIControlStateNormal];<br>    [backbtn setTitleColor:[ UIColor blueColor] forState:UIControlStateNormal];<br>    backbtn.backgroundColor = [UIColor yellowColor];<br>    [self.view addSubview:backbtn];<br>    _btn=backbtn;<br>    <br>    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10,20,300,100)];<br>    label.text=@"Refer Picture";<br>    label.backgroundColor=[UIColor whiteColor];<br>    [self.view addSubview:label];<br>    _label=label;<br>}<br>-(void)pushbkbtn:(id)sender{<br>    [_label removeFromSuperview];<br>    [_btn removeFromSuperview];<br>    <br>    _tapOff=NO;<br>    [_referview removeFromSuperview];<br>}<br><br>それでは tile をセットしていきましょう。<br><br>-(void)setupdata{<br>    int pieces=[_itemAry count];<br>    int i;<br>    <br>    //シャッフル<br>    _stateAry=[NSMutableArray array];<br>    for (i=0; i&lt;pieces; i++) {<br>        [_stateAry addObject:[NSNumber numberWithInt:i]];<br>    }<br>    for (i=0; i&lt;pieces*5; i++) {<br>        int index=random() % pieces;<br>        id obj=[_stateAry objectAtIndex:index];<br>        [_stateAry removeObjectAtIndex:index];<br>        [_stateAry addObject:obj];<br>        <br>    }<br>    _upval=0;//表示tile<br>    [self setTile];<br>    <br>}<br>-(void)setTile{<br>    <br>   CALayer *tile=[CALayer layer];<br>    NSInteger index=[[_stateAry objectAtIndex:_upval]intValue];<br>    tile=[_itemAry objectAtIndex:index];<br>     tile.position=CGPointMake(160, 80);<br>    <br>    [self.view.layer addSublayer:tile];<br>}<br><br>- (void)tapView:(UITapGestureRecognizer*)gesture {<br>    <br>    CGPoint pos = [gesture locationInView:self.view];<br>    if (_tapOff) {<br>        gesture.cancelsTouchesInView = NO;<br>        return;<br>    }<br>    <br>    if (pos.y&gt;=460) {<br>        _toolbar.hidden=NO;<br>        _tapOff=YES;<br>        return;<br>    }<br>    _thetile=[self.view.layerhitTest:pos];<br>    _tapOff=NO;<br>}<br><br>このあたりは「２・３」のおさらいですよ。<br><br>- (void)panAction : (UIPanGestureRecognizer *)sender {<br>    CGPoint spos;<br>    _toolbar.hidden=YES;<br>     _tapOff=NO;<br><br>    if (sender.state == UIGestureRecognizerStateBegan) {<br>        spos = [sender locationInView:self.view];<br>        _tile=[self.view.layerhitTest:spos];<br><br>    }<br>     BOOL bl = [_tile.namehasPrefix:@"tile"];<br>    if (bl) {<br>        [_tile　removeFromSuperlayer];<br>        [self.view.layer addSublayer:_tile];//tileを前面に出す<br>    }else{<br>        return;<br>    }    <br><br>    if (sender.state == UIGestureRecognizerStateChanged) {<br>        CGPoint cpos = [sender locationInView:self.view];<br>        _tile.position = cpos;<br>    }<br>    if (sender.state == UIGestureRecognizerStateEnded){<br>       CGPoint ep = [sender locationInView:self.view];<br>        <br>        NSString *str=[_tile.name substringFromIndex:7];//tileNO**<br>        int num=[str intValue];<br>        <br>        NSValue *value = [_posAry objectAtIndex:num];<br>        CGPoint cpos = [value CGPointValue];<br>        CGPoint cp=CGPointMake(cpos.x+10, cpos.y+160);//self.view 補正<br>        <br>        if (abs((int)(cp.x-ep.x))&lt;5 &amp;&amp; abs((int)(cp.y-ep.y))&lt;5 ) {<br>            _tile.position=cp;<br>        }else{<br>            _tile.position=ep;<br>        }<br>            <br>        //tile があるか<br>        CGPoint pos=CGPointMake(160, 80);<br>        _tile=[self.view.layer hitTest:pos];<br>        BOOL bl = [_tile.name hasPrefix:@"tile"];<br>       if (!(bl)&amp;&amp;(_upval&lt;[_itemAry count]-1)) {<br>            _upval=_upval+1;<br>            [self setTile];<br>        }<br>    }<br>}<br><br> CGPoint cp=CGPointMake(cpos.x+10, cpos.y+160);//self.view 補正　はわかりますね。<br>sender.state == UIGestureRecognizerStateEnded で position が本来あるべき position の＋ー５以内にあれば position を修正するようにします。<br><br>[_tile　removeFromSuperlayer];<br>        [self.view.layeraddSublayer:_tile];//tileを前面に出す　は、tile が潜り込まないように常に最前面に表示するためです。<br><br>これで一通りの jigsaw Puzzle の完成です。<br><br>次回は、回転をくわえてより　bother なゲームにしていきます。<br></font>
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11443779974.html</link>
<pubDate>Mon, 07 Jan 2013 04:51:51 +0900</pubDate>
</item>
<item>
<title>易しくて優しい「２・４」番目のアプリ！ほぼ究極のJigsaw（その３）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><br><font size="2"><br>「２・３」番目は Jigsaw もどきでしたが、今回は本格的な、ほぼ究極の Jigsaw Game の作成です。世界にふたつとない YOU だけのゲームをつくります。（その３）<br><br>今回は、前回作った線分データから mask 画像 をつくっていきます。<br><br><a href="http://stat.ameba.jp/user_images/20130104/16/oldamebaman/be/e1/p/o0333035212362466702.png"><img src="https://stat.ameba.jp/user_images/20130104/16/oldamebaman/be/e1/p/t02200233_0333035212362466702.png" alt="$tengusa64のブログ-mline" border="0"></a><br><br><br><a href="http://stat.ameba.jp/user_images/20130104/16/oldamebaman/d5/7d/p/o0337036412362466700.png"><img src="https://stat.ameba.jp/user_images/20130104/16/oldamebaman/d5/7d/p/t02200238_0337036412362466700.png" alt="$tengusa64のブログ-mask" border="0"></a><br><br><br>それでは OK button の実装からはじめていきましょう。<br><br><br>-(void)okbtn:(id)sender{<br>   <br> <br>    /*<br>    _itemAry=[NSMutableArray array];<br>    _posAry=[NSMutableArray array];<br>    _imageAry=[NSMutableArray array];<br>    */<br>   <br>    CGImageRef  cgImage= _cvXimg.CGImage;<br>   <br>    size_t width = CGImageGetWidth(cgImage);<br>    size_t height = CGImageGetHeight(cgImage);<br>   <br>    size_t bitsPerComponent = CGImageGetBitsPerComponent(cgImage);<br>    size_t bitsPerPixel = CGImageGetBitsPerPixel(cgImage);<br>    size_t bytesPerRow = CGImageGetBytesPerRow(cgImage);<br>    CGColorSpaceRef colorSpace = CGImageGetColorSpace(cgImage);<br>    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(cgImage);<br>    BOOL shouldInterpolate = CGImageGetShouldInterpolate(cgImage);<br>    CGColorRenderingIntent intent = CGImageGetRenderingIntent(cgImage);<br>    CGDataProviderRef  dataProvider;<br>    dataProvider = CGImageGetDataProvider(cgImage);<br>    CFMutableDataRef data = CFDataCreateMutableCopy(0, 0, CGDataProviderCopyData(dataProvider));<br>    UInt8 *buffer = (UInt8 *)CFDataGetMutableBytePtr(data);<br>   <br>    /*********   tile の mask 画像をつくる ******************/<br>    NSUInteger  i, j, k ;<br>    NSInteger xsp,xep;<br>    NSInteger ysp,yep;<br>    NSInteger xi,yi;<br>    NSInteger w=_col;<br>    NSInteger h=_row;<br>   <br>    NSInteger xcsp,xcep;<br>    NSInteger ycsp,ycep;<br>   <br>    UInt8  px,py,pz;<br>    UInt8*  tmp;<br>   <br>   // for (k=0; k&lt;h*w; k++) {<br>    k=4;<br>   <br>        ycsp=300;<br>        ycep=0;<br>        xcsp=300;<br>        xcep=0;<br>       <br>        for ( j=0; j&lt;height; j++) {<br>           <br>            for (i=0; i&lt;width; i++) {<br>               <br>                if (k%w==0) {<br>                    xsp=0;<br>                   <br>                }else {<br>                    xi=k%w-1;<br>                    xsp=[[[_xposAry objectAtIndex:xi] objectAtIndex:j]intValue];<br>                   <br>                }<br>                if (k%w==w-1) {<br>                    xep=300;<br>                }else{<br>                    xi=k%w;<br>                    xep=[[[_xposAry objectAtIndex:xi] objectAtIndex:j]intValue];<br>                   <br>                }<br>               <br>                if (k/w==0) {<br>                    ysp=0;<br>                }else{<br>                    yi=k/w-1;<br>                    ysp=[[[_yposAry objectAtIndex:yi] objectAtIndex:i]intValue];<br>                   <br>                }<br>                if (k/w==h-1) {<br>                    yep=300;<br>                }else{<br>                    yi=k/w;<br>                    yep=[[[_yposAry objectAtIndex:yi] objectAtIndex:i]intValue];<br>                   <br>                }<br>               <br>               <br>                tmp = buffer + j * bytesPerRow + i * 4;<br>                if (i&gt;=xsp &amp;&amp; i&lt;=xep &amp;&amp; j&gt;=ysp &amp;&amp; j&lt;=yep) {<br>                    if (i&lt;xcsp) xcsp=i;<br>                    if (i&gt;xcep) xcep=i;<br>                   <br>                    if (j&lt;ycsp) ycsp=j;<br>                    if (j&gt;ycep) ycep=j;<br>                   <br>                    px=0;<br>                    py=0;<br>                    pz=0;<br>                    *(tmp + 2) = px;<br>                    *(tmp + 1) = py;<br>                    *(tmp + 0) = pz;<br>                }else{<br>                    px=255;<br>                    py=255;<br>                    pz=255;<br>                    *(tmp + 2) = px;<br>                    *(tmp + 1) = py;<br>                    *(tmp + 0) = pz;<br>                }<br>               <br>               <br>            }<br>        }<br>    /*<br>        //切り取り位置<br>        CGPoint sp = CGPointMake(xcsp,ycsp);<br>        _sp=sp;<br>        CGPoint ep=CGPointMake(xcep,ycep);<br>        _ep=ep;<br>   */    <br><br>     //mask画像を再描画する<br>        CFDataRef  effectedData;<br>        effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data));<br>        CGDataProviderRef  effectedDataProvider;<br>        effectedDataProvider = CGDataProviderCreateWithCFData(effectedData);<br>        CGImageRef  effectedCgImage;<br>        UIImage*    effectedImage;<br>        effectedCgImage = CGImageCreate(<br>                                        width, height,<br>                                        bitsPerComponent, bitsPerPixel, bytesPerRow,<br>                                        colorSpace, bitmapInfo, effectedDataProvider,<br>                                        NULL, shouldInterpolate, intent);<br>       <br>        effectedImage = [[UIImagealloc] initWithCGImage:effectedCgImage];<br>        _maskimg=effectedImage;<br>       <br>        // 作成したデータを解放する<br>        CGImageRelease(effectedCgImage);<br>        CFRelease(effectedDataProvider);<br>        CFRelease(effectedData);<br>   <br>        //int num=k;<br>        //[self mask:(int)num];<br>       <br>   // }<br>   <br>    CFRelease(data);<br>   <br>    [_imageView setImage:nil];<br>    [_imageView setImage:_maskimg];<br><br>}<br><br><br><br>for文の中の if はわかりますね。<br>xi,yi は xposAry,YposAry からとりだす index です。<br><br>ここまでできたら「Run」してみてください。<br>いま　k=4 としていますから 0,1,2・・「４個目の cell」の mask 画像をとりだしています。<br><br>それでは今度は mask をかけた画像を取り出しましょう。<br><br>//[_imageView setImage:nil];<br>//[_imageView setImage:_maskimg];<br><br><br><br>//int num=k;<br>//[self mask:(int)num];　の注釈をはずしてください。<br><br><br>- (void)mask:(int)num{<br>   <br>    UIImage *myImage =_image;<br>    //マスク画像<br>    UIImage *maskImage =_maskimg;<br>   <br>    //マスク画像をCGImageに変換する<br>    CGImageRef maskRef = maskImage.CGImage;<br>    //マスクを作成する<br>    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),<br>                                        CGImageGetHeight(maskRef),<br>                                        CGImageGetBitsPerComponent(maskRef),<br>                                        CGImageGetBitsPerPixel(maskRef),<br>                                        CGImageGetBytesPerRow(maskRef),<br>                                        CGImageGetDataProvider(maskRef), NULL, false);<br>   <br>    //マスクの形に切り抜く<br>    CGImageRef masked = CGImageCreateWithMask([myImage CGImage], mask);<br>    //CGImageをUIImageに変換する<br>    UIImage *maskedImage = [UIImage imageWithCGImage:masked];<br>   <br>    CGImageRelease(mask);<br>    CGImageRelease(masked);<br>    UIGraphicsEndImageContext();<br>   <br>   <br>    [_imageView setImage:maskedImage];<br>   <br> }<br><br><a href="http://stat.ameba.jp/user_images/20130104/16/oldamebaman/f7/80/p/o0335035012362466701.png"><img src="https://stat.ameba.jp/user_images/20130104/16/oldamebaman/f7/80/p/t02200230_0335035012362466701.png" alt="$tengusa64のブログ-maskimg" border="0"></a><br><br>図のように picture が切り取られましたか。<br><br>次回はいよいよゲーム用の tile をつくっていきましょう。<br></font>
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11443062979.html</link>
<pubDate>Sun, 06 Jan 2013 04:25:35 +0900</pubDate>
</item>
<item>
<title>易しくて優しい「２・４」番目のアプリ！ほぼ究極のJigsaw（その２）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><br><font size="2"><br>「２・３」番目は Jigsaw もどきでしたが、今回は本格的な、ほぼ究極の Jigsaw Game の作成です。世界にふたつとない YOU だけのゲームをつくります。（その２）<br><br>前回は、分割する線を描くところまでやりました。<br><br><a href="http://stat.ameba.jp/user_images/20130104/09/oldamebaman/7f/d5/p/o0322035712362010060.png"><img src="https://stat.ameba.jp/user_images/20130104/09/oldamebaman/7f/d5/p/t02200244_0322035712362010060.png" alt="$tengusa64のブログ-line" border="0"></a><br><br>今回はその線分のデータを取得することからはじめましょう。<br><br><br>-(void)okbtn:(id)sender{<br>  <br>    //<font color="#FF1493">bitmap data の取得</font>　ここから<br>  <br>    CGImageRef  cgImage= _canvasImg.CGImage;<br>  <br>    size_t width = CGImageGetWidth(cgImage);<br>    size_t height = CGImageGetHeight(cgImage);<br>  <br>    // ピクセルを構成するRGB各要素が何ビットで構成されている<br>    size_t bitsPerComponent = CGImageGetBitsPerComponent(cgImage);<br>  <br>    // ピクセル全体は何ビットで構成されているか<br>    size_t bitsPerPixel = CGImageGetBitsPerPixel(cgImage);<br>  <br>    // 画像の横1ライン分のデータが、何バイトで構成されているか<br>    size_t bytesPerRow = CGImageGetBytesPerRow(cgImage);<br>  <br>    // 画像の色空間<br>    CGColorSpaceRef colorSpace = CGImageGetColorSpace(cgImage);<br>  <br>    // 画像のBitmap情報<br>    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(cgImage);<br>  <br>    // 画像がピクセル間の補完をしているか<br>    BOOL shouldInterpolate = CGImageGetShouldInterpolate(cgImage);<br>  <br>    // 表示装置によって補正をしているか<br>    CGColorRenderingIntent intent = CGImageGetRenderingIntent(cgImage);<br>  <br>    // 画像のデータプロバイダを取得する<br>    CGDataProviderRef  dataProvider;<br>    dataProvider = CGImageGetDataProvider(cgImage);<br>  <br>    // データプロバイダから画像のbitmap生データ取得<br>    CFMutableDataRef data = CFDataCreateMutableCopy(0, 0, CGDataProviderCopyData(dataProvider));<br>    UInt8 *buffer = (UInt8 *)CFDataGetMutableBytePtr(data);<br><br>//ここまで<br>// data の取り出し<br>/*  <br>             for (j = 0; j &lt; height; j++) {<br>            for (i = 0; i &lt; width; i++) {<br><br>                // ピクセルのポインタを取得する<br>                UInt8*  tmp;<br>// RGBAの4つ値をもっているので、1ピクセルごとに*4してずらす<br>                <font color="#FF1493">tmp = buffer + j * bytesPerRow + i * 4;</font><br>              <br>                // RGBの値を取得する<br>                UInt8  r, g, b;<br>                <font color="#FF1493">r = *(tmp + 2);<br>                g = *(tmp + 1);<br>                b = *(tmp + 0);</font><br>*/<br>//ここまで　<br>  <br>    NSUInteger  i, j, k ,s=0;<br>  <br>    NSInteger rowval=0;<br>    NSInteger colval=0;<br>  <br>    // 1ピクセルずつ画像を処理、縦横を走査して交差数を求める<br>  <br>    for (i = 0; i &lt; height; i++) {<br>        UInt8*  tmp;<br>        tmp = buffer + i * bytesPerRow ;<br>        UInt8    b;<br>        b = *(tmp + 0);<br>        //NSLog(@"i=%d %d",i,b);<br>        if (b&gt;0) {<br>               rowval=rowval+1;<br><br>            }<br><br>          <br>    }<br> NSLog(@"row=%d ",rowval);<br><br>}<br><br>これで一度、横線を２本引いて「Run」してみてください。<br>row は ２以上の数がでますね。<br><br>//NSLog(@"i=%d %d",i,b); の注釈をはずして データをみてください。<br><br>b&gt;０ が続けてあります。<br><br>// 線の太さを指定<br>    CGContextSetLineWidth(context, 1.0); で色付けした場合、１ピクセルだけが色付けされるわけではないし、また整数値で走査する場合、そこにpixelがあるわけではないんですね。<br><br><br>そこで　for文を少し細工します。<br><br>for (i = 0; i &lt; height; i++) {<br>        UInt8*  tmp;<br>        tmp = buffer + i * bytesPerRow ;<br>        UInt8    b;<br>        b = *(tmp + 0);<br>      <br>        if (b&gt;0) {<br>            if (s==0) {<br>                rowval=rowval+1;<br>                s=1;<br>            }<br>          <br>        }else{<br>            s=0;<br>        }<br>    }<br><br>これで　rowval は線の数と同じになります。<br>それでは線分のデータを読み込むようにしましょう。<br><br>@interfacePhotoViewController ()　に追加。<br><br>@property (strong, nonatomic) NSMutableArray *xposAry,*yposAry;<br>@property (assign, nonatomic) NSInteger col,row;<br>@property (assign, nonatomic) BOOL isError;<br><br><br>X、Y のそれぞれの座標を xposAry,yposAry に格納します。<br><br>picture は (300*300) にしているので、データは１行、１列に３００あることになります。<br><br>＝３００でないときは線が完全に描かれていないということですので、error flag をたて取り消すようにします。<br><br>- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{<br>  <br>    [self posArySet];//書き終わったら走査する<br><br>     if (_isError) {<br>        [self showAlert];<br>    }<br>  <br>    if (_spos.x&lt;=10) {<br>      <br>        if (_isError) {<br>            _canvasY.image=_cvYimg;<br>            _isError=NO;<br>        }else{<br>            _cvYimg=_canvasY.image;<br>        }<br>    }else{<br>      <br>        if (_isError) {<br>            _canvasX.image=_cvXimg;<br>            _isError=NO;<br>        }else{<br>            _cvXimg=_canvasX.image;<br>        }<br>    }<br>  <br>}<br><br>-(void)posArySet{<br>  <br>    _isError=NO;<br>  <br>    NSMutableArray *pos=[NSMutableArray array];<br>    CGImageRef  cgImage;<br>    if (_spos.x&lt;=10) {<br>        _yposAry=[NSMutableArray array];<br>      <br>        cgImage=_canvasY.image.CGImage;<br>    }else{<br>        _xposAry=[NSMutableArray array];<br>        cgImage=_canvasX.image.CGImage;<br>    }<br>    size_t width = CGImageGetWidth(cgImage);<br>    size_t height = CGImageGetHeight(cgImage);<br>  <br>  <br>    size_t bytesPerRow = CGImageGetBytesPerRow(cgImage);<br>  <br>    CGDataProviderRef  dataProvider;<br>    dataProvider = CGImageGetDataProvider(cgImage);<br>  <br>    CFMutableDataRef data = CFDataCreateMutableCopy(0, 0, CGDataProviderCopyData(dataProvider));<br>    UInt8 *buffer = (UInt8 *)CFDataGetMutableBytePtr(data);<br>  <br>  <br>    NSUInteger  i, j, k ,s=0;<br>    if (_spos.x&lt;=10) {<br>        NSInteger rowval=0;<br>        //高さを求める<br>        for (i = 0; i &lt; height; i++) {<br>            UInt8*  tmp;<br>            tmp = buffer + i * bytesPerRow ;<br>            UInt8    b;<br>            b = *(tmp + 0);<br>          <br>            if (b&gt;0) {<br>                if (s==0) {<br>                    rowval=rowval+1;<br>                    s=1;<br>                }<br>              <br>            }else{<br>                s=0;<br>            }<br>        }<br>        _row=rowval+1;<br>      <br>        for (k=0; k&lt;rowval; k++) {<br>            [pos removeAllObjects];<br>            s=0;<br>            NSInteger col;<br>            for (j = 0; j &lt; width; j++) {<br>                col=0;<br>                for (i = 0; i &lt; height; i++) {<br>                    UInt8*  tmp;<br>                    tmp = buffer + i * bytesPerRow + j * 4;<br>                    UInt8  b;<br>                    b = *(tmp + 0);<br>                  <br>                    if (b&gt;0) {<br>                      <br>                        if (s==0) {<br>                            col=col+1;<br>                          <br>                            if (col==k+1) {<br>                                [pos addObject:[NSNumber numberWithInt:i]];<br>                            }<br>                          <br>                            s=1;<br>                        }<br>                      <br>                    }else{<br>                        s=0;<br>                    }<br>                }<br>              <br>            }<br>            NSArray *array=[[NSArray alloc] initWithArray:pos];<br>            [_yposAry addObject:array];<br>            if ([array count]!=300) {<br>                _isError=YES;<br>            }<br>          <br>        }<br>      <br>        /******************** 横を求める（赤線）******************/<br>    }else{<br>        NSInteger colval=0;<br>        for (i = 0; i &lt; width; i++) {<br>            UInt8*  tmp;<br>            tmp = buffer  + i * 4;<br>            UInt8  r;<br>            r = *(tmp + 2);<br>            if (r&gt;0) {<br>                if (s==0) {<br>                    colval=colval+1;<br>                    s=1;<br>                }<br>              <br>            }else{<br>                s=0;<br>            }<br>        }<br>      <br>        _col=colval+1;<br>      <br>        for (k=0; k&lt;colval; k++) {<br>            [pos removeAllObjects];<br>            s=0;<br>            NSInteger col;<br>            for (j = 0; j &lt;&lt;height; j++) {<br>                col=0;<br>                for (i = 0; i &lt; width; i++) {<br>                  <br>                    // ピクセルのポインタを取得する<br>                    UInt8*  tmp;<br>                    tmp = buffer + j * bytesPerRow + i * 4;<br>                  <br>                    UInt8  r;<br>                    r = *(tmp + 2);<br>                  <br>                    if (r&gt;0) {<br>                      <br>                        if (s==0) {<br>                            col=col+1;<br>                          <br>                            if (col==k+1) {<br>                                [pos addObject:[NSNumber numberWithInt:i]];<br>                            }<br>                            s=1;<br>                        }<br>                      <br>                    }else{<br>                        s=0;<br>                    }<br>                }<br>              <br>            }<br>            NSArray *array=[[NSArray alloc] initWithArray:pos];<br>            if ([array count]!=300) {<br>                _isError=YES;<br>            }<br>            [_xposAry addObject:array];<br>        }<br>    }<br>  <br>}<br><br><br>-(void)showAlert{<br>  <br>    UIAlertView *alert = [[UIAlertView alloc] init];<br>    alert.delegate = self;<br>  <br>    alert.title = @"描画失敗";<br>    NSString *str =@"線がきちんと描かれていません";<br>  <br>    alert.message = str;<br>  <br>    [alert addButtonWithTitle:@"o k"];<br>    [alert show];<br>  <br>}<br><br><br>これで colval,rowval 縦横の数と xpos,ypos 縦横の線分のデータができます。<br>ここまでくると、なにをやろうとしているのかだいたい察しがつくかもしれませんね。<br><br>画像を切り取る方法として cropping だけでなくて mask を使用して mask の黒い部分だけを切り取ることもできます。<br><br><a href="http://stat.ameba.jp/user_images/20130105/02/oldamebaman/3a/44/p/o0278026312363348713.png"><img src="https://stat.ameba.jp/user_images/20130105/02/oldamebaman/3a/44/p/t02200208_0278026312363348713.png" alt="$tengusa64のブログ-maskline" border="0"></a><br><br>図で真ん中の部分を切り取るためには、真ん中の部分のみを黒く塗りつぶした mask を作ればいいわけですね。<br><br>次回は、線分データから mask をつくっていきましょう。<br></font>
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11442349668.html</link>
<pubDate>Sat, 05 Jan 2013 02:57:47 +0900</pubDate>
</item>
<item>
<title>易しくて優しい「２・４」番目のアプリ！ほぼ究極のJigsaw（その１）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><br><font size="2"><br>新年明けましておめでとうございます。<br><br>「２・３」番目は Jigsaw もどきでしたが、今回は本格的な、ほぼ究極の Jigsaw Game の作成です。世界にふたつとない YOU だけのゲームをつくります。（その１）<br><br><br>分割する線をひく。<br><br><a href="http://stat.ameba.jp/user_images/20130104/09/oldamebaman/7f/d5/p/o0322035712362010060.png"><img src="https://stat.ameba.jp/user_images/20130104/09/oldamebaman/7f/d5/p/t02200244_0322035712362010060.png" alt="$tengusa64のブログ-line" border="0"></a><br><br>まずは Jigsaw する picture を photo library からとってきます。<br>「２・３」の（その１）をそのまま使って作成してください。<br><br>Product Name: JigsawGame<br><br>各種設定もそのままやってくださいね。<br>setmenu の openview.backgroundColor や label の色などは適当に変更。<br>label.text = @"Welcome BotherGame" は label.text = @"Welcome Jigsaw Game"<br><br><font color="#FF1493">あっそれからいまさらですが、@synthesize は必要なかった</font>ですね。どうも昔の人間で執拗にかきまくっていました。<br><br>それでは picture の表示からはじめていきます。<br><br>表示用の View　Class を作成します。<br>「ファイル(File)」&gt;「新規(New)」&gt;「ファイル(File)」&gt;「Objective-C」クラス、クラス(Class)」フィールドに　<font color="#FF1493">PhotoViewController　</font>と入力し、「サブクラス(Subclass)」ポップアップメニューから <font color="#FF1493">UIViewController</font> を選択します。<br><br>storyBoad で view Controller を キャンパスに追加します。<br><br>Identityインスペクタで、「クラス(Class)」ポップアップメニューから<font color="#FF1493">PhotoViewController </font> を選択。その下にある　<font color="#FF1493">Identity の「StoryBoard ID」に ShowPhoto を入力</font>します。<br><br><br><font color="#FF1493">PhotoViewController.h</font><br><br>#import &lt;UIKit/UIKit.h&gt;<br>#import &lt;QuartzCore/QuartzCore.h&gt;<br><br>@interface PhotoViewController : UIViewController<br><br>@property (strong, nonatomic) UIImage *image;<br><br>@end<br><br><br><br><font color="#FF1493">ViewController.m</font><br>decide Button のaction メソッドを作り替え。<br><br>-(void)decide:(id)sender{<br>   <br>    float imgH=_image.size.height;<br>    float imgW=_image.size.width;<br>   <br>    if (imgH&gt;imgW) {<br>       <br>        //http://choilog.com/katty0324/blog/41<br>        //画像が90度回転する補正<br>        UIGraphicsBeginImageContext(_image.size);<br>        [_image drawInRect:CGRectMake(0, 0, imgW, imgH)];<br>        _image = UIGraphicsGetImageFromCurrentImageContext();<br>        UIGraphicsEndImageContext();<br>    }<br>   <br> UIImage *myImage;<br>   <br>CGRect croppingRect = CGRectMake(_cutx*_mag, _cuty*_mag, _width*2*_mag, _width*2*_mag);<br> <br>CGImageRef imageRef = CGImageCreateWithImageInRect(_image.CGImage, croppingRect);<br>myImage =[UIImage imageWithCGImage:imageRef];<br>CGImageRelease(imageRef);<br>   <br>   <br>    CGSize nSize = CGSizeMake(300, 300);<br>    UIGraphicsBeginImageContext(nSize);<br>    [myImage drawInRect:CGRectMake(0,0, nSize.width, nSize.height)];<br>    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();<br>    UIGraphicsEndImageContext();<br>   <br>   <br><br>    PhotoViewController *photoview = [self.storyboard                        instantiateViewControllerWithIdentifier:@"ShowPhoto"];<br>    photoview.image=newImage;<br>   <br>    [self presentViewController: photoview animated:YES completion: nil];<br>   <br>}<br><br>今回は picture を拡大しないので、ここからリサイズした UIImage を使用します。ほかにも理由はありますが、あとで。<br><br>cancel Button は 最初からつけますか。<br><br>setItem メソッドの decide button の下に<br><br>UIButton *clbtn = [UIButton buttonWithType:UIButtonTypeCustom];<br>    clbtn.layer.cornerRadius = 10.0f;<br>    clbtn.frame = CGRectMake(250,15, 70, 25);<br>    [clbtn addTarget:self action:@selector(cancel:) forControlEvents:UIControlEventTouchDown];<br>    [clbtn setTitle:@"Cancel" forState:UIControlStateNormal];<br>    [clbtn setTitleColor:[ UIColor whiteColor ] forState:UIControlStateNormal];<br>    clbtn.backgroundColor = [UIColor grayColor];<br>    [self.view addSubview:clbtn];<br><br>clbtn action メソッド<br><br>-(void)cancel:(id)sender{<br>    for (UIView *view in [self.view subviews]) {<br>        [view removeFromSuperview];<br>    }<br>    [self setmenu];<br>   <br>}<br><br><br><font color="#FF1493">PhotoViewController</font> の実装<br><br>@interfacePhotoViewController ()<br><br>@property (strong, nonatomic) UIImageView *imageView,*canvasX,*canvasY;<br>@property (strong, nonatomic) UILabel *label,*label2;<br>@property (strong, nonatomic) UIButton *okbtn,*udbtn;<br><br>@property (strong, nonatomic) UIImage *cvXimg,*cvYimg;<br>@property (assign, nonatomic) CGPoint spos,epos,tpos;<br><br><br><br>- (void)viewDidLoad<br>{<br>    [super viewDidLoad];<br>    UIApplication *app = [UIApplication sharedApplication];<br>    app.statusBarHidden = YES;//statusBar を表示しない<br>    UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(10,120,300,300)];<br>    imgView.backgroundColor=[UIColor blackColor];<br>    [self.view addSubview:imgView];<br>    //[imgView setContentMode:UIViewContentModeScaleAspectFit];<br>    [imgView setImage:_image];<br>   <br>    UIImageView *canvas = [[UIImageView alloc] initWithImage:nil];<br>    canvas.backgroundColor= [UIColor clearColor];<br>    canvas.frame = CGRectMake(10, 120, 300, 300);<br><br>     canvas.userInteractionEnabled=YES;   <br>      _canvasX=canvas;   <br>    [self.view addSubview:canvas];<br>   <br>    UIImageView *canvas2 = [[UIImageView alloc] initWithImage:nil];<br>    canvas2.backgroundColor= [UIColor clearColor];<br>    canvas2.frame = CGRectMake(10, 120, 300, 300);<br>    _canvasY=canvas2;<br>   <br>   <br>    [self.view addSubview:canvas2];<br>   <br>    [self setItem];<br>   }<br><br><br><br>-(void)setItem{<br>    UILabel *label = [[UILabel alloc] init];<br>    label.frame = CGRectMake(10, 60, 200, 25);<br>    //label.backgroundColor = [UIColor clearColor];<br>    label.textColor = [UIColor blackColor];<br>    label.font = [UIFont fontWithName:@"AppleGothic"size:17];<br>    label.text = @"Please draw line";//線をひいて<br>    _label=label;<br>    [self.view addSubview:label];<br>   <br>    UILabel *label2 = [[UILabel alloc] init];<br>    label2.frame = CGRectMake(70, 90, 200, 25);<br>    //label.backgroundColor = [UIColor clearColor];<br>    label2.textColor = [UIColor blackColor];<br>    label2.font = [UIFont fontWithName:@"AppleGothic"size:15];<br>    label2.text = @"But line isn't intersected";//隣と交差させない<br>    _label2=label2;<br>    [self.view addSubview:label2];<br>   <br>    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];<br>    btn.layer.cornerRadius = 10.0f;<br>    btn.frame = CGRectMake(230,20, 70, 30);<br>    [btn addTarget:self action:@selector(okbtn:) forControlEvents:UIControlEventTouchDown];<br>    [btn setTitle:@"O K" forState:UIControlStateNormal];<br>    btn.hidden=YES;<br>    [ btn setTitleColor:[ UIColor blueColor ] forState:UIControlStateNormal];<br>    btn.backgroundColor = [UIColor yellowColor];<br>    _okbtn=btn;<br>    [self.view addSubview:btn];<br>   <br>    UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];<br>    btn1.layer.cornerRadius = 10.0f;<br>    btn1.frame = CGRectMake(20,20, 60, 30);<br>    [btn1 addTarget:self action:@selector(backbtn:) forControlEvents:UIControlEventTouchDown];<br>    [btn1 setTitle:@"Back" forState:UIControlStateNormal];<br>    [ btn1 setTitleColor:[ UIColor whiteColor ] forState:UIControlStateNormal];<br>    btn1.backgroundColor = [UIColor grayColor];<br>    [self.view addSubview:btn1];<br>   <br>    UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeCustom];<br>    btn2.layer.cornerRadius = 10.0f;<br>    btn2.frame = CGRectMake(130,20, 60, 30);<br>    [btn2 addTarget:self action:@selector(undobtn:) forControlEvents:UIControlEventTouchDown];<br>    [btn2 setTitle:@"undo" forState:UIControlStateNormal];<br>    btn2.hidden=YES;<br>    [btn2 setTitleColor:[ UIColor redColor ] forState:UIControlStateNormal];<br>    btn2.backgroundColor = [UIColor cyanColor];<br>    _udbtn=btn2;<br>    [self.view addSubview:btn2];//やり直し<br> <br>}<br><br><br><br>-(void)backbtn:(id)sender{<br>   <br>    [self dismissViewControllerAnimated:YES completion:nil];<br>}<br><br><br>これで一応前準備はできました。<br>それでは setItem の実際の動きを実装します。<br><br>viewDidLoad で imageView の canvas を生成して canvas.userInteractionEnabled=YES に設定しましたね。　<br><br>- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{<br>   <br>    UITouch *touch = [touches anyObject];<br>_spos =[touch locationInView:_canvasX];<br>    _tpos=_spos;<br>   <br>    _okbtn.hidden=NO;<br>    _udbtn.hidden=NO;<br>   <br>}<br><br><br>まず touch したとき、<br><br>start point を _spos、_tpos に登録、OKbtn と UnDo btn を表示します。<br><br><br>- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {<br>   <br>    UITouch *touch = [touches anyObject];<br>    _epos = [touch locationInView:_canvasX];<br>   <br>    // 描画領域をcanvasの大きさに設定、生成します。<br>    CGContextRef context;<br>   <br>    if (_spos.x&lt;=10) {<br>        UIGraphicsBeginImageContext(_canvasY.frame.size);<br>        [_canvasY.image drawInRect:CGRectMake(0, 0,300, 300)];<br>       <br>        context=UIGraphicsGetCurrentContext();<br>        CGContextSetRGBStrokeColor(context, 0, 0, 1.0, 1.0);//線の色（R,G,B,alpha)<br>    }else{<br>        UIGraphicsBeginImageContext(_canvasX.frame.size);<br>        [_canvasX.image drawInRect:CGRectMake(0, 0,300, 300)];<br>       <br>        context=UIGraphicsGetCurrentContext();<br>        CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1.0);//線の色<br>    }<br>    // 線の太さを指定<br>    CGContextSetLineWidth(context, 1.0);<br>   <br>    // 線の描画開始座標をセット<br>    CGContextMoveToPoint(context, _tpos.x, _tpos.y);<br>   <br>    // 線の描画終了座標をセット<br>    CGContextAddLineToPoint(context, _epos.x, _epos.y);<br>   <br>    // 描画の開始～終了座標まで線を引く<br>    CGContextStrokePath(context);<br>   <br>    // 描画領域を画像（image）としてcanvasにセット<br>    if (_spos.x&lt;=10) {<br>    _canvasY.image = UIGraphicsGetImageFromCurrentImageContext();<br>    }else{<br>      _canvasX.image = UIGraphicsGetImageFromCurrentImageContext(); <br>    }<br>    // 描画領域の解放<br>    UIGraphicsEndImageContext();<br>   <br>    // 現在のタッチ座標を次の開始座標にセット<br>    _tpos = _epos;<br>   <br>}<br><br>いま UIImageView *canvas = [[UIImageView alloc] initWithImage:nil];　として X 座標用とY座標用の canvas を用意しました。<br>if (_spos.x&lt;=10)～　else で canvas を切り替えています。<br><br>move している間、この メソッドを実行。<br><br><br>- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{<br>    <br>    _cvYimg=_canvasY.image;<br>    _cvXimg=_canvasX.image;<br>    <br><br>}<br><br><br><br><br>-(void)undobtn:(id)sender{<br>   <br>     [_canvasX setImage:nil];   <br>    [_canvasY setImage:nil];<br>}<br><br><br><br><br>ここまで、できたら「Run」して実際に書いてみてください。うまく線がでてきましたか。<br>undo btn で取り消します。<br>字を書くこともできますよ。いわゆる「お絵描き」ですね。今回は関係ないですけど。<br><br><br>次回は　この座標を読み込むことにします。<br></font>
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11441984848.html</link>
<pubDate>Fri, 04 Jan 2013 17:21:13 +0900</pubDate>
</item>
<item>
<title>易しくて優しい「２・３」番目のアプリ！ゲーム編（その６）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><br>前回の「２・２」番目のアプリで制作したアルバム付き山行記録帳はどうでしたか？うまく動きましたか。<br>今回は、YOUと一緒に <font color="#FF1493">GestureRecognizer</font> をメインに、写真を使ったジグソーパズルもどきをつくっていこうと思います。（ゲーム編その６　一応完結編）<br><br>前回　TapGesture で配置換えできるところまでやりました。<br>今回は、PanGesture で回転させるところからやりましょう。Tap でとりだした picture を回転させます。<br><br>sender.state == UIGestureRecognizerStatebegan<br><br>spos = [sender locationInView:self.view];<br><br>if (spos.y&gt;310) 回転の合図ということになります。<br><br>panAction:(UIPanGestureRecognizer *)sender メソッド<br><br>if (sender.state == UIGestureRecognizerStateBegan) {<br>        <br>        spos = [sender locationInView:self.view];<br>        <br>        if (spos.y&gt;=310) {<br>            [self overPan:(UIPanGestureRecognizer *)sender];<br>            return;<br>        }<br>        //tileのないところからはじめたらなにもしない<br>        if ((spos.x&gt;(_nilPos.x-wide/2))&amp;&amp;(spos.x&lt;(_nilPos.x+wide/2))&amp;&amp;(spos.y&gt;(_nilPos.y-wide/2))&amp;&amp;(spos.y&lt;(_nilPos.y+wide/2))) {<br>            return;<br>        }<br>        int tilex=(spos.x)/wide;<br>        int tiley=(spos.y)/wide;<br>---------<br>---------<br><br> }elseif (sender.state == UIGestureRecognizerStateEnded) {<br>        epos = [sender locationInView:self.view];<br>        //tileのないところでおわったらなにもしない<br>        if ((spos.x&gt;(_nilPos.x-wide/2))&amp;&amp;(spos.x&lt;(_nilPos.x+wide/2))&amp;&amp;(spos.y&gt;(_nilPos.y-wide/2))&amp;&amp;(spos.y&lt;(_nilPos.y+wide/2))) {<br>            <br>            return;<br>        }<br><br><br>-(void)overPan:(UIPanGestureRecognizer *)sender{<br>    if (!(_thetile)) {<br>        return;<br>    }<br>    NSString *location;<br>    <br>    if (sender.state == UIGestureRecognizerStateBegan) {<br>        <br>        CGPoint spos = [sender locationInView:self.view];<br>        CGPoint pos = [sender translationInView:self.view];<br>        <br>        if (spos.x&gt;=160) {<br>            if (pos.y&gt; 0) {<br>                location=@"right";<br>            }else{<br>                location=@"left";<br>            }<br>        }else{<br>            if (pos.y&gt; 0) {<br>                location=@"left";<br>            }else{<br>                location=@"right";<br>            }<br>         }<br>        <br>        [self rotate:(NSString *)location];<br>    }<br>}<br><br><br>-(void)rotate:(NSString*)location{<br>    <br>    int rezon=_intval;<br>float wide=_image.size.width;<br>    <br>    NSString *str=[_thetile.name substringFromIndex:8];<br>    <br>    int num=[str intValue];<br>    int v=num/rezon;<br>    int h=num%rezon;<br>    CGRect croppingRect = CGRectMake(wide*h / rezon,<br>                                     wide*v / rezon,<br>                                     wide / rezon,<br>                                     wide / rezon);<br>    CGImageRef imgRef = CGImageCreateWithImageInRect(_image.CGImage, croppingRect);<br>    CGContextRef context;<br>    float width = CGImageGetWidth(imgRef);<br>    float height = CGImageGetHeight(imgRef);<br>    <br><br>    NSNumber *spin=[_spinAry objectAtIndex:num];<br>    int tilespin=[spin intValue];<br>    <br>    if ([location isEqualToString:@"right"]) {<br>        tilespin=tilespin+1;<br>        <br>    }else{<br>        tilespin=tilespin-1;<br>    }<br>    if (tilespin==4) {<br>        tilespin=0;<br>    }<br>    if (tilespin==-1) {<br>        tilespin=3;<br>    }<br>    <br>    [_spinAry replaceObjectAtIndex:num withObject:[NSNumber numberWithInt:tilespin]];<br>    UIImage *ret;<br>    if (tilespin==0) {<br>        ret=[UIImage imageWithCGImage:imgRef];;<br>        _thetile.contents=(id)ret.CGImage;<br>    }else{<br>    <br>    switch (tilespin) {<br>        case 1:<br>            UIGraphicsBeginImageContext(CGSizeMake(height,width));<br>            context = UIGraphicsGetCurrentContext();<br>            CGContextScaleCTM(context, 1.0, -1.0);<br>            CGContextRotateCTM(context, -M_PI/2.0);<br>            break;<br>        case 2:<br>            UIGraphicsBeginImageContext(CGSizeMake(width,height));<br>            context = UIGraphicsGetCurrentContext();<br>            CGContextTranslateCTM(context,width,0);<br>            CGContextScaleCTM(context, 1.0, -1.0);<br>            CGContextRotateCTM(context, -M_PI);<br>            break;<br>        case 3:<br>            UIGraphicsBeginImageContext(CGSizeMake(height,width));<br>            context = UIGraphicsGetCurrentContext();<br>            CGContextTranslateCTM(context,height,width);<br>            CGContextScaleCTM(context, -1.0, 1.0);<br>            CGContextRotateCTM(context, -M_PI/2.0);<br>            break;<br>        default:<br>            break;<br>    }<br>    <br>    CGContextDrawImage(context, CGRectMake(0, 0, width,height), imgRef);<br>    ret = UIGraphicsGetImageFromCurrentImageContext();<br>    <br>    _thetile.contents=(id)ret.CGImage;<br>    <br>    UIGraphicsEndImageContext();<br>    }<br>    <br>    _thetile.frame = CGRectMake(85,315, 150, 150);<br>    _thetile.position=CGPointMake(150.0, 380.0);<br>    _viewlayer.contents=_thetile.contents;<br>}<br><br><br><br>採点の方はどうしますかね。<br><br>-(void)gradebtn:(id)sender{<br>    <br>    <br>    int pay=_intval;<br>    int pieces=pay*pay;<br>    <br>    <br>    NSMutableArray *arrayA =[NSMutableArray array];<br>    NSMutableArray *arrayR =[NSMutableArray array];<br>    <br>    for (int i=0; i<pieces; i++) {<br />        int pieceA=[[_stateAry objectAtIndex:i] intValue];<br>        int pieceR=[[_spinAry objectAtIndex:i] intValue];<br>        if (!(pieceA==i)) {<br>            [arrayA addObject:[NSNumber numberWithInt:i]];<br>        }<br>        if (!(pieceR==0)) {<br>            [arrayR addObject:[NSNumber numberWithInt:i]];<br>        }<br>    }<br>    int effectA=[arrayA count];<br>    int effectR=[arrayR count];<br>    <br>        <br>        <br>    UIAlertView *alert = [[UIAlertViewalloc] init];<br>    alert.delegate = self;<br>    if ((effectA==0)&amp;&amp;(effectR==0)) {<br>        <br>        alert.title = @"おめでとう";<br>        alert.message = @"You are perfect!! ";<br>    }else{<br>        alert.title = @"残念でした";<br>        NSString *str =<br>        [NSStringstringWithFormat:@"%@%d \n %@%d", @"Arrange NG ", effectA,@"Rotate NG ",effectR];<br>        alert.message = str;<br>    }<br>    [alert addButtonWithTitle:@"o k"];<br>    [alert show];<br>}<br><br>正解ならば　spinAry は全部　０　になります。<br><br>それでは最後に　戻るボタンを整備しましょう。<br><br>まず　<font color="#FF1493">BGGameViewController.m</font><br><br>UIBarButtonItem *restartButton =<br>    [[UIBarButtonItem alloc]initWithTitle:@"Restart"<br>                                    style:UIBarButtonItemStyleBordered<br>                                   target:self<br>                                   action:@selector(restart:)];<br><br><br>-(void)restart:(id)sender{<br>       <br>    [self dismissViewControllerAnimated:YES completion:nil];<br>}<br><br><font color="#FF1493">BGPhotoViewController.m</font><br><br>bkbtn の action<br><br>-(void)back:(id)sender{<br>    [self dismissViewControllerAnimated:YES completion:nil];<br>}<br><br>最後に<br><font color="#FF1493">BGViewController.m</font><br><br>seiItem メソッドに Cancel Button を追加しましょう。<br><br>UIButton *clbtn = [UIButton buttonWithType:UIButtonTypeCustom];<br>    clbtn.layer.cornerRadius = 10.0f;<br>    clbtn.frame = CGRectMake(250,25, 70, 25);<br>    [clbtn addTarget:self action:@selector(cancel:) forControlEvents:UIControlEventTouchDown];<br>    [clbtn setTitle:@"Cancel" forState:UIControlStateNormal];<br>    [clbtn setTitleColor:[ UIColorwhiteColor ] forState:UIControlStateNormal];<br>    clbtn.backgroundColor = [UIColorgrayColor];<br>    [self.view addSubview:clbtn];<br><br>最後の最後<br><br>-(void)cancel:(id)sender{<br>    for (UIView *view in [self.view subviews]) {<br>        [view removeFromSuperview];<br>    }<br>    [self setmenu];<br>}<br><br><br>それでは、ゲームを楽しんでください。<br><br>今回で一応「２・３」シリーズはおしまいです。<br><br>ぼくの YOU へのささやかな「お年玉」です。気に入ってもらえるといいのですが、ではヅアイヂエン！<br>
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11435093440.html</link>
<pubDate>Wed, 26 Dec 2012 05:01:42 +0900</pubDate>
</item>
<item>
<title>易しくて優しい「２・３」番目のアプリ！ゲーム編（その５）</title>
<description>
<![CDATA[ <a href="http://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/o0800016812278658165.png"><img src="https://stat.ameba.jp/user_images/20121110/08/oldamebaman/d5/d3/p/t02200046_0800016812278658165.png" alt="$tengusa64のブログ-トップ" width="320" height="80" border="0">　</a><br>前回の「２・２」番目のアプリで制作したアルバム付き山行記録帳はどうでしたか？うまく動きましたか。<br>今回は、YOUと一緒に <font color="#FF1493">GestureRecognizer</font> をメインに、写真を使ったジグソーパズルもどきをつくっていこうと思います。（ゲーム編その５）<br><br><br><br>前回までに一応のジグソーパズルはできましたが、なにかもう一つもの足りないですよね。<br>そこでもう少し Bother なゲームにしていこうと思います。<br><br>picture を正方形にきりとっていました。ということは picture は四通りの図ができるということです。そうです。回転させても、もとのジグソーにはめ込むことができます。それではそれを追加しましょう。<br><br><font color="#FF1493">BGGameViewController.m</font><br><br>@property (strong, nonatomic) NSMutableArray *spinAry;<br><br>@synthesize spinAry=_spinAry;<br><br>-(void)setupdata:(int)rezon に追加。<br><br> _spinAry=[NSMutableArray array];<br>    for (i=0; i<pieces; i++) {<br />int rval=arc4random() % 4;<br>[_spinAry addObject:[NSNumber numberWithInt:rval]];<br>}<br><br><br>-(void)setile メソッド<br><br>-(void)setile{<br>    int rezon=_intval;<br>int piece=rezon*rezon;<br>float wide=_image.size.width;<br><br>for (int i=0; i<piece; i++) {<br /><br>NSNumber *astate=[_stateAry objectAtIndex:i ];<br>int tilestate=[astate intValue];<br><br>        CALayer *settile=[_itemAry objectAtIndex:tilestate];<br>        <br>        NSNumber *spin=[_spinAry objectAtIndex:tilestate];<br>int tilespin=[spin intValue];<br>        <br>if (tilespin&gt;0) {<br>        <br>        NSString *str=[settile.name substringFromIndex:8];//tileNO1**<br>        int num=[str intValue];<br>        int v=num/rezon;<br>        int h=num%rezon;<br>        CGRect croppingRect = CGRectMake(wide*h / rezon,<br>                                         wide*v / rezon,<br>                                         wide / rezon,<br>                                         wide / rezon);<br>        CGImageRef imgRef = CGImageCreateWithImageInRect(_image.CGImage, croppingRect);<br>            CGContextRef context;<br>            float width = CGImageGetWidth(imgRef);<br>            float height = CGImageGetHeight(imgRef);<br>            <br>switch (tilespin) {<br>case 1:<br>                    UIGraphicsBeginImageContext(CGSizeMake(height,width));<br>                    context = UIGraphicsGetCurrentContext();<br>                    CGContextScaleCTM(context, 1.0, -1.0);<br>                    CGContextRotateCTM(context, -M_PI/2.0);<br>                    break;<br>case 2:<br>                    UIGraphicsBeginImageContext(CGSizeMake(width,height));<br>                    context = UIGraphicsGetCurrentContext();<br>                    CGContextTranslateCTM(context,width,0);<br>                    CGContextScaleCTM(context, 1.0, -1.0);<br>                    CGContextRotateCTM(context, -M_PI);<br>                    break;<br>case 3:<br>                    UIGraphicsBeginImageContext(CGSizeMake(height,width));<br>                    context = UIGraphicsGetCurrentContext();<br>                    CGContextTranslateCTM(context,height,width);<br>                    CGContextScaleCTM(context, -1.0, 1.0);<br>                    CGContextRotateCTM(context, -M_PI/2.0);<br>                    break;<br>                    <br>default:<br>                    break;<br>}<br><br>            //<br>            <br>            CGContextDrawImage(context, CGRectMake(0, 0, width,height), imgRef);<br>            UIImage *ret = UIGraphicsGetImageFromCurrentImageContext();<br>            settile.contents=(id)ret.CGImage;<br>            <br>            UIGraphicsEndImageContext();<br>            settile.frame=CGRectMake(0, 0, 300/rezon, 300/rezon);<br>}<br>        NSValue *value = [_posAry objectAtIndex:i];<br>CGPoint cp = [value CGPointValue];<br>        settile.position=cp;<br>[_mylayer addSublayer:settile];<br>}<br>}<br><br><br><br>それでは、tile を Tap したらそれを表示するようにしましょう。<br><br>viewDidLoad　メソッドに one Tile を表示する layer をつくるコードと TapGestureRecognizer を追加。<br><br>    self.view.userInteractionEnabled = YES;<br>    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView:)];<br>    [self.view addGestureRecognizer:tap];<br><br><br>     CALayer *viewlayer = [CALayer layer];    <br>    viewlayer.frame = CGRectMake(85,315, 150, 150);<br>    viewlayer.backgroundColor = [UIColor clearColor].CGColor;<br>    _viewlayer=viewlayer;<br>    [backgroundLayer addSublayer:viewlayer];<br><br><br>viewlayerを property 宣言<br><br>@property (strong, nonatomic) CALayer *mylayer,*viewlayer;<br><br>@synthesize mylayer=_mylayer,viewlayer=_viewlayer;<br><br><br><font color="#FF1493">TapGesture</font> を考えてみましょう。<br><br>CGPoint pos = [gesture locationInView:self.view];<br><br>pos.y<br><br>if (pos.y&lt;310)<br><br>viewlayer に選択された tile がなかったら tile を表示。<br><br>tile があれば tap された tile と交換。<br><br>if (310&amp;ltpos.y &amp;lt470)<br><br>viewlayer に選択された tile があれば　nil.position に tile を戻す。<br><br>if (pos.y&gt;470)<br><br>toolbar を表示。<br><br>とまあ～こんな感じですかね。<br><br><a href="http://stat.ameba.jp/user_images/20121222/08/oldamebaman/45/bc/p/o0336051812340629000.png"><img src="https://stat.ameba.jp/user_images/20121222/08/oldamebaman/45/bc/p/t02200339_0336051812340629000.png" alt="$tengusa64のブログ-tap" border="0"></a><br><br><br>ところで toolbar はゲーム中はあまり必要ないですよね。最初だけ表示してここに toolbar がありますよ、ということで viewlayerに tile が選択されたら隠すようにします。しかし、呼び出しも必要ですね。それと、いま self.view に <font color="#FF1493">TapGesture を設定</font>しました。それによって <font color="#FF1493">toolbar のボタンがきかなくなる</font>んですね。そこで toolbar が呼ばれたら一時的に TapGesture 認識を cansel します。<br><br>@property (strong, nonatomic) UIToolbar *toolbar;<br>@property (assign, nonatomic) BOOL tapOff;<br>@property (assign, nonatomic) CGPoint nilPos;//取り出したtile.position<br><br>@synthesize toolbar=_toolbar;<br>@synthesize tapOff=_tapOff;<br>@synthesize nilPos=_nilPos;<br><br><br>viewDidLoad に toolbar を呼び出す layer を追加します。<br><br>CALayer *toollayer = [CALayer layer];<br>    toollayer.frame = CGRectMake(0,470, 320, 10);<br>    toollayer.backgroundColor = [UIColor grayColor].CGColor;<br>    [backgroundLayer addSublayer:toollayer];<br><br>-(void)setToolbar に<br> _toolbar=toolBar;// これを追加。<br><br><br>- (void)tapView:(UITapGestureRecognizer*)gesture {<br>    <br>    CGPoint pos = [gesture locationInView:self.view];<br>    CALayer* tile =[self.view.layer hitTest:pos];<br>    <br>    <br>    int rezon=_intval;<br>    float wide=300/rezon;<br>    <br>    if (_tapOff) {<br>        gesture.cancelsTouchesInView = NO;<br>    }<br>    <br>    if (pos.x&lt;10 ||pos.x&gt;310||pos.y&lt;10) {<br>return;<br>}<br>    if (pos.y&gt;=470) {<br>        _toolbar.hidden=NO;<br>        _tapOff=YES;<br>        return;<br>    }<br>    if (pos.y&gt;=310) {<br>        [self changeTile];<br>        return;<br>    }<br>//nil.position ではなにもしない<br>    if ((pos.x&gt;(_nilPos.x-wide/2))&amp;&amp;(pos.x&lt;(_nilPos.x+wide/2))&amp;&amp;(pos.y&gt;(_nilPos.y-wide/2))&amp;&amp;(pos.y&lt;(_nilPos.y+wide/2))) {<br>            return;<br>    }<br>     <br>    <br>    if (_thetile) {<br>        _toolbar.hidden=YES;<br>        _tapOff=NO;<br>        _thetile.frame= tile.frame;<br>        CGPoint tilepoint=tile.position;<br>        _thetile.position=tilepoint;<br>        <br>        _thetile=tile;<br>        <br>       <br>        int tilex=(pos.x)/wide;<br>        int tiley=(pos.y)/wide;<br>        int index=tiley*rezon+tilex;<br>               <br>        [_stateAry exchangeObjectAtIndex:index withObjectAtIndex:_index];<br>        <br>        _thetile.frame = CGRectMake(85,315, 150, 150);<br>        _thetile.position=CGPointMake(150.0, 380.0);<br>        _viewlayer.contents=_thetile.contents;<br>    }else{<br>        _toolbar.hidden=YES;<br>        _tapOff=NO;<br>        <br>        _thetile = tile;<br>        _nilPos=tile.position;<br>       <br>        int tilex=(pos.x)/wide;<br>        int tiley=(pos.y)/wide;<br>        int index=tiley*rezon+tilex;<br>        _index=index;<br>        <br>        _thetile.frame = CGRectMake(85,315, 150, 150);<br>        _thetile.position=CGPointMake(150.0, 380.0);<br>        _viewlayer.contents=_thetile.contents;<br>    }<br>}<br>-(void)changeTile{<br>    <br>    if (_thetile) {<br>        CGRect r = CGRectMake(0, 0, 300/_intval, 300/_intval);<br>        _thetile.frame=r;<br>        _thetile.position=_nilPos;<br>        _nilPos=CGPointMake(0.0, 0.0);<br>        _thetile=nil;<br>        _viewlayer.contents=nil;<br>    }<br>    <br>}<br><br><br>ここまでできたら「Run」。<br><br>tap で　下の view へ移動、入れ替わり、toolbar OK ですね.<br><br>次回は Pan Gesture を取り扱います。
]]>
</description>
<link>https://ameblo.jp/oldamebaman/entry-11434338921.html</link>
<pubDate>Tue, 25 Dec 2012 04:21:39 +0900</pubDate>
</item>
</channel>
</rss>
