2013年2月27日水曜日

dropbox経由のcore data同期のためのメモ

Core Dataを使う際に、Dropboxをsyncとして使えるとありがたいので、
ライブラリを探していて,以下がよく使われているようだと見えるのでメモ。
http://timisted.github.com/TICoreDataSync/index.html

で、iPhoneのサンプルコードは以下のページ。
http://timisted.github.com/TICoreDataSync/ios-tutorial.html

同等のMacアプリのサンプルコードは以下。
http://timisted.github.com/TICoreDataSync/mac-tutorial.html

リファレンスも充実している。
http://timisted.github.com/TICoreDataSync/reference/html/

iOSとMacのシンクを実現したいと思っていたので、かなり良さそう。
ありがたや。

まずはメモまで。

2013年2月18日月曜日

multi touchによる複数Spriteの動作方法(hashの使い方)メモ

cocos2dでmultiTouchの一つ一つのtouchを見分ける方法を探していた。
そのためには「hash」を使う、ということ。

参考は,以下
http://www.cocos2d-iphone.org/forum/topic/9779

以下のページは、具体的でシンプルなhashの使い方コードを掲載しておられ,大変参考になった。
http://programming-ios.com/cocos2d-multipletouches/

([touch hash]で取得されるのはintなんですね。複数のspriteを個別touchのhashによって動かし分ける、というのが便利です。
このサンプルは二本指用なので、3本以上にするには、もう少し修正が必要だな、と。)


感謝。

本家ドキュメントは以下
http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/multitouch_background/multitouch_background.html#//apple_ref/doc/uid/TP40009541-CH5-SW9

2013年2月16日土曜日

iOSアプリの開発にとても役立つサイト「raywenderlich.com」

このサイト、
http://www.raywenderlich.com/tutorials
iOSアプリのチュートリアルが非常に秀逸であることに気づいた。

色々良い記事が載っている。。
自分が必要なものにリンクを貼っておきます。

drag and dropの実装で、自分のやり方は甘いと感じていたので、以下が参考になりそうだった。
http://www.raywenderlich.com/2343/how-to-drag-and-drop-sprites-with-cocos2d

中級のチュートリアル。
http://www.raywenderlich.com/tutorials#cocos2d-intermed

Box2DとCocos2dのチュートリアル。
http://www.raywenderlich.com/tutorials#physics

Core Dataの使い方等の「saving and loading data」。web serviceとの同期なども。
http://www.raywenderlich.com/tutorials#saving

「Graphics and Animation」。UIKitについてなど。
その中で、ToDoアプリのサンプルが気になった。


typedefとenumについて分かりやすかった解説ページ(「初心者のためのポイント学習C言語」)

typedefについて、良く意味が分かっていなかった。
調べてみると、以下のページが分かりやすかったのでメモ。
http://www9.plala.or.jp/sgwr-t/c/sec16.html

このページ、enumについても理解したかったので、ぴったりな解説があった。
素晴らしい。

Topページは
http://www9.plala.or.jp/sgwr-t/index.html
で、
「初心者のためのポイント学習C言語」というタイトルのサイトでした。

とても分かりやすいので、これから折々に拝読したいと思います。 ::::::::::::::::::::::::::::::: 

あ、この方、著作も出しておられました。 これは、要チェックです。
 
(わかりやすい解説だな~~~!と思ったら、著者の方、女性ですね。)
サイトの記述が、とても分かりやすいので、 この本は、いずれ手に入れたいと思いました。 感謝。

2013年2月15日金曜日

Fruits Ninja的なアプリづくりの記事

fruits ninjaのようなゲームのサンプルコードを3ページにわたって解説しておられる記事があった。
http://www.raywenderlich.com/14302/how-to-make-a-game-like-fruit-ninja-with-box2d-and-cocos2d-part-1

かなり勉強になる。

physicsEditorを使って、Spriteに頂点を振ってゆき、
範囲を作って、BOX2Dで制御。

PRKitというライブラリを使って、ポリゴンでSpriteをカットする部分を制御。

いろいろ、とても勉強になる。

ちょくちょく記事とソースを読んで、勉強しましょう自分、ということでメモでした。

:::::::::::::::::::::::::::::::
追記

PRKitは、上記記事だとcocos2d 1.x系に対応していて、2.x系はまだ、ということでしたが、
https://github.com/asinesio/cocos2d-PRKit
を見ると、2.xへのcompatibilityを向上、ということを書いているので、対応しつつあるようですね。自分でインストールして確かめていませんが。

2013年2月12日火曜日

Core Data学習、事始め。

「初めてのCore Data on iPhone」というタイトルの記事に、Core Dataのことが書いてあり、有益だった。
http://konton.ninpou.jp/program/cocoa/coredata/entry.html

とりあえず、Xcodeでまず生成されるコードをビルドしてみると良い、というので、やってみると、確かに。
シンプルなものが動いた。

ここから、ソースを読んでいって、基礎を学習するのは良さそうだ。

ありがたい。

以下の記事に、Core Dataを楽に書くためのCoconutKitというライブラリ調査について書いたが、私は、それ以前の段階にいるので、まずは、原点から学習すべし、自分。
http://learning-iphoneapp.blogspot.jp/2013/02/coconutkit.html

(追記:More iOS6 developmentという本に、core dataについてかなり書かれていて、読み始めました。良い基礎学習になっています。kindleで販売されているcore data関連の本で、iCloudまで網羅されているものがなかなか見つからなかったのですが、これはcore dataの言葉がタイトルには冠されていませんが、ちゃんと書かれていたので、ポチリました↓ )

TableViewの学習開始

TableViewの学習も開始。
Utility系のアプリを作るには、個々は避けて通れない、ということで。

以下、identiferのこと、cellの使い回しについて分かりやすかったのでメモ。
http://supportdoc.net/support-iphone/table_basic8.html

本家ドキュメントで、段階を追って参考になるコードがあったので、メモ。
http://developer.apple.com/library/ios/#samplecode/TableViewSuite/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007318

少しずつ分かってきた。。

NSDate関連の学習開始

日付関連のアプリを作る予定があるので、
学習開始。

本家ドキュメント「Date and Time Programming Guide」。
http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/DatesAndTimes/DatesAndTimes.html#//apple_ref/doc/uid/10000039i

日本語で、NSDateクラスのドキュメントを書いて下さっているページ。
http://secondflush2.blog.fc2.com/blog-entry-1046.html#timeIntervalSinceReferenceDateClass

こんな感じで、NSDateクラスのオブジェクトを作って、二つの日にちを比較したり出来る。
        NSDate *dateNow=[NSDate date];         NSTimeInterval since = [dateNow timeIntervalSinceDate:datePrev];
NSDate関連、奥が深い。。

timezoneについて調べていたら、
TableViewSuiteという本家製サンプルコードに行き当たった。
http://developer.apple.com/library/ios/#samplecode/TableViewSuite/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007318
TableViewについての学習と、timezoneについての学習が一度に出来て、お得だ。
これは。

2013年2月11日月曜日

CoconutKitの解説ページ調べ。Core data情報を探して。

coconutkitという便利そうなライブラリを使ってみるため、
調査開始。

まず、以下のwikiが初歩の解説。
https://github.com/defagos/CoconutKit/wiki/Introduction

containerに関するページ。
https://github.com/defagos/CoconutKit/wiki/Containers

残念!Core Dataに関する解説は、まだwikiにはありませんでした。
https://github.com/defagos/CoconutKit/wiki/Core-Data-extensions

Core Data関連のコードは、ここに掲載されていました。コードを読んで解読するしかないですね。(作者の方は、「コードに解説を書いているのでそれを参考にして欲しい。」といったことをどこかに書いておられました。コードのコメントで最新情報を書いておくから、ということで)
https://github.com/defagos/CoconutKit-CocoaPods/tree/master/Sources/CoreData

CoconutKitをcocoa podを使ってインストールする解説はこちら。
https://github.com/defagos/CoconutKit/wiki/Getting-started

私は特にCore Dataに関する情報が欲しいので、
wikiのintroductionページから、以下にコピっておきます。自分用に日本語メモもつけますが、意味の正確性は、怪しいところがあり、訳は断片的で不十分です。ご了承ください。

Core Data management

Core Data is a wonderful framework. In too many projects I worked on, I started with a custom lightweight object model fulfilling exactly my needs. As usual, I then discovered I needed a way of requesting objects, persisting them or checking their consistency. And in all cases, I ended up rewriting part of Core Data, regretting not to have used it right from the start.
このライブラリの作者defagoさんは、Core Dataを非常に素晴らしい、といっていますね。最初から使っていれば良かった、と。私と同じ間違いはしないで、とも。Core Dataの全ての機能が必要なくても、かかる時間と頭痛を減らしてくれる、とも。
You should never make the same mistakes as I made. Even if you do not need all of Core Data features at the time you start a project, you can be sure that Core Data will save you a lot of time and headaches later. You just need a few model objects, nothing more? Well, that's not a reason not to use Core Data and an in-memory persistent store, which lets your conveniently design your model using the Xcode Core Data editor. When you later discover that your objects must finally be persisted on disk, all that is basically required is to change a single setting.
There are usually a few issues when working with Core Data, though:
Core Dataを使う場合、幾つかの課題がある、と。
  • There is a lot of boilerplate code to write, and the Xcode Core Data template is rather poor(boilerplate、すなわち決まり文句をたくさん書かなくてはならず、XcodeのCore Dataのテンプレートはやや貧弱)
  • The code becomes cluttered with managed object contexts, and issues can arise in multi-threaded applications if you use the wrong context by mistake
  • Validation is poorly implemented and leads to a lot of boilerplate code (e.g. for proper error-chaining), especially if you want to perform validation both interactively (when a model field is edited using a text field) or when an object is saved to the persistence store (ヴァリデーションの実装が貧弱で、お決まりのコードをたくさん書かなくてはならない。特に、インタラクティブなテキストフィールドを扱う場合や、persistence storeにセーブする場合。)
To solve all those issues, CoconutKit provides with:
で、CoconutKitが提供する解決策は、
  • HLSModelManager, a class which manages context and persistence store creation for you. (HLSModelManagerというクラスは、コンテクストを制御し、persistence storeをあなたのために作成してくれます)No more Xcode templates to use, everything has been done once for all.(Xcodeテンプレートを使う必要が無く、全てのことを一度に行います) To eliminate issues with explicit managed contexts thrown all over the place, you now never interact with managed contexts directly.  Instead, stacks of HLSModelManager objects are managed on a thread basis.(managed contextsに直接触れることなく、HLSModelManagerオブジェクトは、スレッドベースでマネージします) Context-free methods then allow you to perform usual CRUD operations with the managed object context associated with the top model manager only.
  • A validation runtime layer, which makes it possible to write validation methods once for all in a single place, and to call them both interactively and when saving objects to the store. Error-chaining has been implemented correctly, and text field bindings have been implemented so that form creation is made as easy as possible (it is just a matter of saying which model object field is edited by a text field, CoconutKit takes care of the rest)
また、作者さんのブログにCoconutKit1.1の時のCore Dataに関する記述もあったので、メモ。
(実装の具体例はないのが、残念。どこかにないかな。。)



Easy Core Data validation

Usually, when writing Core Data validation methods, you need to add a lot of boilerplate code to handle error chaining. Not only is error chaining easy to make wrong, it also clutters your precious business logic with Core Data code, making validation methods more difficult to maintain and reuse. Most notably, such validation methods cannot be reused for simple needs like validation of values entered interactively. Core Data validations are namely meant to be triggered by Core Data in a row once an object is saved to the store. It is often not what you want. 



CoconutKit 1.1 therefore introduces a new way to write validation methods, without the need to care about the usual Core Data boilerplate code. Your methods now can focus on business logic only, and can be easily called to validate fields individually when needed. 

But there is more. If you often write forms for editing Core Data objects (most notably made of text fields), you probably always end up writing the same kind of code: 

Calling the validation logic when the user exits edit mode for a text field
Synchronizing model fields with text fields in both model-to-view and view-to-model directions
Writing formatting code if values need to be formatted

These days are over. You now simply bind a text field to a model object field (providing an optional NSFormatter if needed), all the rest is handled for you. Your code will be faster and easier to write, understand, and maintain. 

I put a lot of effort to get this feature right, testing it extensively and ensuring it is really easy to use. I sincerely hope it will help you write better Core Data validation code.

:::::::::::::::::::::::::::::::

ソースを見ると、以下のファイル群あたりで実装されている様子。


HLSManagedTextFieldValidator.m
HLSModelManager.m
NSManagedObject+HLSExtensions.m
NSManagedObject+HLSValidation.m

まあ、まず自分で、Core Dataの基礎を学ばないと、手がつけられない感じです。
最初から楽をしよう、という心を反省して、基礎をまず学びます。

cocoapods導入時の躓き解決のメモ。とCoconutKitのお試し開始

Cocoapodsを導入すれば、様々なライブラリのインストールがかなり楽になるらしいと知り、導入しましたが、最初に幾つかつまずいたのでメモ。

ググって、こちらの記事などを参考に、
terminalでインストールを試みるも、
rubyが古かったようで、まずsudoでrubyのupdateをして、
今一度、cocoapodsをインストールし直すと、OKに。

インストールも無事済み、「podfile」という拡張子なしのファイルをProjectフォルダ内につくってCDでそのフォルダに移動し、pod installしてインストール完了するも、
なぜか、.xcodeprojに反映されていない。。

不思議だと思ってググると、こちらの記事で、
「XcodeProjectName.xcworkspaceってのが出来るからXcodeProjectName.xcodeprojではなくそっちを使う」という記述があり、
.xcworkspaceファイルをクリックしてみたら確かにOKでした。

良かった。

:::::::::::::::::::::::::::::::

元はといえば、
CoconutKitというライブラリを導入したかったのが理由です。
http://subjective-objective-c.blogspot.jp/
様々な点で、スパゲティコードを書く手間を省き、二年かけてカスタマイズを行ってきている、ということで興味を持ちました。
https://github.com/defagos/CoconutKit/wiki

最近愛用しだしたKobold2dですが、Cocos2dもそうなのですが、ユーティリティ系のアプリでよく使われるタブやcore dataなどの拡張は私の知る限りなされておらず、その部分のライブラリやフレームワークを探していました。

上記の記事を読む限り、良さそうなので、とりあえず試してみます。


CoconutKit demo HD from Samuel Défago on Vimeo.

http://www.slideshare.net/defagos/coconutkit


CoconutKit 2.0 stack controller preview from Samuel Défago on Vimeo.

このライブラリの関数接頭辞「HLS」とは何だろうと思ったら、
「hortis le studio」という会社名の頭文字のようですね。
「NSString」の「NS」って「Next Stepの略か」などと、
接頭辞の理由を知ると覚えやすいので、調べてみました。

私のような初心者には、Kobold2dやCocos2dはお勧めでした。


Cocos2dを試し始め、その後、Kobold2dを使用するようになり、
やっとまともに動くiOSアプリの原型が作れ始めるようになった。

これまで、まともにObjective-Cコードで書こうと勉強してきたが、
どうにも理解しなくてはならないことがすっと頭に入ってこず、
いくつもいくつも参考図書を買ったが、けっきょく動くものがなかなか作れるようにならなかった。
すぐ、覚えたことを忘れたり。。
Xcodeの優れたコード補完機能を持ってしても、私の覚えの悪さは補完できないという残念さ(汗

Kobold2dは、かなり初心者向けに簡潔にコードが書けるようになっており、
ほんとうにありがたい。
もちろん、基盤のCocos2dもありがたい。

そのおかげもあって、
だんだん基本が分かるようになり、
Objective-Cコードを改めて見てみると、前より理解しやすくなっている自分に気づいた。

私のような初心者は、Kobold2dやCocos2dから入って、
動くものを手軽目に作れる楽しさを体験し、
しかるのちに、根本のObjective-Cをがっつり学んでいく、という逆コースがお勧めかもしれない。

少なくとも、学び始めたばかりの過去の自分にあったなら、
Kobold2d、もしくはCocos2dから始めると楽しくて、習得も早いよ。
その後で、Objective-Cを覚えても良いかもしれない、と助言すると思う。
Objective-Cの基本は、どうしても必要だが。

そこそこ動くものを体験する楽しみにたどり着く前に、
おまけの呪文のようなコードを色々書いたり、覚えたりすることの大変さは、身に染みた。

フレームワークのありがたさを、しみじみ実感している。

2013年2月6日水曜日

プログラミング言語は、慣れが大事ですね。

プログラミング言語は、「言語」というだけあって、
やはり慣れが大事ですね。

書いて、慣れる。

だんだん身につけていく。

少しずつ、コードが身についてくると、難しいことも分かるようになってくることは、
外国語習得と似た感じがします。

親しむことが、大事ですね。やっぱりなんでもそうですが。

あと、プログラミングは、理系のものと思われることが多いし、
自分でもそう思っていましたが、
英語が基礎になっているものが多く、解説も英語が圧倒的に多いので、
意外に文系向きの部分もあるかもしれない、と思う日々です。



bloggerでコードをシンタックスハイライトさせたい。(解決)

このブログ、コードが見にくいので、pretty codeのたぐいを入れたいと思うのですが、
まだ上手くいかず、残念。

bloggerにObjective-Cコードを綺麗に表示させること、
ちょっと本気にならねば。

いつも、読みにくくてすいません。

:::::::::::::::::::::::::::::::

というわけで、ググって、prettycodeを入れてみました。

http://blog.pamelafox.org/2010/08/how-to-pretty-print-code-snippets-in.html
var i = 2 + 4;
ちょっと上手くいった感じです。 Objective-Cコードはどうかな。。。
 CCSpriteBatch *batch = [CCSpriteBatchNode batchNodeWithFile:@"test.png"];
        [self addChild:batch];
    CCSprite *sp = [CCSprite spriteWithTexture:batch.texture];          
    sp.position=ccp(100,100);
 [batch addChild:sp z:1 tag:1];
あ、うまくいきました。 ありがたや。google code。 :::::::::::::::::::::::::::::::
以下、備忘録。 テンプレートのmetaタグの後に
<link href='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css' rel='stylesheet' type='text/css'/>
<script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'/>
そして、
prettyPrint();
を、jsコードの中に追加。 テンプレートの下の方にある傾向が強いよう。私もそこで見つけました。 そして、毎回、シンタックスハイライトしたいコードをpreタグのprettyprintクラスでくるんでやるとOK.
<pre class="prettyprint">
 somecode
</pre>
簡単便利でありがたや。

2013年2月5日火曜日

Spriteの枠を回避するため、PhisicsEditorが使えないかと(未解決)

TexturePackerに加えて、PhysicsEditorを使って、Spriteのトレースをし、それによってSpriteの当たり判定を制御しようか、と検討中。
http://timroadley.com/2011/08/19/game-template-part-7-texturepacker-physicseditor/

重力などの仕組みが欲しいわけではないが、SpriteのRectangleのあまり部分が余計なので、PhisicsEditorの出番かな、と。。

研究です。

CCSpriteを配列にloop格納するために。(未解決)

arrayにCCSpriteを複数突っ込んでいこうと思って、ググった。

以下が良さそう。
http://www.cocos2d-iphone.org/forum/topic/30297

CCArray *spriteArray = [CCArray arrayWithCapacity:10];

for (int i = 0; i < 10; i++)  {
     [spriteArray addObject:[CCSprite spriteWithFile:@"test.png"]];
}

// Retrieve reference
CCSprite *sprite = (CCSprite*)[spriteArray objectAtIndex:i];
なるほど。

CCArrayを作っておいて、
addObject:していって、
(CCSprite*)でCCSpriteオブジェクトとして配列から取得、と。

それで、
NSString *name = [NSString stringWithFormat:@"sprite%d", i];
[spriteArray addObject:[CCSprite spriteWithFile:name]];
こんな感じで、連番にした名前から配列を生成できるだろうか。

さて、やってみよう。

:::::::::::::::::::::::::::::::

というわけで、小さな丸「comal」を複数突っ込んだspriteAtlasをTexturePackerでつくって、以下のようなコードを書き書き。


        CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache];
        [cache addSpriteFramesWithFile:@"comalAtlas.plist"];
        
        for(int i=1;i<7;i++){
            NSString *name=[NSString stringWithFormat:@"comal%d.png",i];
            CCSprite *comal = [CCSprite spriteWithSpriteFrameName:name];
            comal.position=ccp(100*i,100*i);
            [self addChild:comal];
        }
無事、表示されました。

が、上記を参考にした配列を使ってみると、エラーで止まるので、要調査。
まだ、CCArrayについて、よく分かっていないようです。自分。


TexturePacker生成画像の表示メモ。


TexturePackerを使って、右画像のように、複数画像を配置した透過PNG画像と、plistの二ファイルを生成してもらい、Resourcesに登録した。

が、どうやってtextureから表示して良いか分からず、色々調べるも、古い情報などが多く、実装に時間がちょっとかかったので、メモ。



以下のように、


1:まず、CCSpriteFrameCachesharedSpriteFrameCacheでつくる。
2:次に、cachespriteFramesWithFile:でplistファイルを追加。
3:そして、spriteにspriteWithSpriteFrameName:で、PNGファイル名を記述。

       CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache]; 

       [cache addSpriteFramesWithFile:@"spriteAtlas.plist"];

       CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"sprite.png"];

        sprite.position=ccp(100,100);

        [self addChild:sprite];

これで、無事表示されました。

Kobold2d 2.0.4、Cocos2d 2.0 にて。

透過PNGは「アルファチャンネルを選択」

透過PNG画像をFireworksで作成して、以下のような白い部分が周辺に残った。
青い方は残り、赤い方はない。


どうしてか、調べてみると、
「インデックス透明カラー」にした場合、白い枠が残るとわかり、
「アルファチャンネル」を選択すると大丈夫だった。

透過PNGは「アルファチャンネルを選択」が、肝要の様子。

はい、綺麗になりました。



2013年2月4日月曜日

CCSpriteBatchをやっと使ってみた。確かにメモリ消費が減る。


やっとCCSpriteBatchを実装してみた。
同一で大量のspriteを描画する際に、メモリの圧迫がかなり抑えられ、便利。
 (延々、大量に描画し続けたら、途中から描画してくれなくなりましたが、自動的にsprite量は補充されるようです。Kobold2dの仕様かな?Cocos2dかな。私は今、Kobold2dを使っているので、Cocos2dの仕様とちょっと違ったことを書くことがあるかもしれません。)
 CCSpriteBatch *batch = [CCSpriteBatchNode batchNodeWithFile:@"test.png"]; [self addChild:batch];
    CCSprite *sp = [CCSprite spriteWithTexture:batch.texture];          
   sp.position=ccp(100,100);
 [batch addChild:sp z:1 tag:1];

   バッチをまず画像ファイルをもって準備しaddChildして、
 CCSpriteをそのバッチのテクスチャから作成し、
 もう一度batchにaddChildeする、というやり方の様子。

 [self addChild:batch];しても、別にまだ何も起きず、
 spriteをつくって、さらにbatch addChild:spriteする、というのは、
 若干面倒なようですが、メモリ消費を抑え、ありがたい限り。

 batchというのは、バッチファイル、みたいな感じで、「ひとまとまり」「塊」といった意味ですね。

 やっと使えました。

 ファイル画像を、sprite atlasにすれば、読み込み部分の画像ファイル名を指定してやることで、同一ファイルから違う部分を読み込み、別画像として使え、メモリ消費は抑えられる、という優れもの。

 今度は、それに取り組みます。
 TexturePackerというツールも手に入りましたので。

取り組みました→ http://learning-iphoneapp.blogspot.jp/2013/02/texturepacker.html

サンプルコード用実験遊び場、作成

作り途中のアプリに、サンプルコードを書いていくことは効率が今ひとつなので、
サンプルコードをガンガン書いて、適当に消していくProjectを作った。

遊び場は、大事ですね。
適当に遊ぶところから、本当に使えるものも生まれやすい。

playGroundで、適当にコードをコピペしながら、開発効率を上げていきます。

CCRenderTextureは、追加描画ができるものでした。

CCRenderTextureについて、調べ中。

以下の記事は、とてもまとまっていたので、メモ。
http://www.raywenderlich.com/3857/how-to-create-dynamic-textures-with-ccrendertexture

-(void)drawの中で、CCRenderTextureを使えば、Cocos2dで連続した描画を追加していける様子。
これを探していたのでした。(追記:draw以外でも大丈夫でした。)

気づかされたのは、ここから。
http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/

手描きアプリのサンプルコード。
とても良い感じで描ける。

CCRenderTextureについても、学習を開始です。


(追記:Kobold2dの作者で、Cocos2dの解説者のブログに良い記事があったのでメモ。
http://www.learn-cocos2d.com/2011/12/how-to-use-ccrendertexture-motion-blur-screenshots-drawing-sketches/
上記記事によると、最初はdrawメソッドの中でtextureへの描画コードを書かなくてはいけないのかと思ったが、そうではなかった。どこでも良い様子。)

:::::::::::::::::::::::::::::::

実際使ってみると、私が思っていた用途に使うにはかなり重いようでしたが、それはシミュレーター上での話で、実機ではなぜかフレームレートは下がりませんでした。
なんでMac上で遅くなるのだろう?
描画処理の重さ、というより、textureを追加した時点で、重くなっている様子。textureのサイズを小さくすると、かなりましですが、iPadの画面サイズに設定すると、シミュレーターでは非常に重くなります。

何かやり方がまずいのかもしれませんね。

まあ、実機では大丈夫だったので、よいと言えば良いのですが。

ルビ振り方法を模索。Text,Glyphs学習メモ。

漢字にルビを振ろうかと思い、模索中。

正規表現で、ひらがなを取得するコードを、以下の記事があげてくださっているので、メモ。
http://redwing.moo.jp/cocoa/archives/date/2012/04

そして、なんらかのデリミタで、文字列を分割する方法について、以下が参考になりそうだったので、メモ。 NSScannerなるものが便利そう。

http://hmdt.jp/cocoaProg/Foundation/NSScanner/NSScanner.html

あとは、ひらがな以外の漢字のindexを取得して、用意しておいたルビの配列から取り出して、表示、という感じか。ちゃんとその文字の上に表示しなくてはいけないから、位置取得も考えなきゃな。
それが一番ハードルが高かったりするかもしれません。..

まあ、気長にがんばるか。

:::::::::::::::::::::::::::::::
さて、以下は、Apple公式ドキュメントで、関連の参考になりそうなページURLメモです。

NSStringについて。
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/introStrings.html#//apple_ref/doc/uid/10000035i

「Drawing Text With NSLayoutManager」という項目が、かなり重要そう。テキストを直接、位置を決めて描画するらしい。(まだざっとしか目を通していません。)

「Line Fragment Generation」
文字の画角(rectangle)についてなどの資料の様子。
(このページに「The built-in typesetters currently provided with text system support only horizontal text layout. However, the text system can support typesetters that lay out text along lines that run either horizontally or vertically, and in either direction. 」と書いてあるので、縦書きにもこの仕組みは対応できると。pagesあたりが、しっかり縦書きに対応して下さると、日本人としてはありがたい限りですが。)

で、「Layout Geometry: The NSTextContainer Class」に、ヘブライ語とアラブ語は、左から右、という動きのみをサポートしたtypesetterによってではなく、別のメカニズムで動いています」と書いてあるので、日本語も、その口かな、と。最近、テキストエディットが縦書き対応したので、pagesに適用されるのも近いかな、と思ったり。
Note:  The built-in typesetters currently support only top-to-bottom line movement and left-to-right sweep. These typesetters do handle bidirectional text (Hebrew and Arabic) by laying it out in the proper display order within the line fragments, but they do not use the line sweep mechanism.
話題がずれてきましたが。。

これも重要そう。「The Layout Manager」。
ここに詳しくレイアウトについて解説されている様子。
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TextLayout/Concepts/LayoutManager.html#//apple_ref/doc/uid/20001805-BBCFEBHA

で「TypeSetter」が、重要そう。
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TextLayout/Concepts/Typesetters.html#//apple_ref/doc/uid/20001806-BBCFEBHA

また、以下の「setTypesetterBehavior」の解説に、
Renders the glyphs at the specified positions and attributes into the graphicsContext.」と書いてあるので、graphicsContextの中の特定の位置と属性でglyphsを描画する、とのこと。
で、showCGGlyphs:positions:count:font:matrix:attributes:inContext:」というメソッドが紹介されており、positionsという部分がCGPointなので、検討する価値がありそう。
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSLayoutManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSLayoutManager/setTypesetterBehavior:


で、「CircleView」という面白いMacアプリのサンプルがあり、インストールしてみたら、グルグル円になった文章が回転して、楽しい。コードを読んでいけば、かなり勉強になりそう。Apple提供。
https://developer.apple.com/library/mac/#samplecode/CircleView/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008882

このサンプルを見ていると、縦書きの簡単な仕組みは作れそうですね。
ルビもいけるかな。
各文字の配置をプログラミングで制御しているので、シンプルです。

これは使えそうだ。
ありがたや。。。。。。


:::::::::::::::::::::::::::::::

ついでに、そもそもとして、Cocoaのテキスト設計全体についての解説ページ。
https://developer.apple.com/library/mac/#documentation/TextFonts/Conceptual/CocoaTextArchitecture/Introduction/Introduction.html


:::::::::::::::::::::::::::::::

さて、これから、まだまだ勉強です。
ルビの実現ぐらいで、ずいぶん勉強内容が増えそうですが、
他にも活用できそうなので、まあ、勉強あるのみ。
楽しく、無理なく参りませふ。

2013年2月3日日曜日

Kobold2dのicon登録のディレクトリ。

Kobold2dでiconを登録する際、
普通のProjectfiles配下のResourcesではなく、
Projectfiles-iOS配下のResourcesにicon.png他を入れる必要があるようだ。


また、Kobold2dの話ではないが、
iconの縦横は、正確にそのpixel数でないと、反映されない。
57x56とかで1pixelでもずれていたら、反映されず。
そのことで少し悩んだので、備忘録です。




Kobold2dのdrawとcocos2dのdrawの書き方の違い。。

Kobold2dでdrawにコードを書いているのに、いっこうに描画されず、悩んだ。
すると、
-(void)draw:(ccTime) delta
と書いてしまっていた。

cocos2dは、上記で良いが、
Kobold2dはだめ。

-(void)draw{
}

だけでないと、描画されない。
cocos2dのコードをコピペしてしまっていたようだ。

失敗の備忘録です。

2013年2月2日土曜日

お絵かきアプリ作成のためのメモ

Paperにinspiredされて、drawingアプリをcocos2dを利用してつくった、という記事があったので、メモです。

http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/
ソースコードもシェアしておられるので、ゲットしてみると。。
これは、なかなかすごい。
指のスピードで線も確かに太さが変わり、描画もスムーズ。
ソースを読ませて頂こう。ありがたや。。。


:::::::::::::::::::::::::::::::
本家Appleのサンプルコード。GLPaint
OpenGLをつかってのもの。cocos2dやKobold2dに組み込めるかな。。(初心者丸出しで失礼)

https://developer.apple.com/library/ios/#samplecode/GLPaint/Introduction/Intro.html

実際に動かしてみると、かなり滑らかな書き心地。
OpenGLを使うのはやはり良さそう。

そして、コードが非常に短いのも気に入った。
勉強すべし、自分。



:::::::::::::::::::::::::::::::
滑らかな線を描けるアプリ制作のお話
スプライン補完が鍵とな。
http://togetter.com/li/42695


CC_DEGREES_TO_RADIANS( angle) の適用忘れ

地球と月の公転を、ざっくりシミュレートしたアプリをつくろうと思ったが、
月と気球の回転速度が違いすぎて悩んだ。

よく見てみたら、

地球には、CC_DEGREES_TO_RADIANS( angle)
をちゃんと採用していたが、
月にはしていなかった。

採用したら、無事、連動し始めた。

Xcode4.6でerrror。私の場合、Kobold2dの問題だった。

Xcode4.6にアップグレードしたら、

Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang failed with exit code 1

というエラーが出るようになった。

http://www.cocos2d-iphone.org/forum/topic/208237
によると、cocos2dではなく、Kobold2dの問題らしい。

そこで更に調べると、
http://stackoverflow.com/questions/14581605/kobold2d-generates-errors-after-upgraded-xcode-to-4-6
に、
Kobold2dで

go to CCAnimationsExtensions.m and remove #import "FixCategoryBug.h" FIX_CATEGORY_BUG(CCAnimation)
 

と書いてあった。

ので、CCAnimationsExtensions.mの該当項目を消してみたが、まだ上手くいかない。

ので、更にProject内の検索をかけて
FIXCATEGORYBUGで引くと、いくつかファイルが出てきたので、コードを削除。
しかし、まだエラーが出るので、
FIX_CATEGORY_BUGも同様に検索して、上記のようなコードを削除したら、やっと通った。。

(Kobold2d作者さんは、Simply remove all references to FIXCATEGORYBUG. It is no longer needed.
といっていて、全ての参照を消して良い、と書いていました。)

拡張ライブラリは、やはり付き合いを慎重に、ですね。