せでぃのブログ

ブログ初心者おいどんのどうでもいい愚痴やどうでもいい愚痴やどうでもいいマメ知識などを披露するチラシの裏です。

CGRectContainsPointでタッチ位置を取得して、setNeedsDisplayInRectで再描画

20150419修正:githubのコードをCALayerを使わないように修正しました。
 方眼紙のタッチした箇所の色が変わるという単純なアプリを作ってみた。
 drawRectベースの非常に泥臭い低レイヤのコードで、一度は完成の目を見たんですが、githubの操作ミスでデータ消えたorz 本当はxcode7.0あたりから出たフレームワークと比較したかったんだけど、動いたら思ったより嬉しかったので上げちゃった的な。で、消しちゃった的な。
f:id:Sediment:20140913030546p:plain


 CGRectの初歩はこの辺のコードを参考にしました。
Objective-C (iOS): 図形を描画 | snippets.feb19.jp
 非常に泥臭い書き方なので、うまい方法があったら教えてくれめんす。あとで上げるからちょっと待って。もう限界。
 当たり判定を含めてこの辺をフレームワークで作ることができれば、ライフゲームや将棋、トランプ、まるばつゲームなどテーブルゲーム全般に応用が利くのかなぁと。AI? 作り手より頭良い子なんてできませんがな。
当たり判定 - せでぃのブログ


 ほい、上げた。
csny/cgrect at 2view · GitHub

適当解説

 結果、あまり挙動は変わらなかったが、動く部分を別viewにして背景色を透過させた。色塗り部分はあらかじめ初期化した配列入りのフラグに応じて、透明または緑に塗るようにしてある。

BOOL isGreen[7][10]; // 方眼のタッチ有無を格納する配列
//〜略〜
- (void)drawRect:(CGRect)rect
{
//〜略〜
// フラグに応じて矩形を描画、イベントで一部再読み込みされる
    for(int i=0;i<7;i++){
        for(int j=0;j<10;j++){
            if(isGreen[i][j]==YES){
                CGContextSetFillColor(context, green); // 色指定
                CGContextFillRect(context, CGRectMake(i*50,j*50,50,50)); // 範囲塗りつぶし
            }else{
                CGContextSetFillColor(context, white);
                CGContextFillRect(context, CGRectMake(i*50,j*50,50,50));
            }
            
        }
    }
//〜略〜
}

 タッチイベントによって、タッチ位置の方眼ごとにフラグを変更し、範囲を指定して再描画する。とまぁこんな感じでいかがでしょ?

// タッチイベント
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // タッチ位置を点で取得
    CGPoint pt = [[touches anyObject] locationInView:self];
    for(int i=0;i<7;i++){
        for(int j=0;j<10;j++){
            // タッチ位置と方眼位置を比較
            if (CGRectContainsPoint(CGRectMake(i*50,j*50,50,50),pt)) {
                if(isGreen[i][j]==NO){
                    isGreen[i][j]=YES;
                }else{
                    isGreen[i][j]=NO;
                }
                // 範囲を限定してCGRectを再読み込・再描画
                [self setNeedsDisplayInRect:CGRectMake(i*50,j*50,50,50)];
            }
        }
    }
}


 以前やった画像の当たり判定とは違って、方眼自体はグリッドで別れて見えるもののオブジェクトではないので、悩みました。描画するだけのコードから、一部にタッチイベントを追記したverなど、徐々に機能を増やしていった。
csny/cgrect at touchresponse · GitHub
csny/cgrect at lifegame1st · GitHub