今年はドラゴン年ですね。皆様よいお年をお迎えのことと思います。幸多く平穏・平和な良い一年になりますよう、お祈りしております。
ドラゴンと言えばクリスタルカリバーン2。ドラゴンてんこ盛りのピンボールです。というわけで今年はクリスタルカリバーン年ですね。これはプレイフィールドにいるドラゴンのうちの一匹のドローイング。レイアウトして色を塗られるのを待っています。
今年もどうぞよろしくお願い申し上げます。
今年はドラゴン年ですね。皆様よいお年をお迎えのことと思います。幸多く平穏・平和な良い一年になりますよう、お祈りしております。
ドラゴンと言えばクリスタルカリバーン2。ドラゴンてんこ盛りのピンボールです。というわけで今年はクリスタルカリバーン年ですね。これはプレイフィールドにいるドラゴンのうちの一匹のドローイング。レイアウトして色を塗られるのを待っています。
今年もどうぞよろしくお願い申し上げます。
カテゴリー: クリスタルカリバーン2, ピンボールゲーム, リトルウイング, iOSゲーム開発, iPad iOS, iPhone | タグ クリスタルカリバーン, ピンボール, リトルウイング, iPad, iPhone, iPod Touch, littlewing | コメントする »
カテゴリー: クリスタルカリバーン2, iOSゲーム開発, iPad iOS, iPhone | タグ クリスタルカリバーン, ピンボール, iPad, iPhone, iPod Touch, littlewing | 2通のコメント »
只今iOS用のクリスタルカリバーン2を開発中です。本物のアーケードタイプのピンボールになるように、設計から作り直してますよ。これはフジタ君が作った最初のプレイフィールドのドラフトです。今私はプレイフィールド用のマッピングデータを作ってます。なんとも美しい台ですね。乞うご期待ですよ!-Reiko
カテゴリー: お知らせ, ピンボールゲーム, リトルウイング, iOSゲーム開発, iPhone | タグ クリスタルカリバーン, Crystal Caliburn | 4通のコメント »
まずは簡単にトライアングルを1万枚ほどレンダリングするサンプルプログラムを作ってみましょう ![]()

Xcode4のOpenGL ES Applicationテンプレートに以下の変更を行います。
== EAGLView.h
@interface EAGLView : UIView {
@private
// The pixel dimensions of the CAEAGLLayer.
GLint framebufferWidth;
GLint framebufferHeight;
// The OpenGL ES names for the framebuffer and renderbuffer used to render to this view.
GLuint defaultFramebuffer, colorRenderbuffer;
// @fujita-y 深度バッファ用定義をここに追加
GLuint depthRenderbuffer;
// @fujita-y end
}
== EAGLView.m
- (void)createFramebuffer
{
if (context && !defaultFramebuffer) {
[EAGLContext setCurrentContext:context];
// Create default framebuffer object.
glGenFramebuffers(1, &defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
// Create color render buffer and allocate backing store.
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
// @fujita-y 深度バッファの作成をここに追加
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
// @fujita-y end
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
}
- (void)deleteFramebuffer
{
if (context) {
[EAGLContext setCurrentContext:context];
if (defaultFramebuffer) {
glDeleteFramebuffers(1, &defaultFramebuffer);
defaultFramebuffer = 0;
}
if (colorRenderbuffer) {
glDeleteRenderbuffers(1, &colorRenderbuffer);
colorRenderbuffer = 0;
}
// @fujita-y 深度バッファのデリートをここに追加
if (depthRenderbuffer) {
glDeleteRenderbuffers(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
// @fujita-y end
}
}
== notepad_sampleViewController.h(このファイル名は作成したプロジェクトの名前+"ViewController.h"になります)
// @fujita-y GLfloatの乱数その1
static GLfloat random_zero_one() // 0.0 .. 1.0
{
return (float)rand() / (float)RAND_MAX;
}
// @fujita-y GLfloatの乱数その2
static GLfloat random_delta() // -0.025 .. 0.025
{
return (random_zero_one() - 0.5) * 0.5;
}
// @fujita-y drawFrameを書き換え(OpenGL ES2必須)
- (void)drawFrame
{
[(EAGLView *)self.view setFramebuffer];
static GLfloat *vertices;
const int numTriangles = 10000;
const int numVertices = numTriangles * 3;
const int numFloats = numVertices * 3;
// ここで GLfloat *vertices に三角板のデータを用意します。作成するのは最初の一回だけです。
if (vertices == NULL) {
vertices = malloc(sizeof(GLfloat) * numFloats);
for (int i = 0; i < numTriangles; i++) {
GLfloat cx = random_zero_one() - 0.5;
GLfloat cy = random_zero_one() - 0.5;
GLfloat cz = random_zero_one() - 0.5;
// vertex 1
vertices[i * 9 + 0] = cx + random_delta();
vertices[i * 9 + 1] = cy + random_delta();
vertices[i * 9 + 2] = cz + random_delta();
// vertex 2
vertices[i * 9 + 3] = cx + random_delta();
vertices[i * 9 + 4] = cy + random_delta();
vertices[i * 9 + 5] = cz + random_delta();
// vertex 3
vertices[i * 9 + 6] = cx + random_delta();
vertices[i * 9 + 7] = cy + random_delta();
vertices[i * 9 + 8] = cz + random_delta();
}
}
glClearColor(0.2f, 0.1f, 0.2f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glUseProgram(program);
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, 0, 0, vertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glDrawArrays(GL_TRIANGLES, 0, numVertices);
[(EAGLView *)self.view presentFramebuffer];
}
== Shader.vsh
attribute vec4 position;
varying vec4 colorVarying;
void main()
{
gl_Position = position;
colorVarying = abs(gl_Position);
}
で、これをiPod touch 3Gで実行するとCoreAnimationのフレームレートが30fps・・・この段階では目眩のするような遅さです・・・が、最終的には下のような1万5千トライアングルのモデルにアンチエイリアスをかけても60fpsでグリグリ回るようになるのです ![]()

カテゴリー: トリスタン, ピンボールゲーム, プログラミング雑記, リトルウイング, iOSゲーム開発, iPhone | コメントする »
さて、OpenGL ES2の性能テストをすることにしたわけですが、まずテスト用のモデルを用意しないといけません。ここでは、あまり深く考えずに「ジーラ君」を採用しました:)
「ジーラ君」とはこんなモデルですhttp://lwpinball.wordpress.com/2010/12/08/iphone/
さて「ジーラ君」はLightWave3Dで作ったモデルなので、このデータをOpenGL ES2でレンダリングできるデータに変換しないといけません。ここではBlenderを使いました。BlenderはプラグインをPythonで書く事ができる素敵仕様だからです
まずBlenderのプラグインの中からWavefront .obj fileへの出力を行うものを探して、これを少し書き換えてCのstaticデータを書き出すようにします。
次にXcodeに用意されているOpenGL ES Applicationテンプレートを使ってアプリを作り、これを書き換えて「ジーラ君」がiPhoneの画面に出るようにします。この時点では色も質感も無い石膏像のような表示でしたが、かかった時間は1日ちょっと。まずは快調な滑り出しです
でも、この調子が続いていたのなら12月8日の私の写真があんな小汚くならなかったんだよな~
つづく
カテゴリー: トリスタン, ピンボールゲーム, プログラミング雑記, リトルウイング, iOSゲーム開発, iPhone | コメントする »
Pinball Tristanの開発過程を思い出しながらiOSのゲーム開発について少し書いてみようと思います。
まず最初に行ったのがOpenGL ES2の性能テストです。ピンボールゲームの場合は60FPSの維持が最優先ですので、そのために3Dモデルの最適化が必要になるのですが、それにはドロップフレーム無しでデバイスが描画できるポリゴンやテクスチャの量を知りたくなるのです。最初は簡単に済むと思っていたのですが・・・これが思ったより大変でした・・・開始早々いきなり想定外
つづく
カテゴリー: トリスタン, ピンボールゲーム, プログラミング雑記, リトルウイング, iOSゲーム開発, iPhone | コメントする »
Pinball Tristanがバージョンアップでv.1.1になりました。マイナーバグの修正とパフォーマンスのさらなる向上がされています。
現在App Storeでスーパーサマーセール開催中。今ならなんと50%オフの115円ですよ。この機会をどうぞお見逃しなく!
カテゴリー: お知らせ, サポート&アップデート, トリスタン, ピンボールゲーム, iPhone | タグ ピンボール, リトルウイング, iPad, iPhone, iPod Touch, littlewing, pinball, TRISTAN | コメントする »
Pinball Tristan 期間限定サマーセール開始しましたよ!今なら50%オフで115円!どうぞお見逃しなく!!!
Pinball Tristan App App Storeページ
❋❋❋ トリスタンは10ヶ国のApp Storeで「スタッフのおすすめ」に選ばれました ❋❋❋
「アーケードモード」は、実物のフィーリングをそのままに、本格的なピンボールを楽しむモードです。
精緻に開発された物理エンジンは、あなたの多彩なフリッパーテクニックを実物と同様に再現します。あなたの自慢の技を披露してください。高得点を狙ってアップルゲームセンターにあなたのスコアを登録しましょう。
「フリースタイルモード」は、本体を揺らしたり、傾けて、ピンボール台を自由にコントロールしながらプレイする新しいタイプのピンボールを楽しむモードです。
ボールの動きやライトの点滅をラビリンス的に楽しんだり、台の攻略法を考えたり、フリッパーテクニックの練習をしたり、自由なスタイルで楽しめます。

カテゴリー: お知らせ, トリスタン, iPhone | タグ ピンボール, リトルウイング, iPad, iPhone, iPod Touch, littlewing, pinball, TRISTAN | コメントする »