<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>目の前にある箱</title>
<link>https://ameblo.jp/startappdev/</link>
<atom:link href="https://rssblog.ameba.jp/startappdev/rss20.xml" rel="self" type="application/rss+xml" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<description>アプリ開発で１円でも稼ぐことを目指すブログ当面はSwift3の学習と、iOS SDKの演習を報告します</description>
<language>ja</language>
<item>
<title>iOS11の電卓アプリに勇気をもらう</title>
<description>
<![CDATA[ <p>今年も残り２ヶ月を切ってしまいました。</p><p>ATMでお金をおろすたびに冷や汗が出る思いです<img alt="チーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/045.png" width="24"></p><p>&nbsp;</p><p>そこでぼちぼちヤフオクで出品しはじめました。</p><p>これで少しは延命できればいいのですが…<img alt="＄" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/336.png" width="24"></p><p>ヤフオクも結構手間を食いますね。</p><p>写真を撮ったり、文言を考えたり、価格設定に悩んだり。</p><p>今は発送作業に追われるのも困るので、</p><p>”<span style="font-weight:bold;">落札されたらラッキー</span>”くらいの少し強気の価格にしてみました。</p><p>&nbsp;</p><p>このブログは匿名にしておきたいので、</p><p>今やっていることを具体的に書きにくいのですが、</p><p>最近はプログラムの構造よりも、アプリの仕様について悩む事が増えました<img alt="ショボーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/033.png" width="24"></p><p>どう表示するか、どう操作してもらうか、</p><p>どうしたら説明書なしでも理解してもらえるか、</p><p>そういう事が決まらないとプログラミングも暗礁に乗り上げてしまいます。</p><p>&nbsp;</p><p><span style="font-weight:bold;">iOS11の電卓の不具合</span>は、</p><p>アニメーション効果がユーザーのアクションを阻害したために起きたのだそうです。</p><p>応急処置として、アニメーション効果が無効化されました。</p><p>&nbsp;</p><p>”Appleで働く人でもこういうミスをするんだ”という事や、</p><p>”こういうミスが誰にも発見されないままリリースされるんだ”という事、</p><p>”気付いていたけど間に合わないから黙っていたのかもしれない”という事、</p><p>をふと考えます。そして、</p><p><span style="font-size:1.4em;"><span style="font-weight:bold;">完璧じゃなくていい</span></span>のだ、</p><p><span style="font-size:1.4em;"><span style="font-weight:bold;">不具合があったらアップデートすればいい</span></span>のだ、</p><p>という事に気付かせてくれます。</p><p>&nbsp;</p>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12325686823.html</link>
<pubDate>Sun, 05 Nov 2017 05:08:35 +0900</pubDate>
</item>
<item>
<title>とことんCAMediaTiming</title>
<description>
<![CDATA[ <p>何事もなかったように、しれっと更新<img alt="もぐもぐ" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/034.png" width="24"></p><p>&nbsp;</p><p>現在はCALayerに取り組んでいます。</p><p><a href="https://ameblo.jp/startappdev/entry-12307145441.html">以前UIViewの回転で手を焼いた部分</a>も、</p><p>CoreAnimationを使えばシンプルに書くことができそうです。</p><p>&nbsp;</p><p>今回ハマったのは、アニメーションのタイミングを操作する</p><p>CAMediaTimingプロトコルの、speed と&nbsp;beginTime、timeOffset の関係です。</p><p>&nbsp;</p><p>普通、例えばタップイベントでspeedを2.0にしてやればそこから倍速に、</p><p>0.0にすれば止まってくれそうな気がしますが、実際はそうはいきません<img alt="ゲッソリ" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/041.png" width="24"></p><p>&nbsp;</p><p>事のはじまりは、アニメーションの一時停止と再開でした。</p><p>Appleのドキュメントに次のコード（のObjective-C版）が載っています。</p><pre style="font-size:small; background:#fec;">func pauseLayer(_ layer: CALayer) {        let pauseTime = layer.convertTime(CACurrentMediaTime(), from: nil)        layer.speed = 0.0        layer.timeOffset = pauseTime}func resumeLayer(_ layer: CALayer) {        let pauseTime = layer.timeOffset        layer.speed = 1.0        layer.timeOffset = 0.0        layer.beginTime = 0.0        layer.beginTime = layer.convertTime(CACurrentMediaTime(),from: nil) - pauseTime}</pre><p>これが読めなかったのです。何をやっているんだ？と<img alt="ポーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/040.png" width="24"></p><p>特に最後のbeginTimeはなぜ一度0.0を入れているのか、と。</p><p>&nbsp;</p><p>ようやくわかったので、忘れないように図にしてみました。</p><p>渾身のタイムチャートです<img alt="グー" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/116.png" width="24"></p><p>まずspeed属性の概念から。</p><p><a href="https://stat.ameba.jp/user_images/20171016/04/startappdev/2d/43/p/o0878036114049747178.png"><img alt="" height="255" src="https://stat.ameba.jp/user_images/20171016/04/startappdev/2d/43/p/o0878036114049747178.png" width="620"></a></p><p>speedを指定するとそこから先だけでなく、そこまでの時間軸も全て変わります。</p><p>例えば0.0にすると、時間軸の最初から永遠に0なので、初期状態のままになります。</p><p>2.0にすると開始時間も半分に早まり、0.5にすると2倍先まで待たされます。</p><p><span style="font-weight:bold;"><span style="color:#7fd7ff;">ParentTime</span></span>はとても大きい数字になりうるので、実際には動かないも同然です。</p><p>&nbsp;</p><p>そこで、beginTimeやtimeOffsetを使ってこの時間軸をずらします。</p><p><a href="https://stat.ameba.jp/user_images/20171016/04/startappdev/08/60/p/o0983060514049747179.png"><img alt="" height="382" src="https://stat.ameba.jp/user_images/20171016/04/startappdev/08/60/p/o0983060514049747179.png" width="620"></a></p><p>beginTimeは<span style="color:#00afff;">親要素の時間軸</span>に則って与えられる数値です。</p><p>つまりspeed属性の影響を受けません。</p><p>一方&nbsp;timeOffsetは、<span style="color:#ff00ff;">speed属性を反映した時間軸</span>を操作します。</p><p>正数の場合、beginTimeは先延ばし、timeOffsetはたぐり寄せる側にずれます。</p><p>convert<wbr>Time(_:<wbr>from:)は、それぞれの時間を渡し合う変換器です。</p><p>&nbsp;</p><p>ここで、あらためて一時停止と再開の仕組みを見てみます。</p><p><a href="https://stat.ameba.jp/user_images/20171016/06/startappdev/ab/7a/p/o0897063214049759497.png"><img alt="" height="437" src="https://stat.ameba.jp/user_images/20171016/06/startappdev/ab/7a/p/o0897063214049759497.png" width="620"></a></p><p>(a)はspeedのみで操作した場合です。アニメーションは止まりますが、</p><p>時間軸はゼロ…つまり初期状態に戻ってしまい、一時停止と言えません。</p><p>(b)はtimeOffsetを使って<span style="font-weight:bold;">24を初期状態にする</span>ことで一時停止らしくなりましたが、</p><p>再開しようとすると、終了点が過去になるので、たちまち完了してしまいます。</p><p>(c)は再開時にtimeOffsetを元に戻すことで再びアニメーションが動き出しますが、</p><p>一時停止していなかったかのように元の時間軸で完了してしまいます。</p><p>&nbsp;</p><p>(d)は再開時にtimeOffsetを元に戻し、さらにbeginTimeを使って、</p><p><span style="font-weight:bold;">一時停止していたぶん</span>だけ時間軸を遅らせます。これがサンプルコードの動きです。</p><p>&nbsp;</p><p><span style="background-color:#ffdfbf;">&nbsp;beginTime = 0.0&nbsp;</span>としていたのは、<span style="font-weight:bold;">一時停止していたぶん</span>を知るために、</p><p><span style="font-weight:bold;">一時停止しなかった場合の時間(p)</span>を得るためです。</p><p>&nbsp;</p><p>&nbsp;</p><p>理解はできましたが、結構わかりにくい仕組みです<img alt="ショボーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/033.png" width="24"></p><p>ムービー編集ソフトのような親切なインタフェースではありませんね<img alt="汗" draggable="false" height="16" src="https://stat100.ameba.jp/blog/ucs/img/char/char2/028.gif" width="16"></p>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12319923113.html</link>
<pubDate>Mon, 16 Oct 2017 05:37:52 +0900</pubDate>
</item>
<item>
<title>LivePhotosって？</title>
<description>
<![CDATA[ <p>まだAppleのサンプルプログラム「AVCam」を見ています。</p><p>エラー回避のための安全策が大半を占めますが、</p><p>その次くらいに多いのがLivePhotoというキーワードです。</p><p>&nbsp;</p><p>私の実機はiPhone<span style="font-weight:bold;">6</span>なので、LivePhotoが何なのかしばらくわかりませんでした。</p><p>6s以降の静止画撮影はLivePhotoモードがデフォルト設定なんですね<img alt="びっくり" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/031.png" width="24"></p><p>&nbsp;</p><p>どちみち、うちには動作環境がなく、確認のしようもないので、</p><p>LivePhoto関連は削ってみようと思います。</p><p>そうすると静止画撮影に関しては、</p><p>AVCapturePhotoCaptureDelegateの実装ということになり、</p><p>書籍のサンプルプログラムと大差ない規模に近づきます。</p><p>&nbsp;</p><p>残りは動画モードで、これがちょっと難解です<img alt="汗" draggable="false" height="16" src="https://stat100.ameba.jp/blog/ucs/img/char/char2/028.gif" width="16"></p><p>マルチスレッドを使っているのは、ユーザーの操作感の向上のためで、</p><p>状態の取得や設定の変更が完了するまでの間、</p><p>画面が止まったり真っ暗になったりしないようにする、</p><p>「待たされている」という印象をユーザーに与えないようにする、</p><p>という工夫だと思われます。</p><p>&nbsp;</p><p>なのでこのテクニックも、無くてはならないわけではないようです。</p><p>（実際、プロセッサが非力なデジタルカメラでは結構モタつきますしね<img alt="カメラ" draggable="false" height="16" src="https://stat100.ameba.jp/blog/ucs/img/char/char2/111.gif" width="16">）</p><p>ただ、コードを眺めているとパターンが何となく見えてきます。</p><p>ビューやコントロール部品はメインスレッドからアクセスして、</p><p>入力にしろ出力にしろ、何かしらのデバイスを相手にする時は</p><p>別スレッドのシリアルキューに投げ込まれています。</p><p>&nbsp;</p><p>カメラアプリは、カメラユニットから入力して、ストレージに出力しますから、</p><p>ほぼすべての処理が別スレッドになっています。</p><p>それでコードが複雑に見えるのでしょう<img alt="ショボーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/033.png" width="24"></p>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12314613950.html</link>
<pubDate>Thu, 28 Sep 2017 04:55:50 +0900</pubDate>
</item>
<item>
<title>AVFoundationとマルチスレッド</title>
<description>
<![CDATA[ <p>ここ数日はAVFoundationを使ったカメラアプリを勉強中です。</p><p>書籍に載っていたサンプルプログラムでも動くのですが、</p><p>理屈もわかっておきたいので、</p><p>Appleのサンプルプログラム「AVCam」の解読に取り組んでいます。</p><p>&nbsp;</p><p>AVCamの方は、とにかくエラー処理（回避）に重点を置いていて、</p><p>そこでスレッド処理がふんだんに応用されています。</p><p>DispatchQueueはObjective-C時代にちょっとかじった記憶はあるのですが、</p><p>いまだ直感的に理解することができません<img alt="ショボーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/033.png" width="24"></p><p>&nbsp;</p><p><br>ちなみに、写真品質の画像をキャプチャすると（つまり写真を撮ると）、</p><p>設定しなくても勝手にシャッター音が鳴ります。</p><p>最初それを知らずに、自分もAudioToolboxでシャッター音を鳴らしていたので、</p><p>その挙動に悩んでしまいました。</p><p>&nbsp;</p><p>今さらカメラアプリかよという感じですが、まぁ一番ポピュラーなので<img alt="もぐもぐ" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/034.png" width="24"></p><p>それとサウンドツールと、ジョークアプリみたいなものの３つに絞りました。</p><p>&nbsp;</p><p>&nbsp;</p><p>今日はちょっと必要があって久しぶりにPerlでスクリプトを書いたのですが、</p><p>もう感覚が全然違っていて、</p><p>文尾のセミコロンや、if文の条件式の括弧などでエラーを連発しました。</p><p>Swiftの感覚まで狂うのが怖いので、今はPerlに触れたくないです<img alt="汗" draggable="false" height="16" src="https://stat100.ameba.jp/blog/ucs/img/char/char2/028.gif" width="16"></p><p>&nbsp;</p>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12313630778.html</link>
<pubDate>Sun, 24 Sep 2017 19:58:04 +0900</pubDate>
</item>
<item>
<title>眠い眠い眠い</title>
<description>
<![CDATA[ <p>猛烈に眠くて困っています<img alt="ぐぅぐぅ" draggable="false" height="16" src="https://stat100.ameba.jp/blog/ucs/img/char/char2/030.gif" width="16"></p><p>&nbsp;</p><p>とりあえずこんなものをアップしてみます。</p><p>&nbsp;</p><p><iframe allowfullscreen frameborder="0" height="234" src="https://www.youtube.com/embed/Hl4GzZimLbs?rel=0" width="416"></iframe></p><p>&nbsp;</p><p>WAV生成関数に手を加えて、波形とエンベロープを選べるようにしました。</p><p>ステレオというのは、デチューン効果です。透明感のある音になります。</p><p>ノイズはホワイトノイズを合成します。</p><p>正弦波はもっともマイルドな音色なので、マイクで拾いづらいです。</p><p>&nbsp;</p><p>シンセサイザーアプリを作るわけではありません。</p><p>波形編集ソフトを持っていないので、これで自前のサウンドファイルを作って、</p><p>操作音に使います。</p><p>&nbsp;</p><p>こんなところに凝る必要はまったく無いのですが、</p><p>インタラクティブに作れたらいいなと思って。</p><p>こんなふうに寄り道してしまうのが私の悪い癖です。</p><p>私の人生を象徴しています…<img alt="ショボーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/033.png" width="24"></p><p>試験勉強をするために部屋の片付けから始める、というやつです。</p><p>&nbsp;</p><p>それにしても眠いです<img alt="ガーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/101.png" width="24"></p>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12312288837.html</link>
<pubDate>Wed, 20 Sep 2017 01:58:26 +0900</pubDate>
</item>
<item>
<title>ブログを始めて１ヶ月…</title>
<description>
<![CDATA[ <p>ほとんど進捗していない現状に唖然…<img alt="滝汗" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/039.png" width="24"></p><p>最近ちょっと意気消沈しているように感じます。ストレスもたまっているかも。</p><p>８月は寝る間も惜しいほど面白かったのですが…。</p><p>&nbsp;</p><p>&nbsp;</p><p>ここ数日は、オーディオファイルを生成する関数を、</p><p>より汎用性のあるものに書き換えています。</p><p>すると、8bitオーディオでは表面化しなかった”エンディアン問題”が出てきました。</p><p>”問題”というか”面倒”ですけども。</p><p>&nbsp;</p><p>最初はAppleにちなんでAIFFを選びましたが、</p><p>今のApple製品はすっかりインテル系なので、</p><p>２バイト以上の数値はいちいち並べかえなければなりません。</p><p>それをSwiftの仕組みの中でやるのがまたまわりくどいのいです<img alt="汗" draggable="false" height="16" src="//stat100.ameba.jp/blog/ucs/img/char/char2/028.gif" width="16"></p><p>&nbsp;</p><p>無駄な処理をするのは気持ちが悪いので、いっそこだわりは捨てて、</p><p>WAV（RIFF）で新たに関数を作っています。</p><p>そうすると、懸案となっていたFloat80型も必要ないのです。一石二鳥<img alt="ニコニコ" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/024.png" width="24"></p><p>&nbsp;</p><p>ちなみにOSXの通知音は今でもAIFFです。伝統なんでしょうね。</p><p>&nbsp;</p><p>&nbsp;</p><p>週末は天気が悪いようなので、</p><p>また引きこもってモチベーションを高めたいです。</p>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12311125862.html</link>
<pubDate>Fri, 15 Sep 2017 23:24:10 +0900</pubDate>
</item>
<item>
<title>リニアPCMを生成して鳴らす</title>
<description>
<![CDATA[ <p>今回も疲れました<img alt="汗" draggable="false" height="16" src="//stat100.ameba.jp/blog/ucs/img/char/char2/028.gif" width="16"></p><p>サウンドポートを直接叩く方法がわからないので、</p><p>（というか、おそらく許可されていないと思うので）</p><p>任意の周波数でAIFFファイルを生成する関数を作り、</p><p>システムサウンドに登録して再生させるようにしました。</p><p>&nbsp;</p><p><iframe allowfullscreen frameborder="0" height="234" src="https://www.youtube.com/embed/9Vgc7uQ4p2Q?rel=0" width="416"></iframe></p><p>&nbsp;</p><p>懐かしいPSGのビープ音<img alt="ラブ" draggable="false" height="24" src="//stat100.ameba.jp/blog/ucs/img/char/char3/026.png" width="24"></p><p>ビットレートはとりあえずモノラル／8bit／48kHzに固定しています。</p><p>サンプリング周波数をケチるとデューティ比が一定しないので、</p><p>矩形波でも音が濁るんです。</p><p>&nbsp;</p><p>苦労したのは、やはりSwiftのポインタ型の理解で、</p><p>C言語ライクにメモリを操作できるようになるまでがなかなか大変でした。</p><p>&nbsp;</p><p>それからAIFFの規格には、サンプリングレートの指定に</p><p>「拡張倍精度浮動小数点」という80ビットのデータ型が出てくるのですが、</p><p>そのFloat80型がSimulatorでは動いたのに、実機ではエラーになるんです<img alt="ショボーン" draggable="false" height="24" src="//stat100.ameba.jp/blog/ucs/img/char/char3/033.png" width="24"></p><p>どうやらiOSではサポートされていないらしく、</p><p>その部分の10バイトは決め打ちとなりました。</p><p>&nbsp;</p><p>Swiftの仕様にも今回は特にストレスを感じました<img alt="ゲッソリ" draggable="false" height="24" src="//stat100.ameba.jp/blog/ucs/img/char/char3/041.png" width="24"></p><p>・ベキ乗の書き方（x^8とか、x**8などと書けない）</p><p>・for文の逆回しの書き方（レンジを7...0などと書けない）</p><p>・文字の抜き出し方（抜き出すのが2文字以上になると途端にコードが増える）</p><p>&nbsp;</p><p>伝統的な構文をたくさん変革したくせに、そのわりには気が利かないというか…。</p><p>&nbsp;</p>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12310293497.html</link>
<pubDate>Wed, 13 Sep 2017 03:25:33 +0900</pubDate>
</item>
<item>
<title>AudioServicesPlaySystemSoundは非推奨に</title>
<description>
<![CDATA[ <p>AudioToolboxのヘッダファイル&nbsp;AudioServices.hを見ていたら、</p><p>前回使ったAudioServicesPlaySystemSoundや、</p><p>AudioServicesAddSystemSoundCompletionは将来、非推奨となるそうです。</p><p>&nbsp;</p><p>代わりに&nbsp;AudioServicesPlaySystemSoundWithCompletionを使うように、</p><p>とあります。</p><p>&nbsp;</p><p>早速書き換えてみると、なんと、いとも簡単…<img alt="ポーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/040.png" width="24"></p><pre audioservicesplaysystemsoundwithcompletion="" style="background-color:#fec">　　　　AudioServicesPlaySystemSoundWithCompletion(1108, myCompletionBlock)　　}　　func myCompletionBlock() {　　　　print("in completion")　　}}</pre><p>”こうならいいのに”という望みが叶えられていました。</p><p>あのドツボは何だったのか<img alt="もやもや" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/102.png" width="24"></p><p>&nbsp;</p><p>サウンドの再生に成功しても失敗しても、処理を終えると呼んでくれるようです。</p><p>不要なら nilを指定できます。</p><p>&nbsp;</p><p>&nbsp;</p><p>どうも回り道が多いというか、道草が多いというか、</p><p>今週末でSwift歴１ヶ月になりますが、このペースではちょっとまずいです…。</p>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12309656620.html</link>
<pubDate>Mon, 11 Sep 2017 01:28:28 +0900</pubDate>
</item>
<item>
<title>AudioToolboxとコールバック</title>
<description>
<![CDATA[ <p>CoreAudioの中の、AudioToolboxに取り組んでいます。</p><p>システムサウンド自体は１行で鳴らせます。※マナーモードは解除</p><pre style="background:#fec;">　AudioServicesPlaySystemSound(1108)　// シャッター音</pre><p>鳴らし終えたときに呼ばれるコールバック関数を</p><p>AudioServicesAddSystemSoundCompletiondeで登録しようとして、</p><p>つまづきました<img alt="ショボーン" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/033.png" width="24"></p><p>&nbsp;</p><p>C言語のように、関数名がその関数へのポインタを表すのは Swiftも同じですが、</p><p>ここにはグローバル関数を指定しなければいけませんでした。</p><pre style="font-size:small; background:#fec;">private func <span style="color:#ff0000;">myCompletionCallback</span>(ssID: SystemSoundID, clientData: UnsafeMutableRawPointer?) {    print("didPlay")}class ViewController: UIViewController {　　　　︙        AudioServicesAddSystemSoundCompletion(ssID, nil, nil, <span style="color:#ff0000;">myCompletionCallback</span>, nil)        AudioServicesPlaySystemSound(ssID)</pre><p>AudioToolboxはC言語で実装された非同期の処理で、メンバー関数だと</p><p>鳴り終えた時のコールバック先が有効だという保証がない、という事ですかね。</p><p>Swiftの中だけならARCが効くので、メンバー関数を渡すこともできます。</p><p>&nbsp;</p><p>これに気付くのに１日かかりました<img alt="滝汗" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/039.png" width="24"></p><p>「Swiftではポインタの書き方が違うのかも」と勘違いしてしまったからです。</p><p>&nbsp;</p><p>&nbsp;</p><p>ちなみにクロージャだとこうです。</p><div><pre style="font-size:small; background:#fec;">　　　　AudioServicesAddSystemSoundCompletion(ssID, nil, nil, <span style="color:#ff0000;">myCompletionCallback</span>, nil)        AudioServicesPlaySystemSound(ssID)　　}　　let <span style="color:#ff0000;">myCompletionCallback</span>: @convention(c) (SystemSoundID, UnsafeMutableRawPointer?) -&gt; Void  　= {(ssID, clientData) in　　　　print("didPlay")　　}</pre><p>クロージャは、渡してしまえばあとはお好きにどうぞという事でしょうか。</p><p>AudioServicesAddSystemSoundCompletionの定義には、</p><p>@escapingというディレクティブが付いています。</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>しかし、とんだ回り道をしたおかげで、</p><p>Swiftのポインタについて調べるきっかけとなりました。</p><p>…とでも思わなければやっていられません<img alt="もぐもぐ" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/034.png" width="24"></p><p>&nbsp;</p><p>Swiftでは、C言語のポインタ関係のテクニックに、いちいち名前が付いています。</p><p>例えば 「void *」は、UnsafeMutableRawPointerというそうです<img alt="びっくり" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/031.png" width="24"></p><p>プロレスの大技みたいですね<img alt="炎" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/110.png" width="24"><img alt="筋肉" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/372.png" width="24"></p><p>上の例だとさらに、Optional&nbsp;UnsafeMutableRawPointerですか。</p><p>&nbsp;</p><p>疲れます<img alt="汗" draggable="false" height="16" src="https://stat100.ameba.jp/blog/ucs/img/char/char2/028.gif" width="16"></p><p>&nbsp;</p><p>&nbsp;</p></div>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12309345027.html</link>
<pubDate>Sun, 10 Sep 2017 15:58:15 +0900</pubDate>
</item>
<item>
<title>UIImageからSKSpriteNodeを生成する</title>
<description>
<![CDATA[ <p>私はドローソフトを持っていないので、</p><p>画像ファイルを用意しなくても、任意のサイズ・色・名前のスプライトを</p><p>表示できるようにしました。</p><p>&nbsp;</p><p><iframe allowfullscreen frameborder="0" height="234" src="https://www.youtube.com/embed/yp5ROjoGMoI?rel=0" width="416"></iframe></p><p>&nbsp;</p><p>実際には、任意のUIImageを生成する関数を作って、</p><p>そのUIImageでSKTextureを用意し、SKSpriteNodeを初期化しています。</p><p>SK<span style="font-weight:bold;">Shape</span>Nodeでない証拠に、SKActionの&nbsp;scale(to:duration:)が効いています。</p><p>&nbsp;</p><p>スプライトを動的に作ると、</p><p>プレイヤーが自機を細かくカスタマイズできるというメリットもありそうです。</p><p>（私はまだまだゲームは作りませんけどね<img alt="もぐもぐ" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/034.png" width="24">）</p><p>&nbsp;</p><p>&nbsp;</p><p>ここではランダムに生成しているので、</p><p>偶然にFTPとかDIYとかJBLとか出てくるとフフッとなります<img alt="ニヤニヤ" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/037.png" width="24">（暗い…<img alt="汗" draggable="false" height="16" src="https://stat100.ameba.jp/blog/ucs/img/char/char2/028.gif" width="16">）</p><p>&nbsp;</p><p>見ているとスプライトにもひかえめな奴とずうずうしい奴がいて面白いです<img alt="地球" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/365.png" width="24"></p><p>小さいけどしぶとい奴とか、大きいのにすぐ飛んでっちまう奴とか。</p><p>そしてどれもいつかは必ず消えてしまいます<img alt="十字架" draggable="false" height="24" src="https://stat100.ameba.jp/blog/ucs/img/char/char3/132.png" width="24"></p><p>&nbsp;</p><p>&nbsp;</p><p><span style="color:#bfbfbf;">NHKｷﾀ━━━━━━!!</span></p>
]]>
</description>
<link>https://ameblo.jp/startappdev/entry-12309208701.html</link>
<pubDate>Sat, 09 Sep 2017 18:24:11 +0900</pubDate>
</item>
</channel>
</rss>
