Pinball Crystal Caliburn II、App Storeにて近日発売予定!
Archive for the ‘iOSゲーム開発’ Category
Pinball Crystal Caliburn II for iOS のプレイ動画
Posted in お知らせ, クリスタルカリバーン2, ピンボールゲーム, リトルウイング, iOSゲーム開発, iPad iOS, iPhone on 7月 2, 2012| Leave a Comment »
クリスタルカリバーン2 タイトルスクリーン!
Posted in お知らせ, クリスタルカリバーン2, ピンボールゲーム, リトルウイング, iOSゲーム開発, iPad iOS, iPhone, tagged クリスタルカリバーン, ピンボール プログラミング, iPad, iPhone, iPod Touch, littlewing, pinball on 5月 16, 2012| 2 Comments »
クリスタルカリバーン2 for iOS 進捗状況
Posted in クリスタルカリバーン2, ピンボールゲーム, リトルウイング, iOSゲーム開発, iPad iOS, iPhone, tagged クリスタルカリバーン, リトルウイング, iPad, iPhone, iPod Touch, littlewing, pinball on 3月 29, 2012| Leave a Comment »
明けましておめでとうございます
Posted in クリスタルカリバーン2, ピンボールゲーム, リトルウイング, iOSゲーム開発, iPad iOS, iPhone, tagged クリスタルカリバーン, ピンボール, リトルウイング, iPad, iPhone, iPod Touch, littlewing on 1月 12, 2012| Leave a Comment »
今年はドラゴン年ですね。皆様よいお年をお迎えのことと思います。幸多く平穏・平和な良い一年になりますよう、お祈りしております。
ドラゴンと言えばクリスタルカリバーン2。ドラゴンてんこ盛りのピンボールです。というわけで今年はクリスタルカリバーン年ですね。これはプレイフィールドにいるドラゴンのうちの一匹のドローイング。レイアウトして色を塗られるのを待っています。
今年もどうぞよろしくお願い申し上げます。
クリスタルカリバーン2 クレイモデル!
Posted in クリスタルカリバーン2, iOSゲーム開発, iPad iOS, iPhone, tagged クリスタルカリバーン, ピンボール, iPad, iPhone, iPod Touch, littlewing on 12月 18, 2011| 2 Comments »
クリスタルカリバーン2 for iOS!
Posted in お知らせ, ピンボールゲーム, リトルウイング, iOSゲーム開発, iPhone, tagged クリスタルカリバーン, Crystal Caliburn on 11月 27, 2011| 4 Comments »
只今iOS用のクリスタルカリバーン2を開発中です。本物のアーケードタイプのピンボールになるように、設計から作り直してますよ。これはフジタ君が作った最初のプレイフィールドのドラフトです。今私はプレイフィールド用のマッピングデータを作ってます。なんとも美しい台ですね。乞うご期待ですよ!-Reiko
iPhone/iPadでゲームを開発しよう – その3
Posted in トリスタン, ピンボールゲーム, プログラミング雑記, リトルウイング, iOSゲーム開発, iPhone on 7月 12, 2011| Leave a Comment »
まずは簡単にトライアングルを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でグリグリ回るようになるのです 🙂
iPhone/iPadでゲームを開発しよう – その2
Posted in トリスタン, ピンボールゲーム, プログラミング雑記, リトルウイング, iOSゲーム開発, iPhone on 7月 11, 2011| Leave a Comment »
さて、OpenGL ES2の性能テストをすることにしたわけですが、まずテスト用のモデルを用意しないといけません。ここでは、あまり深く考えずに「ジーラ君」を採用しました:)
「ジーラ君」とはこんなモデルですhttps://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日の私の写真があんな小汚くならなかったんだよな~ 😦
つづく
iPhone/iPadでゲームを開発しよう – その1
Posted in トリスタン, ピンボールゲーム, プログラミング雑記, リトルウイング, iOSゲーム開発, iPhone on 7月 8, 2011| Leave a Comment »
Pinball Tristanの開発過程を思い出しながらiOSのゲーム開発について少し書いてみようと思います。
まず最初に行ったのがOpenGL ES2の性能テストです。ピンボールゲームの場合は60FPSの維持が最優先ですので、そのために3Dモデルの最適化が必要になるのですが、それにはドロップフレーム無しでデバイスが描画できるポリゴンやテクスチャの量を知りたくなるのです。最初は簡単に済むと思っていたのですが・・・これが思ったより大変でした・・・開始早々いきなり想定外 😦
つづく