Posts Tagged Objective-C

「OpenGLで作るiPhone SDKゲームプログラミング」が面白かった

アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。

一言で言うと、この本がとても面白かった。
内容は非常にストレートで、「iPhone向けに簡単なレースゲームを作る」という趣旨の本。
1章がOpenGL ES 1.0を使った2Dの取り扱い。画面への描画。
2章がその応用で「はえたたきゲーム」を作る。

はえたたきゲーム


3章が”パーティクルシステム”と呼ばれる煙などの表現に使われる演出の実装。

パーティクルシステム


4章が「2Dレースゲーム」を作る。

2Dレースゲーム


5章が”衝突判定”の実装。

衝突判定の実装と画面調整


6章が全ての章を応用して「3Dレースゲーム」を作る。

3Dレースゲーム

まず、Objective-CとC++の知識が最低限求められる。
あと、最終章の3Dレースゲームと言ってもそれほどのものを期待してはいけない。
ただ、ゲームの骨組みを組む方法や、画面描画と操作の連携などを学ぶことが出来る。
俺みたいな脳たりんには丁度良い内容となった。

基本的なゲームロジックはC++で実装されているため、そのままではつまらないのでObjective-Cで実装することにした。
これがC++のコードとの対比が出来てなかなか面白かった。
実際問題、C++を前提に書いてあるので付け焼き刃な俺のObjective-C知識ではなかなか無駄な処理が出まくっているのはわかっているのだけれども、それでもやって良かったと思う。
書店で見かけたら、ちょっと目を通してみるのもいいかもしれない。
これだけでゲームは作れないけど、本当に良いきっかけを作ってくれると思う。

ちなみに、上記のゲーム画像はアセットこそお借りしたものの、ソースコードは写経+Objective-Cで書き直したものをiPhone 3G上で実際に動かしたもののスクリーンショット。
一応この程度のものは出来る。

また、Windows用になってしまうけれど、この本の冒頭に書いてある参考文献である「ゲームプログラマになる前に覚えておきたい技術」をこの本の次に読むといい気がしてきた。
実は「ゲームプログラマになる前に~」も持ってはいるものの、なかなか読み進められないでいた。
けど、今回の「OpenGLで作る~」を読んでからなんとなく進められるようになってきた。
基本的に本に書かれているコードは執筆時のいずれかの段階のコードなので、実は動かないものも多いけど、ソースコードに当たれば問題ないレベル。
徐々にステップアップして行くには良いかなぁ、と自分に言い聞かせつつ読み進めてまふ。
参考までに。

ゲームプログラマになる前に覚えておきたい技術

著者/訳者:平山 尚

出版社:秀和システム( 2008-11-14 )

定価:¥ 4,860

Amazon価格:¥ 4,860

単行本 ( 872 ページ )

ISBN-10 : 4798021180

ISBN-13 : 9784798021188


そんだけ。

Post to Twitter

, , , , ,

No Comments

Objective-Cのお勉強 #3 セレクタ

iPhone SDK アプリケーション開発ガイドを読んでいた昨今、ど〜しても理解しがたかったのが、メソッド宣言してなくて、しかもそのメソッドが書かれている箇所より上のメソッドより上から呼び出されていて、それがすんなり通る。
でも、その呼び方が不自然で、

[self hoge];

などじゃなく、

        hogeButton = [[UIBarButtonItem alloc] initWithTitle:@"Hoge"
style:UIBarButtonItemStylePlain
target:appDelegate
action:@selector(hoge)];

と言う書き方。
ちなみに、これはアプリケーション開発ガイドのPageDemoと言うプログラムで見ることが出来る。

で、@selectorと言うのがどうにも怪しいので詳解 Objective-C 2.0を手に取る。
で、こんなメソッドが用意されているらしい。

// 引数無し実行
- (id)performSelector:(SEL)aSelector;
// 引数あり実行
- (id)performSelector:(SEL)aSelector withObject:(id)anObject;

こんな感じで呼べるらしい。

内容読んだら関数ポインタをダイナミックにしたような物、と言う雰囲気。
実感湧かないから書いてみることに。
hoge.h

// hoge.h
#import <Foundation/NSObject.h>
@interface Hoge : NSObject
- (void) foo;
@end
@interface Moge : NSObject
@end

hoge.m

// hoge.m
#import "hoge.h"
#import <stdio.h>
@implementation Hoge
- (void) foo {
printf( "Message from Hoge's foo.\n" );
// このコードは動かないから、コメントアウト。
//[self bar];
// このコードは動く
[self performSelector:@selector(bar)];
// モゲが動く
id moge = [[Moge alloc] init];
[moge performSelector:@selector(bar)];
[moge dealloc];
// ホゲが動く
moge = self;
[moge performSelector:@selector(bar)];
}
- (void) bar {
printf("Message from Hoge's bar.\n");
}
@end
@implementation Moge
- (void) bar {
printf("Message from Moge's bar.\n");
}
@end

main.m

main.m
#import "hoge.h"
int main()
{
// idと言う型の変数を定義します
id obj;
// クラスのインスタンス化
obj = [[Hoge alloc] init];
// メソッド呼び出し
[obj foo];
[obj dealloc];
return 0;
}

実行結果

McLaren% gcc -o hoge_test main_hoge.m hoge.m -framework Foundation
McLaren% ./hoge_test
Message from Hoge's foo.
Message from Hoge's bar.
Message from Moge's bar.
Message from Hoge's bar.

なるほどね。。
俺ほどの実力になると、使い時さえ思いつかないと言う有様。
精進します。。。

そんだけ。

Post to Twitter

,

No Comments

iPhone プログラミングノート #1

さてさて、iPhone SDK アプリケーション開発ガイドをパラパラ見ること3章、おぼろげながらiPhoneのプログラミング方法がわかって来たのでちょいと備忘録でも。

で、とりあえずテキトーにiPhoneのプロジェクトを作る。
とりあえずWindow-based Applicationとかで。
恐らく下記のようなファイルが出来るはず。
Classes
・プロジェクト名AppDelegate.h
・プロジェクト名AppDelegate.m
Other Resources
・main.m
・プロジェクト名-Info.plist

あと、その他諸々ついてくるけど、とりあえず気にしないことに。
ただこのままだと○○.xibというファイルを読み込んでしまうので、それを防がなくてはならない。
とりあえずInfo.plistを開いて「Main nib file base name」の項目自体を削除、と。

XML形式で開いてしまったら、当該箇所をやはり削除。
例えば下記のような2行があったら削除。

	<key>NSMainNibFile</key>
<string>MainView.nib</string>

ちなみに、プロジェクト名はHelloWorld・・・と言うことで。

で、エントリーポイント(プログラム実行時、最初に呼び出される関数)はC/C++と同様main。
で、Windowsのように自動でプログラムのループを司るWinMainのような仕組みは、mainに書くことになっているみたい。
ひな形として与えられるのは下記の通り。

#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

なんか、argcとargvをUIApplicationMainに突っ込んでる所からして、ここがプログラムループ、らしい。。
ここの第4引数を下記のように修正。

	int retVal = UIApplicationMain(argc, argv, nil, @"HelloWorldAppDelegate");

ちなみに、.mとか.hとか付けていないのはわざとなので付けないこと。

お次はHelloWorldAppDelegate.hと同.mを編集。

// HelloWorldAppDelegate.h
#import <UIKit/UIKit.h>
// メッセージ表示用にUITextViewと言うビューを継承し、カスタムビューを作成
@interface CustomView : UITextView
{
// カスタムビュー用のメンバ変数
UITextView *myTextView;
}
@end
@interface HelloWorldAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
CustomView *mainView;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
// HelloWorldAppDelegate.m
#import "HelloWorldAppDelegate.h"
@implementation CustomView
- (id)initWithFrame:(CGRect)frame {
// 親クラスの親メソッド呼び出し
self = [super initWithFrame:frame];
// 親メソッド取得成功時のみ実行
if (self != nil) {
// テキストビューを初期化
myTextView = [[UITextView alloc] initWithFrame:frame];
// テキストビューへテキスト追加
myTextView.text = @"おはこんばんちは";
// テキストビューをこのカスタムビューに適用?
[self addSubview:myTextView];
}
return self;
}
- (void)dealloc {
// メモリ解放
[myTextView release];
[super dealloc];
}
@end
@implementation HelloWorldAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// バウンズ(画面領域)を取得
CGRect bounds = [[UIScreen mainScreen] applicationFrame];
// ウィンドウの範囲を画面サイズギリギリまで占有
window = [[UIWindow alloc] initWithFrame:bounds];
// ビューのサイズをステータスバーを除いて占有
mainView = [[CustomView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height)];
// ウィンドウへビューを設定
[window addSubview:mainView];
// ビューを表示
[window makeKeyAndVisible];
}
- (void)dealloc {
[mainView release];
[window release];
[super dealloc];
}
@end

これをコンパイルするとこんな感じ。

ふむふむ、何となくわかったような、わからないような。
実際はこの次のViewControllerまでやってるんだけど、復習はここまで。
本のコードとちょっと違うのはやはりわざと。
行儀が良いのか悪いのかは知らんけど、これでも動く。

そんだけ。

Post to Twitter

, , , , ,

No Comments

Objective-Cのお勉強 #2 ファイルの分割とコンパイル

前回はクラスとメソッドを定義し、それをmain関数から呼び出すと言うことに。
前回までのソースは下記の通り。

// engine.m
#import <Foundation/NSObject.h>
#import <stdio.h>
@interface Engine : NSObject
- (void) startEngine;
@end
@implementation Engine
- (void) startEngine
{
printf( "Start my engine!\n" );
}
@end
int main()
{
// idと言う型の変数を定義します
id obj;
// クラスのインスタンス化
obj = [[Engine alloc] init];
// EngineクラスのstartEngineメソッドを呼び出します
[obj startEngine];
return 0;
}

Read the rest of this entry »

Post to Twitter

, , , ,

No Comments

Objective-Cのお勉強 #1 簡単なクラスとメソッドの説明

今回は「クラス」と「メソッド」と言うものについて勉強して行こうじゃないですか、と。
まず、クラスと言うものは、プログラムの部品だと思って下さい。
オイラは自動車が好きなのでそれで例える。

1つのプログラムが自動車そのものだとしたら、クラスとはなでしょ?
答えは簡単で、それはボディーであったり、エンジンであったり、タイヤであったり、サスペンションであったりする。
エンジンも細かく分けて行けばカムシャフトやら、ピストンやら、ブロックやらたくさんある。
それがプログラムで言うところの「メソッド」。

では、実際のコードでエンジンクラスを作っていきましょうかね。
Read the rest of this entry »

Post to Twitter

, , , ,

No Comments

Objective-Cのお勉強 #0 準備篇

MacやらiPhoneでプログラミングをする場合、CやC++、はたまたJavaなんかを思い浮かべる時代はとうに終わったそうです。。

それを突きつけられたのがこの前バージョンアップしたOS、Mac OS X Snow Leopard。
これに対応したIDE(開発環境)であるXcode 3.2のテンプレートから、C/C++用のCarbonと呼ばれる環境用のテンプレートが無くなり、Javaなんかは結構前から無かったり、PythonやRubyもサポートされていたようなんだけど、それも削除。
xcode3.2_new_project
マカー系プログラマに残された道はObjective-CベースのCocoa環境しか無いわけですよ。
んじゃ、やっぱ勉強しますか。
CやC++でさえ怪しい身分ですが。。。

Read the rest of this entry »

Post to Twitter

, , , , ,

No Comments