Hatena::Groupbabel

カーネルハッカーを目指す男の日記

2014-10-09

cocos runでハマる

01:23

よーしcocos動かすぞーと思って、cocos run -s ソースディレクトリ名 -p ios と打ったら下記の様なエラーが。

2014-10-10 00:20:08.830 ios-sim[5709:507] -[__NSArrayM localizedDescription]: unrecognized selector sent to instance 0x7f8a41402ae0

2014-10-10 00:20:08.832 ios-sim[5709:507] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM localizedDescription]: unrecognized selector sent to instance 0x7f8a41402ae0'

First throw call stack:

(

0 CoreFoundation 0x00007fff928f625c __exceptionPreprocess + 172

1 libobjc.A.dylib 0x00007fff93a98e75 objc_exception_throw + 43

2 CoreFoundation 0x00007fff928f912d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205

3 CoreFoundation 0x00007fff92854272 ___forwarding___ + 1010

4 CoreFoundation 0x00007fff92853df8 _CF_forwarding_prep_0 + 120

5 ios-sim 0x000000010a692e29 -[iPhoneSimulator LoadSimulatorFramework:] + 245

6 ios-sim 0x000000010a6948e0 -[iPhoneSimulator runWithArgc:argv:] + 2271

7 ios-sim 0x000000010a694cb2 main + 101

8 ios-sim 0x000000010a692ce4 start + 52

9 ??? 0x0000000000000003 0x0 + 3

)

libc++abi.dylib: terminating with uncaught exception of type NSException

ええ、この前まで普通に動いていたのに何で?と思って調べて見たら、

どうもXcodeのVersionが上がったせいで、cocosに入っているios-simのVersionが古くなってしまい、エラーが出た模様。

あーそういえば一昨日にiPhone6にした時に、溜まってたmacのupdate一気にやったな。。。そのせいか。。。

と思い、ios-simのVersionを上げる事に。

とりあえず下記を参考にmacportsインストール

http://qiita.com/us10096698/items/54195e60b7afb60105ef

次に、下記を参考にnodeとnpmをインストール

http://se-suganuma.blogspot.jp/2012/10/macmacportsinstallnodejs-for-alloy.html

最後に、エラーの原因を解らせてくれた下記を参考にios-simインストール

更に、下記の手順通りにインストールしたios-simcocosディレクトリに持ってくる。

http://ichiokumanyen.hatenablog.jp/entry/2014/09/29/015500

その後、cocos runしたところ、動いた!

いやー、今日はもっとガッツリ進めようと思っていたのに、思わぬ罠が。。。

Version系のトラブルってのは付き物なんですねー。

初エントリ

16:52

書かなきゃ、書かなきゃと思いつつ、なんやかんやで先延ばしにしてしまい、

今日の午前中に発破をかけられた為、よし、なんとか書いてやるぞと発奮w

以前もブログは書いていたのですが、やはり毎回書くネタに困る訳でして。

まあ、自分の興味のある話題、取り組んでいる話題、等が書きやすいかと思い、

大体下記に絞って書いていこうかと考えています。

・cocos2d-x関連 (取り組んでいる話題)

linux kernel (興味のある話題)

・その他 (勉強したこと、考えたこと、感じたこと等)

初エントリはというと、自分がぼんやり感じたことでも書いてみましょうかと。

んで、自分はjava出身の人間でして、日々オブジェクト指向チックなブログラムを書けるように、

それなりに苦心している訳ですが、これがなかなか上手くいかない。

今自分はゲームを作っているわけですが、例えば、プレイヤーのデータを抽象化して、

クラスを作ってみるとしましょう。

public class Player {
    private int level = 0;
    public void setLevel(int level) {
    	this.level = level;
    }
    public int getLevel() {
    	return this.level;
    }
    public int levelUp() {
    	return ++this.level;
    }
}

適当ですが、まあこんな具合に。

これはどういう考えかというと、プレイヤーの持つであろうデータ(今回はレベルに絞っているが、他にもHPとかMPとか色々あるでしょう)

をピックアップし、まずそれをフィールドに定義。

次に、フィールドにまつわる処理を、このクラス内だけで完結できるように、色々定義していく、といった具合です。

始めはこれで良いかもしれませんが、これが規模が大きくなってくると、段々と破綻してくる。

1クラスの役割が大きくなりすぎて、クラスが肥大化していってしまうのです。

じゃあどうすりゃいいのって話で、クラスの役割をもっと細分化したり、フィールドに持たせていたデータを、

DBに出したほうがいい、とか、色々な話になってくるわけです。

で、結局そこらへんの判断って、経験とかがものを言う比率が多い分野でして、自分でひたすら色々なコードを書いていかないと

なかなか勘所がつかめない。

とは言え、経験だけじゃなく、知識として、「こういう時は、こういう設計が向いている」っていう引き出しも欲しいですよね。

多分そういう時に効いてくるのが、「デザインパターン」なんだろうなと。

個人的に良く現場で使っているのが、「Template Method」っていうパターンです。

どういうパターンなのかというと、ざっくりですが、以下のようなサンプルのパターンです。

abstract class Parent {
    abstract protected void childMethod();
    public void parentMethod() {
    	childMethod();
    	System.out.println("parent called!!");
    }
}
public class ChildA extends Parent{
    @Override
    protected void childMethod() {
        System.out.println("childA called!!");
    }
}
public class ChildB extends Parent {
    @Override
    protected void childMethod() {
    	System.out.println("childB called!!");
    }
}
public class TestDriver {
    public static void main(String[] args) {
        Parent childA = new ChildA();
        Parent childB = new ChildB();
        childA.parentMethod();
        childB.parentMethod();
    }
}
出力結果
childA called!!
parent called!!
childB called!!
parent called!!

親クラスで共通の処理、流れを定義しておいて、継承先のクラスで特化した振る舞いを記述する、とまあそんな具合ですね。

型も親のクラスとして定義しておけるので、ポリモーフィズムが使えて拡張性にも優れていると。

余談ですが、個人的にはjavaにおいてなぜ抽象クラスが用意されたのか、このパターンでその意味が掴めたような気がします。

で、上記のようなデザインパターンを知識として持っておけば、多少なりとも設計する時の指針として使えるので、

判断する時の材料の一つとなり得ると思うのです。

でもまあ結局、パターンを上手く実コードに落とし込む技術も、経験とかが活きてくるんでしょうけどw

最近思ったのは、プログラミングする時のセンスというか、勘所というのは、

「対象を如何にプログラム的に都合良く抽象的に捕らえ、適切なデータ構造に落とし込めるか」かと思うのです。

この「プログラム的に都合良く抽象的に捕らえる」ってのが難しい。もう4年くらい悩んでいるのですが、

未だにうまくいかない。きっと永遠の課題なのでしょうけど、いい加減うまくなりたい。

ってなことを考えつつ、今日も現場で色々文句言われながらw 精進しようと励んでいるのです。

なんかあんまりまとまり無い文章になりましたが、要するに何が言いたかったかというと単なるグチでした。