ラベル cocos2d の投稿を表示しています。 すべての投稿を表示
ラベル cocos2d の投稿を表示しています。 すべての投稿を表示

2014年10月7日火曜日

cocos2d ver3はspirite builderのインストールがほぼ必須だった。

ぬぬ。。
cocos2d の3系をインストールしようとして、
インストール方法が分からない、と思ったら、
sprite builderをインストールすることで、自動化されるとか。。。

完全にほぼ統合なのですね。

http://www.spritebuilder.com/blog/spritebuilder-12-cocos2d-32-are-out

了解しました。

そんなわけで、sprite builderを使ったことがなかったのですが、
使ってみます。。。。

cocos2d 3系になっていました。。

少しうかうかしている間に、cocos2dがversion3系になっていた。

2系は、touchの処理周りのコードが冗長な感じで、
kobold2dを試してみたりしたが、3系では改善されていた。
https://www.makegameswith.us/docs/#!/cocos2d/1.2/user-interaction

やっぱり、cocos2dでいこう。

どうしても、koboldは開発者の方が一人?で、
cocosは、かなりチームで取り組んでいるので、
結果的には、本家の方が安定性と未来性は高い気がする。
koboldの開発者の方には申し訳ないが。。

ともあれ、cocosの改善、よかった。

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アプリのサンプルが気になった。


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月11日月曜日

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


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

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

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

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

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

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

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

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

2013年2月5日火曜日

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

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

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

研究です。

TexturePacker生成画像の表示メモ。


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

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



以下のように、


1:まず、CCSpriteFrameCacheをsharedSpriteFrameCacheでつくる。
2:次に、cacheにspriteFramesWithFile:で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 にて。

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

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の画面サイズに設定すると、シミュレーターでは非常に重くなります。

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

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

2013年2月3日日曜日

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

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

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

-(void)draw{
}

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

失敗の備忘録です。

2013年2月2日土曜日

CC_DEGREES_TO_RADIANS( angle) の適用忘れ

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

よく見てみたら、

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

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

2013年1月26日土曜日

CCArrayの再帰処理


再帰についてのメモ。
CCArrayのオブジェクト中にCCArrayが含まれる場合、どんどん下層arrayまで入り込んでいって、最終的に配列でないオブジェクトにたどり着くまで入り込んでいき、処理を実行する、というもの。
便利。
以下のコードは、Kobold2dの開発者さんによるもの。

Recursion is your friend.
-(void) recurseIntoArray:(CCArray*)array
{
    for (id item in array)
    {
        if ([item isKindOfClass:[CCArray class]])
        {
             [self recurseIntoArray:(CCArray*)item];
        }
        else
        {
             NSLog(@"item: %@", item);
        }
    }
}
Just start the iteration anywhere with the root array:
[self recurseIntoArray:rootArray];
Worth mentioning: CCARRAY_FOREACH is no longer necessary, at least in cocos2d 1.1 and 2.0 you can just use regular fast iteration with for. May also work in cocos2d 1.0.1, I think I used fast enumeration there as well.

2013年1月24日木曜日

cocos2d・Kobold2dは、jQueryに似ているな、と。

Objective-Cにおける、cocos2dとその拡張であるKobold2dは、
javascriptにけるjQueryに似ている、と感じることが多々あります。

javascriptのフレームワークは多々ありますが、
jQueryはかなりの人気であり、私も初めて知った頃は、そのシンプルさに感動したものでした。

Objective-Cは、書けるようになるとかなりの可能性を追求できますが、
最初の入り口がわかりにくいことと、
コードを書く量が多く、それが大変です。(Xcodeのコード補完は秀逸ですが)

そこで、書く量を非常に省力化してくれるcocos2dを知ったときは、感動しました。
感覚として、jQueryを連想しました。

また、Kobold2dも、cocos2dのいいところを、さらにシンプル化して提供しておられ、好感が持てます。

こうした素晴らしいフレームワークをMITなどのライセンスで提供しておられることに感謝です。


2013年1月23日水曜日

CCArrayにint型整数を突っ込み、整数として取得し直すメモ

CCArrayにintを突っ込むのは、以下のよう。


i have a CCArray
    CCArray *indexs;
then i add a integer into it
    int x = 0;
    [indexs addObject:[NSNumber numberWithInteger:x]];
then i want to get this integer from this CCArray
    id temp1 = [indexs objectAtIndex:0];
    int firstOne = (int) temp1;//これまちがい

で、ここからint型整数整数を取り出すのは、


int firstOne = [temp1 intValue];

出典は、

CCArrayのドキュメント、とsortについて。

コレクションを使うことがこれから多くあるので、配列やSetについて学び中。

CCArrayについて、まずCocos2dであれば学ぶべし、と思い、以下のドキュメントを参照。
http://www.learn-cocos2d.com/api-ref/1.0/cocos2d-iphone/html/interface_c_c_array.html

Kobold2dの作者さんが、2010年にCCArrayとNSArrayの速度比較をした記事があり、
http://www.learn-cocos2d.com/2010/09/array-performance-comparison-carray-ccarray-nsarray-nsmutablearray
CCArrayで、insertObject:AtIndex:0 and removeObjectAtIndex:0を使った際には、NSArrayより断然遅かった、という記事が気になった。

その後2年は経っているので、改善されていると思うが。。

CCArray,ドキュメントを見る限り、いろいろな機能が備えられており、便利そう。
(個人的には、randomObject ()が便利そう。よく使います。)

ありがたく使用させて頂きます。

:::::::::::::::::::::::::::::::
と思ったら、
http://www.cocos2d-iphone.org/forum/topic/10202
ここに、sortの機能がない、ということが書かれていた。。
確かに、無さそう。
さて、どうするか。sortも使いたいのだが。

と思ったら、開発者さんのgithubで、sortのfunctionが書かれたものが。
https://github.com/cocos2d/cocos2d-iphone/blob/master-v2/cocos2d/Support/CCArray.m

ソースを確認したら、すでに実装されていますね。CCArray.h,.mに。
良かった。

https://github.com/ricardoquesada
この方、ありがたい方だ。。拝んでおこう。。

OpenGL ESってなんだろう、と調べてみた。

OpenGL ESとはなんだろう、ということが気になって色々調べた。
「ES」は「Embedded System」、すなわち、組み込みシステム用の様子。iOSとか、Androidとか。

以下の文章が、OpenGL ESとCocos2dの関係について簡潔に紹介されていたので参考になりました。英語ですが。
http://stackoverflow.com/questions/10228508/why-are-opengl-es-and-cocos2d-faster-than-cocoa-touch-ios-frameworks-itself

基本、3Dのレンダリング用なので、Cocos2dのspriteは、実は3Dの立体オブジェクトを平面として二つの三角形を四角として描いており、上部からの視点で見ているからぺったりして見えるけど、回転やズームなども簡単にできる。そして、Core Graphicより早い、とのこと。

Cocos2dは、OpenGL ESを非常に使いやすくしてくれている、ということの様子。
よく「OpenGl ESのラッパーです」と言われているが自分にはよくわからなかったので、上の文章で、やっと少し具体的なイメージが掴めた。


2013年1月22日火曜日

ccTypesの設定をメモ。

ccTypes.hというところに、
ccc3やccc4などの設定が書いてあり、勉強になったので、メモ。
http://www.cocos2d-iphone.org/api-ref/0.99.2/cc_types_8h_source.html

こうやって、便利な拡張をしていくんですね。為になる。

00020 #import <objc/objc.h>                           // BOOL
00021 #import <CoreGraphics/CGGeometry.h>     // CGPoint
00022 #import <OpenGLES/ES1/gl.h>                     // GLenum, GLubyte
00023 
00027 typedef struct _ccColor3B
00028 {
00029         GLubyte r;
00030         GLubyte g;
00031         GLubyte b;
00032 } ccColor3B;
00033 
00035 static inline ccColor3B
00036 ccc3(const GLubyte r, const GLubyte g, const GLubyte b)
00037 {
00038         ccColor3B c = {r, g, b};
00039         return c;
00040 }
00041 //ccColor3B predefined colors
00043 static const ccColor3B ccWHITE={255,255,255};
00045 static const ccColor3B ccYELLOW={255,255,0};
00047 static const ccColor3B ccBLUE={0,0,255};
00049 static const ccColor3B ccGREEN={0,255,0};
00051 static const ccColor3B ccRED={255,0,0};
00053 static const ccColor3B ccMAGENTA={255,0,255};
00055 static const ccColor3B ccBLACK={0,0,0};
00057 static const ccColor3B ccORANGE={255,127,0};
00059 static const ccColor3B ccGRAY={166,166,166};
00060 
00064 typedef struct _ccColor4B
00065 {
00066         unsigned char r;
00067         unsigned char g;
00068         unsigned char b;
00069         unsigned char a;
00070 } ccColor4B;
00072 static inline ccColor4B
00073 ccc4(const GLubyte r, const GLubyte g, const GLubyte b, const GLubyte o)
00074 {
00075         ccColor4B c = {r, g, b, o};
00076         return c;
00077 }

Swipeのdirectionを画面方向毎に対応させるためのメモ

KKSwipeGestureDirectionが、実機のportraitモードやlandscapeモードで変わってしまうので、困っていたら、Kobold2dの開発者さんが、同様の悩みに答えていた。

http://stackoverflow.com/questions/8626534/uiswipegesturerecognizer-doesnt-seem-to-respect-current-uidevice-orientation-on

その下には、Kobold2dではなく、Cocos2dのコードも。

さて、後で時間を作って対応してみよう。

2013年1月21日月曜日

CCMoveToとCCMoveBy

CCMoveToとCCMoveByの違いを理解するために、リファレンスを参照。
CCMoveByはCCMoveToを継承し、deltaPosition(フレームごとのポジション移動量?)が指定されている。

deltaはどうやら、frameの差分の様子。
参考1 (どこかの質疑応答)
参考2「Unity におけるフレームと Update」

00134 @interface CCMoveTo : CCIntervalAction <NSCopying>
00135 {
00136         CGPoint endPosition;
00137         CGPoint startPosition;
00138         CGPoint delta;
00139 }
00141 +(id) actionWithDuration:(ccTime)duration position:(CGPoint)position;
00143 -(id) initWithDuration:(ccTime)duration position:(CGPoint)position;
00144 @end
00145 
00150 @interface CCMoveBy : CCMoveTo <NSCopying>
00151 {
00152 }
00154 +(id) actionWithDuration: (ccTime)duration position:(CGPoint)deltaPosition;
00156 -(id) initWithDuration: (ccTime)duration position:(CGPoint)deltaPosition;
00157 @end

CCMoveToは、特定地点(絶対位置)への移動。一度移動したら、そこで終了。
CCMoveByは、現在地からの相対的移動。絶対位置の指定ではなく。どんどん移動できる。現在地から、次の地点へ、同量の距離を。

ということらしい。

どんどんSpriteを動かす場合には、CCMoveByが便利。

ccpSub、ccpLengthのメモ。

Cocos2dの「ccpSub」や「ccpLength」などの定義を知るために、リファレンスを見たので、メモ。
http://www.cocos2d-iphone.org/api-ref/0.99.0/_c_g_point_extension_8h.html

float kMoveDistance = fabsf(ccpLength(ccpSub(swipeEndPoint, input.gestureSwipeLocation))) * 4;
というKobold2dのuser-inputのプロジェクトソースを理解するため。

ccpSubの定義は、以下。

00085 ccpSub(const CGPoint v1, const CGPoint v2)
00086 {
00087         return ccp(v1.x - v2.x, v1.y - v2.y);
00088 }

ccpLengthの定義は、みつからず。。

たぶん、ccpSubが二つのCGPointのx,yの差分を取るので、ccpLenghでその線分の長さを計算するんですね。

で、fabsfで絶対値として取得、と。

なるほど。