世界の隅の開発室

 

◎  スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

◎  勉強会 資料公開 


ANCTPCCで週に一度行っている勉強会において、私が講義用に作成したプレゼン資料を公開します。
このページへのリンクはフリーです。
各資料への直リンクはご遠慮ください。

【第一回】
競技プログラマになろう!

【第二回】
貪欲法

【第三回】
ヒープ

【第四回】
ダイクストラ法

【第五回】
コンパイル時計算 実践:B-Spline曲線

【第六回】
再帰-Recursive-

【第七回】
オブジェクト指向概論

【第八回】
楽しいクソゲーのつくりかた

【第九回】
三次元描画処理概論
OpenGL ESによるiPhoneアプリ開発


【第十回】
よく分かるポインタ


3/14開催
旭川ふわっふわ勉強会

cocos2d-xでゲームプログラミング!

スポンサーサイト

◎  Xcode5で始めるiPhoneアプリ開発 2Dゲームフレームワーク cocos2d-x 


Xcodeをクロスコードと読んでたら、誰もXcodeのことを言っていると気づいてくれませんでした。
その方が格好いいのに(小並)


しばらくiPhone開発における、iOSの標準搭載機能を利用するためのUIKitとよばれるものを勉強していました。
前回解説したUILavelもその一つです。

これらの機能は、非常に便利なものですが、ゲーム開発にはあまり向いてないことが勉強するうちに分かってきました。
勿論追々解説はしていく予定ですが、私の最終目標をスマートフォンゲーム作成なので、別の技術に手を出します。

スマホゲーム開発で有名なのは、やはりUnityでしょうか。
とても人気の高いフレームワークで、全世界で使われてます。
しかし、Unityには欠点があり、その欠点が私には致命的なものだったので、今回はUnityは使用しません。
その欠点とは、3Dを前提としたフレームワークである為、2D環境においては処理が遅い、ということです。
回避方法などが存在するかもしれませんが、一般認識ではそうなっています。


というわけで今回は、2Dゲーム専用のフレームワーク、cocos2d-xを紹介します。


cocos2d-x


まだ知名度はUnityほどは高くありませんが、本を買って調べたところ、とても有用なフレームワークであることは確かです。

画像処理やアニメーションは勿論、音響から独自のデータ構造まで、様々なクラスが用意されています。


次回は、このフレームワークを用いて、非常に簡単なゲームを作ってみます。
開発環境の整え方は、先人方がたくさん解説して下さっているので、そちらを参考に。


今回はこれにて。

◎  Xcode5で始めるiPhoneアプリ開発 part1 

Xcodeで始める、iPhoneアプリ開発!ということで
Objective-Cの解説を交えながらゆったりやっていきます。

まず、この記事で注意すべきは
より視覚的なデザインの実装が可能な「ストーリーボード」の使用はしない、ということです。

理由はいろいろありますけども、
・プログラミングを主体で解説する場合には内部処理が隠蔽されるストーリーボードは都合が悪い
・スクショを張るのが面倒なので体感的な操作のストーリーボードの解説は出来ない


この二つが主な理由ですかね。

というわけでストーリーボードのことは忘れて、早速開発していきましょう。

適当にXcodeのnewProjectより、シングルビューアプリケーション選択。
設定方法は各自調べてください。

そして、早速プログラムを書いていくわけですが
プログラム経験者なら真っ先に気づくはずです。
main関数無くね?と。

ですが、よく探せば見つかるはずです。
折り畳まれておりますが、SupportingFilesの中にひっそりと佇むmain関数が。



#import "testAppDelegate.h"

int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([testAppDelegate class]));
}
}



#importは二重読み込み防止機能がついたincludeの上位互換プリプロセッサです。
iOS開発に役立つフレームワークや、スマホのイベント(タッチ、バックグラウンド移行など)などの定義などが行われています。

そして、リターンの引数。UIApplicationMain。
これは、アプリを呼び出す関数です。
mainはこれで終了です。

即ち、iOSアプリ開発におけるmain関数とは、アプリを呼び出し、アプリが終了すればプログラムが終了するという役割しか持たない関数です。

そのため、アプリを開発するには、実際に呼び出されるアプリの方を改変していくことになります。mainには手を加えません。

お分かり頂けましたか。


では早速、viewController.mに移動しましょう。
.mというのはObj-cの拡張子です。なんでmなんでしょうね。Objcでいいのに。

viewというのは、絵を描く人ならばレイヤーという表現が一番しっくりくるでしょうか?
ウィンドウが背景レイヤーで、ビューはその上に重ねていくレイヤーです。
ウィンドウという基本の画面に対して、その上に表示したり消したりするものがビューです。
つまりビューは複数存在する可能性があり、逆にウィンドウは一つしか常に存在しません。

viewControllerにおいて定義されているクラスは、このviewを司るクラスであり、多数のviewをこのクラス内で制御・管理します。

また、そのメソッドの一つviewDidLoadは、ビューが作成された際に一回だけ実行されるメソッドです。
今回はビュー表示時におなじみ「Hello World」を表示するプログラムを作りたいので、このメソッドに記述していきましょう。

#import "testViewController.h"

@interface testViewController ()

@end

@implementation testViewController

- (void)viewDidLoad
{
[super viewDidLoad];
CGRect rect = [[UIScreen mainScreen] bounds];
UILabel* label = [[UILabel alloc] initWithFrame:rect];
label.text = @"Hello,World";
[self.view addSubview:label];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end




[super viewDidLoad];

これはスーパークラス、つまりviewControllerのメソッドを呼び出しています。
この動作で、特に特筆すべきはビューが一つ作成されるということです。

CGRect rect = [[UIScreen mainScreen] bounds];

これはウィンドウサイズを取得しています。

UILabel* label = [[UILabel alloc] initWithFrame:rect];
label.text = @"Hello,World";


ラベル、文字列の表示クラスを宣言しています。initWithFrameはコンストラクタで、ウィンドウサイズを引数としています。allocはインスタンス化のメソッドですね(実態化)。
その後テキスト要素にハローワールドを入れてます。

[self.view addSubview:label];
addSubviewはビューへの張り付けを行うメソッドです。つまり、セルフビュー、インスタンス自身のビューにたいして、先ほど作ったラベルを貼付けています。

さあ、解説は終了です。実行してみてください。
きっと、左上らへんにHello Worldと表示されていることでしょう。

これで、お決まりの導入は終了です。
「iPhoneアプリ開発の世界へようこそ」

◎  C++のコードとObjective-Cのコードの比較 

C++の構文とObjective-Cの構文はかなり差があるので
私に限らずたくさんの人が混乱してしまったのかと思います
とりあえず、最も重要な関数の定義とクラスの宣言に関してC++とObjective-Cのコードの比較をしていきます

C++のクラスの宣言

class uclass{
private:
    int data;
public:
    int get();
    void set(int n);
    uclass(int num,int n);
    ~uclass();
};

int uclass::get(){
    return data;
}

void uclass::set(int n){
    data=n;
}

uclass::uclass(int num,int n){
    cout << "object number = " << num << endl;
    this->data=n;
}

uclass::~uclass(){
    cout << "deleted object" << endl;
}
趣旨とは異なるので、c++のコード解説は省略します

これをobjective-cで実装しようとすると...

#import <Foundation/Foundation.h>
#import<objc/object.h>

@interface uclass : NSObject
{
    @protected
    int data;
    @public
}
-(int)get;
-(void)set:(int)n;
-(id)initWithn:(int)num:(int) n;
-(void)dealloc;

@end

@implementation uclass : NSObject
- (id)initWithn:(int) num:(int) n
{
    self = [super init];
    if(self != nil){
        self->data = n;
    }
    printf("object number = %d",num);
    return self;
}
-(void)dealloc{
    printf("deleted object\n");
    [super dealloc];
}
- (int)get{
    return data;
}

-(void)set:(int)n{
    data = n;
    return;
}
@end


まず、クラスの宣言ですが
メンバ変数と関数のプロトタイプ宣言を@interface~@endで行います。
そしてメンバ関数本体は@imprementation~@endで行います。
また、関数の宣言方法は

-(返り値型)関数名:(引数型)変数名:(引数型)変数名....

となります。

要素の公開範囲は@privateがそのクラス内、@protectedがそのクラス及びこのクラスをスーパークラスとするクラス(フレンドクラスはあるのだろうか?)、@publicが公開となってます。

また、インスタンス化の動作はクラス内で保証する必要があり、提供されているNSObjectというクラスをスーパークラスとすることで、allocという一般的なインスタンス化の関数を扱うことが出来ます。
そのためインスタンス化の方法はc++では

uclass obj;

で良いのですが
objective-cでは

id obj = [uclass alloc];

と少し面倒な記述になります。
また、コンストラクタデストラクタもc++ように簡単に定義することは出来ず

NSobjectのinitやdeallocという関数をsuper修飾子でスーパークラスの関数であることを明示してから、新たに定義する必要があります。
今回の場合はさらに引数を持つコンストラクタを使うために少し工夫して定義しました。

よってコンストラクタつきインスタンス化の構文は今回の場合

id obj = [[uclass alloc]initWithn:num:n];

となります。非常に気持ち悪いですね。

やはり新しい言語を学ぶというのは容易ではないようです。
今回はこの辺で。


back to TOP

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。