頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


アナと雪の女王アプリがすごい

映画「アナと雪の女王」は息子が興味を持たず(まあ小一じゃ仕方ない)見に行けなかったんだけど、アプリの方「Free Fall」をしてるのよ。ゲームはほとんどしないんだけど、はまってる。このゲームがいろいろとすごいので感心してる。

一番うまいな、と思うのはこのゲームがライフ制になっててクリア失敗するとライフを失う。このライフが足りないとゲーム自体ができない。ライフを買うか時間が経つのを待つかのどちらか。
ゲームにお金を一切払わない俺なんかは当然一日に数回しかしないわけだけど、これがいい具合に飽きさせないんだろうね。

そしてゲームバランスが恐ろしく絶妙。こういう落ちゲーを作ろうとすると難易度が難し過ぎるとやる気がなくなるけど、苦しい、、、と思いつつもやってると数日でクリアできたりするんだ。
難易度をうまく設定しているんだろうな。人間が感覚的に調整してるんじゃなくて機械的か数学的に扱ってるんだろうな、ってくらい絶妙。

ところでこのゲームはただの映画の宣伝だろ?って思っていたんだけど、決してそう思わせないほどの完成度の高さ。それでいて映画を見た人にはさらに楽しめるんだろうな、とは思うんだけど見てない俺にはゲームに登場するキャラがどこの誰かも知らないんだけどね。

少し前のバージョンではゲームのクリア判定にバグがあってクリアしてるはずなのに「残念」とか出る、なんてことがあって「おめえが残念だよっ!」ってアプリに毒吐いてたことが何度もあったけど、現在の最新版ではその不具合は経験していないな。

残念なのは若干画面が小さいのか操作ミスで動かすのそれじゃねえよ!って時があることかな。iPadでやればよかったな。

とりあえず無課金でどこまで行けるかやってみるわ。今はステージ112。

Free Fallスクリーンショット

↑この雪だるまみたいなのオラフって言うみたいだけど、動きがカワイイ。
この上部に表示されてるキャラは3D的に動くという凝りよう。クリアすると拍手してくれたり、ダメだと悲しがったりする。うーん、すごいなあ。
スポンサーサイト






UIImageを縮小するとCGImageGetBytesPerRowの値が変?

UIImageオブジェクトの画像を縮小させたかったのよ。単に表示を小さくするんじゃなくてホントに縮小ね。
方法はだいたいこんな感じ。
{
    UIGraphicsBeginImageContext(CGSizeMake(width, height));
    [image drawInRect:CGRectMake(0, 0, width, height)];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}
UIImageを縮小
↑ここまではいいんだけどさ。

縮小した画像の一ピクセルのRGBAの各値はどうよ?とかそういうのを見たかったのでCGImageRefあたりのを使って調べてみたんだ。
CGImageRef cgImage = image.CGImage;
って関係ね。これを使って例えば横幅なら
CGImageGetWidth(cgImage);
で得ることができるんだわ。

こういうことをやっててはまったのが、
CGImageGetBytesPerRow(cgImage);
で得られる一行あたりのバイト数。リサイズした後の画像サイズ(ピクセル)は意図通りなのに上の値がその幅x4(通常RGBA各unsinged charの一バイトx4で4バイト)とかじゃないのよ、、、?!

どうもリサイズ時に端数の影響を受けるのか行の終わりにカラのデータが含まれてる。なおリサイズしたUIImageオブジェクトをUIImageViewにして表示させたらその端っこのカラデータ分はちゃんと表示されないんだ。
ちなみに縮小時にあまりが出ない場合だとそういう現象は起きないみたい。


iCloud.comの迷惑メール設定ができない!

Macのメールでえらくはまったのでメモしておくよ。
iPhoneに来るはずのメールが来ない!ってのが発端なんだけど、iPhoneはあまり関係ない。
xxx@icloud.comってAppleのメールアドレスを使っているんだけど、あるところから送信されたメールだけがどういうわけか迷惑メールに分類されちゃうんだわ。

Macのメールアプリ

↑Macにデフォルトで入ってるメールアプリでiCloudのメールも管理できるはずだよね?


迷惑メールではないボタン

↑これは某迷惑メール。ほら右上に「迷惑メールではない」ボタンがあるでしょ。
これがなぜか表示されないんだ。迷惑メールじゃないのに、迷惑メールフォルダーに入ってる?どういうことよ?

迷惑メール切り替えボタン

↑メールアプリのツールバーにあるいいねボタンみたいなところでも切り替えはできるけど、そもそも迷惑メールと認識していないみたいだからここで切り替えてみたもののやっぱりメールは届かなかったんだ。

調べてみるとフィルターを設定できるみたいだから、メールアプリの環境設定/ルールってところで設定してみたのよ。

環境設定/ルール

差出人がどうならこうとかルールを設定したんだ。

ところが、これを設定してもやっぱりメールは届かないんだよ、、、
おかしいなあ。フィルターの前にルールを適用するようにもしてるし、何がまずいんだろう?
試しに他もメールアドレスで試してみると、、、このルール設定がうまくいったんだ。
iCloudメール特有の問題?と思って調べると、、、
普段全然使わないんだけど、icloud.comってサイトがあるじゃない。

iCloud.com

↑これよ。
ここでメールを見るとそのメールはちゃんと迷惑メールとして認識されていたのよ。それを迷惑メールじゃないよ、としてやると無事にメールが届くようになったんだ!
ルールの設定もできるけど、設定するまでもなく、また最初のメールアプリでのルールも削除してる。


ということで、どうやらメールアプリよりもicoud.comサイトでの設定が優先されるみたい。


UIImageを切り抜くのにはまった

画像(UIImageオブジェクト)を切り抜くってのをやろうとしたんだよ。
ざっとネットで調べるとこういう感じでできる、というのを見つけてさ。
{
        UIGraphicsBeginImageContext(rect.size);
        [image drawAtPoint:rect.origin];
        UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
}
ここでrectというのはCGRectね。
そうそう前もこんな感じでやったんだわ、と思って使ったんだけどうまくいかない。なぜか切り出す位置がおかしいんだ。
いろいろと調べてみたところ、どうやらrect.originのx,yともマイナスにしないとだめっぽい。
どういう仕様なんだよ?前にやったのを確認したら、確かにマイナスしてた、、、(覚えておけよ、俺!)

なんだかなあと思って再度調べるとこういう方法が。
{
    CGImageRef srcImageRef = image.CGImage;
    CGImageRef croppedImageRef = CGImageCreateWithImageInRect(srcImageRef, rect);
    UIImage * croppedImage = [UIImage imageWithCGImage: croppedImageRef];
}
こっちの方がいいじゃないっ!なんだ、最近そんなのができたの?!と思ってリファレンスで CGImageCreateWithImageInRect を見ると、、、
Available in iOS 2.0 and later.
ああ、そうですか、相当前からあったのね。

画像をクロップ処理
↑切り抜いてみた例。


タッチされた点から滑らかな曲線を得る

ノート系のアプリとかでiPhone/iPadのスクリーンをツーっとなぞって線を描く、なんてよくあるじゃない。
あれ、普通にUIResponderの

touchesBegan:withEvent:
touchesMoved:withEvent:

辺りを使ってタッチされた点を拾って、その点を直線でつなぐだけだと結構カクカクしちゃうのよ。
この線を滑らかな曲線に見せるためにいろいろなテクニックというかアルゴリズムというかあるみたいでさ。

よし、俺もちょっくら考えてみるかと思って二次のベジェ曲線を使って滑らかな線になるようにしてみたんだけどさ、、、

ベジェ曲線を使った結果1

↑ 余計に不自然になったりしてね。
赤い線上の青い点が拾った点、赤い線はそれをつないだだけ。緑の線は小さい点がベジェ曲線の制御点。補正した曲線は同時に右にずらして表示させてる。
点を拾った時点で前の点と前の制御点から新しい制御点を決めてるんだけど、どうも制御点の位置がおかしい。
こりゃもっと前の点なんかも使って制御点を全て書き換えるとか必要なのかな?とか昼ご飯食べながらどうしたものかといろいろ考えてたんだけど、ふと前に関連する記事を読んだことあったんじゃないかな?って思い出してさ。
もしかしたらとEvernoteを調べたらブックマークしてたじゃないか!

なめらかな線を描く | Cocoaの日々情報局

うーん?最初コードを読んだ時何を意味してるのかよくわからなかったんだけど試しにやってみると、、、

ベジェ曲線を使った結果2

↑おおお!すごいじゃない!
一番右にずらしたのが新しい方法のね。
拾った点は必ず通らせるもんだと俺は考えていたんだけど、この方法はタッチで拾った点同士の中間点を通らせて、拾った点を制御点にして二次のベジェ曲線を描いてる。しかもタッチされた点を間引くこともなく、取得した時点でそこまでのラインがいとも簡単に決定するんだ。コードはシンプルでラインも十分キレイ。これ最初に考えた人、天才だな!




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.