2012年5月30日水曜日

アクションゲーム、当たり判定、斜めの地面

作業がマンネリ化してきて退屈になってきたので、新しい要素として斜めの床の処理を実装してみた
と同時に今までスーパースクロールアクションで使っていた当たり判定を少しいじって、機能が拡張しやすいように変更しました。


斜めに移動できるようにしています。

やり方は、xの移動量に対してのyの移動量を角度に応じて増やすだけです。

ですが、当たり判定を変更した事や今までのやり方に合わせるなどしていたら、
思ったよりも時間がかかってしまいました。

こういう試行錯誤を繰り返して少しずつ向上していくんだと考えることにして、自分の頭の回転が悪いとは思わないことにします。

たぶん頭のいい人は、あらゆる可能性を考えた上で当たりの判定のプログラムを書いて、
時間がかかるけれども相対的に見たらかかる時間が少なくなるような行動をとるんだろうなー
一方自分はそんなこと考える余裕はないです。

次は、やることはなんだろう。
あーお絵かきかー。
誰か絵かいてくれないかなー

おしまい。

2012年5月24日木曜日

openglで透過して描画(android)

引き続き本で勉強しながら、アクションゲームを作っています。

透過処理をいれてopenglで描画できるように取り組んでアルファをいれた描画を実装しました。
以下結果です。

コントローラの部分とボタンの部分に透過処理をして、背景が透けて見えるようにしました。

前に、透過のやり方が本に載っていないと書いたんですが、やりかたが書いてありましたすいません。サンプルゲームには使用していないと思います。

やり方(本のソースに沿う場合)

SpriteBatcherクラスをいじります。

コンストラクタで,

 // コンストラクタ
    public SpriteBatcher(GLGraphics glGraphics, int maxSprites) {
        // 8 = color(4) + position(2) + u,v(2)(色を入れない場合は4*4になる)                
        this.verticesBuffer = new float[maxSprites*4*8];
        // colorフラグをオン(colorの要素もメモリに追加する)
        this.vertices = new Vertices(glGraphics, maxSprites*4, maxSprites*6,true,true);
        this.bufferIndex = 0;
        this.numSprites = 0;
               
        short[] indices = new short[maxSprites*6];
        int len = indices.length;
        short j = 0;
        // 三角形生成
        for (int i = 0; i < len; i += 6, j += 4) {
                indices[i + 0] = (short)(j + 0);
                indices[i + 1] = (short)(j + 1);
                indices[i + 2] = (short)(j + 2);
                indices[i + 3] = (short)(j + 2);
                indices[i + 4] = (short)(j + 3);
                indices[i + 5] = (short)(j + 0);
        }
        vertices.setIndices(indices, 0, indices.length);               
    }

そして、drawSpriteメソッドで、

    public void DrawSprite(float x, float y, float width, float height, TextureRegion region,float r,
    float g,float b,float a) {
        float x2 = x + width;
        float y2 = y + height;
        // color部分を追加する
        verticesBuffer[bufferIndex++] = x;
        verticesBuffer[bufferIndex++] = y;
        verticesBuffer[bufferIndex++] = r;
        verticesBuffer[bufferIndex++] = g;
        verticesBuffer[bufferIndex++] = b;
        verticesBuffer[bufferIndex++] = a;
        verticesBuffer[bufferIndex++] = region.u1;
        verticesBuffer[bufferIndex++] = region.v2;
        ..以下同じ

    }

これで透過ができました。
ただ容量を食うので、やりすぎると重いです。

しかし、拡張しにくいソースだなー、
後はひたすら絵を書いてプログラムを書きまくるだけなんで、6月に完成できるようにがんばりたいです。

後は、ソースコードがコピペしにくいので、ソースを乗っけるのが大変、
なんかうまくやるブロガーの機能があるんだろうなー。
調べるのが......

がんばろう






2012年5月23日水曜日

beginning android games (マルチタッチ)

beginning android gamesという本で、勉強しながらゲームを作っています。
次の段階ということで必須であろうマルチタッチの実装にかかりました。

本では、マルチタッチのクラスは実装してあるものの、うまい使い方は書いていません。
サンプルゲームでも、タッチの回数だけで、タッチされている場合の処理とか必須であろう部分の
解説はないです。

なので、自分なりに実装するべく色々取り組みました。

そうした結果一応できましたが、効率的なクラスにまとめるというよりは、その場しのぎ
のプログラムになってしまいました。

先に進みたいので、とりあえずできたということで放置して次に進みます。
後、タッチ部分のボタンなどの絵を描いて描画してみました。


左下がコントローラー部分です。
マップはふざけてます。おふざけ路線で作ろうかと思ってます。

後とりあえず、実装する部分は、アルファをかけての描画ですね。
でもこれはたぶん本にかかれてなかったので、調べないとだめですね。

とりあえず、この本の2Dの部分は全部読み終えたので本の勉強は終わりです。
3Dは使わないので、使うときにまた本を開きます。
なんか全然上達した気がしない、自分が悪いのか。

やることがありすぎて、めんどくさくなってしまったーーーー

2012年5月18日金曜日

Beginning Android Gamesで描画してみました。

Beginning Android Gamesを使って勉強ならびに、アクションゲームを作っています。
描画のテストをしてみました。
以下


640*480の画面サイズで、マップチップが32*32です。
なので、全部で300個+主人公きゃらで=301個描画しました。

あんまり期待してなかったのですが、60Fps出ています。
よかった使えそう。

後は、使いやすいようにライブラリー的なものを作って、実装という感じです。
いったん手をつけたものを自分用に使いやすくするのは、自分にとっては難しい。

ちなみに、本ではopengl1.0を使っているのですが、自分はopengl1.1を使いました。
ただopengl11にキャストするだけでいいみたいです。

これからも色々大変そう、完成目標は6月です。面白いのつくるぞー

2012年5月14日月曜日

Beginning android games

アンドロイドのゲーム作りの勉強として、Beginning Android Gamesという本で勉強しています。


洋書で3300円くらいで買いました。
日本語版もでているみたいですが、値段が5000円近く(たぶん)するので、安いほうにしました。


内容は、基本的なゲームのフレームワークを作ってから、opengl1.0の2dと3dをゲームを作りながら
プログラムの解説をしていくという感じです。

読者対象としては、中途半端でよくわかりません。
前提として、javaを知らない人は絶対に無理、androidをまったく知らない人もきついかもしれない。
多少のゲーム作りの経験がないとちょっときついかも。
でもある程度ゲーム作りの経験がある程度ある人には物足りないし、「知っているよ」ということが多くてあんまり意味ないかも、自分もこっち側でした。

とはいえ今までは独りよがりのコードでゲームを作ってきたので、他人のソースを見て、やることは
なんか勉強になるはずと思って、これを参考にしつつ新しいアクションゲームをつくっていきたいと思っています。

本の中身は、説明が丁寧、やたらと長い(600page以上)、欧米人的な感じ(パッケージがbadlogicとか、書いてある文章とか、日本のプログラムの本ではあまり見られない)、そして時々崖から突き落とす。

ソースもダウンロードできます。途中サンプルのゲームを作りながら進んでいくんですが、
2Dのゲームはちょっとひどいです。
解像度も画面幅いっぱいに使ってないですし、それ以前に説明していた当たり判定の方法も使ってなくて、読者の宿題みたいな形にしています。
解像度いっぱいに使ってなくて、端末によっては60近いFPSがでるといっても意味を感じないです。
このゲームから、色々追加していくのは厳しいと思います。

いい点は、説明が丁寧な点です。他にもあるはず忘れましたが。


今回挑戦するテーマは......

1.canvasじゃなくてopenglを使う(1.1)。

2/他人のゲームフレームワークを利用して、javaでのゲーム作りの勉強をする。

という感じです。

でもなかなか、作られたコードの中で新たに追加していくというのは、難しい。
オブジェクト指向じゃないんじゃないか。本を読んでいくと何でこういう使い方するんだろうとか思うことが多いんですよね。なんか無駄なところがたくさんある気がする。
自分で作っていると、無駄なとこはないなと思うんですが、実際そんなことはないんだろうなー。

しかし、canvasでも十分早いし、openglを使う必要があるのか、普段の方法で作ったら
多分半分以下の時間でしあげられるんだけど、やっぱり勉強も必要だと思うのでがんばってやってみたいと思います。
意味あんのかなー・・・・・・・・
わからない。

2012年5月5日土曜日

Freefallをリリース

Freefallというパズルゲームをアンドロイドマーケットにリリースしました。
内容はテトリス+コンボです。
テトリスで消した後に、続けて消すと、コンボになったら面白いのになーと思い作りました。

○タイトル画面

ネットランクはついてないがランキングつき















○ランキング画面

5番まで記録できます。















○ゲーム画面

ブロックを右下の時間内に消すとコンボになり、
点数がさらに増加します。

ちゃっちゃっと作りたかったのですが、
レイアウトとか色々考えながら、作っていると想像以上に時間が
かかってしまいました。

そのうちのプログラムの時間は半分以下になると思います。
ほとんどが絵とか、レイアウトを考えたりする時間になってしまいました。

効率が悪いです。

適当ですが、作るのに2250分以上かかりました。
たぶん遅いんだろうなー。


androidマーケットへのリンクを張るので、よかったら応援してください。
次は、アクションゲームを6月いっぱいを目標に作っていきたいと思います。
そして、いままではcanvasを使って描画していたんですが、今度はopenglを使ってみたいと思います。
canvasでも描画速度が変わらないんで、変更する意味はないんですが、opengl2.0でシェーダーを
触ってみたいんで、その練習にopenglに慣れたいと思います。
勉強過程も書く予定。
いやどうでもいいですね。

↓アンドロイドマーケットへのリンク

https://play.google.com/store/apps/details?id=jp.freefall&feature=more_from_developer#?t=W251bGwsMSwxLDEwMiwianAuZnJlZWZhbGwiXQ..