Androidでゲーム作り

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Androidでゲーム作り

投稿記事 by Dixq (管理人) » 13年前

ゲーム要素が無いなんてうちの館じゃない!
ってことで、SurfaceViewを使った小さなサンプルを作ろうとして始めたのに何故かガチで作りたくなってしまったDixqです、こんばんは。

今朝から作り始めてまぁなんとか遊べるものにはなったような、なっていないような。。。

加速度センサーを使ってイライラ某的なゲームを作りました。
素材は使わず全て標準の図形を描くメソッドのみで出来ています。

画像

灰色の壁は当たっても大丈夫。赤い壁は当たるとアウト。当たらずに緑のゴールを目指そうというゲームです。

1日で作ったようなものですが、apkファイル配布していますので、よろしければどうぞ

http://dixq.net/blog/Android/resQ_v1.01.apk

・戻るボタンでやり直し出来ます。
・ゆっくり壁に接触して止まると不具合がおきるかも。。。

難しかったのはボールが壁にあたると跳ね返ったり、傾けると障害物に当たりながらも低い方に流れていく処理。
とりあえず図形のパスと自機であたり判定計算して、パスのベクトルと自機の進行方向ベクトルから反射角計算して、反射させてるんですが、
速度が0だと反射しないので、壁に接触して止まった状態で傾けると低い方に動かないんですよね。。。

それと四角形の角にぶつかると刺さることがある。。。
計算しているパスのベクトルが角は2つあるからでしょうが、う~むなんかいい王道な計算方法あるんですかねぇ。。

実装したいい加減コードはこちら
http://dixq.net/blog/Android/resQ_v1.01.zip

クラス図
画像

ゲーム作るにはGL使わないとダメかなと思ってましたが、SurfaceViewでも十分ですね。
3D表示はできませんが。

※追記※
・縦固定西、横回転しないようにしました。
・画面のタイムアウトを無しにし、自動的にスリープにしないようにしました。

※追記2※
・Android1.6に対応したバージョンも作りました。
http://dixq.net/blog/Android/resQ_1.6_v1.02.apk
最後に編集したユーザー Dixq (管理人) on 2012年1月28日(土) 02:12 [ 編集 3 回目 ]

アバター
shiro4ao
記事: 224
登録日時: 14年前

Re: Androidでゲーム作り

投稿記事 by shiro4ao » 13年前

おお、このゲームは!
昔Flashで似たのがあってずいぶんとはまっていました(^_^;)
しかし、1日とは・・・ とてつもない生産性ですね。

アバター
gont
記事: 1
登録日時: 13年前

Re: Androidでゲーム作り

投稿記事 by gont » 13年前

アプリとソースコードをダウンロードさせてもらいました。
いやぁ~、難しいっスね(笑)
20回ほどチャレンジしましたが、回転板の通路が鬼門ですね。
あとは灰色の壁にぶつかった反動で赤い壁にぶつかって自滅したり…(笑
途中、何度も横持ち縦持ち切り替えてやっていたら、画面の表示がおかしくなることがありました。
どうやら、ゲームスタート時のカウントダウンの時に持ち方を変えると発生するようです。

この間、本を一冊買ってその本に載っていたハエ叩きアプリを真似っこして作って遊んでみました。
OpenGLを使ったアプリでしたが、それを使わなくても、結構スイスイ動くんですね!

OpenGLは文字列を描画する際にテクスチャがどうのこうのという事だったので、うわぁ…と思っていたのですが、あまり激しく動かないゲーム(RPGとか?)ならOpenGL無しでも十分いけるかもしれませんね!

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: Androidでゲーム作り

投稿記事 by Dixq (管理人) » 13年前

> shiro4aoさん

あ~ありましたね~。
最終段階に差し掛かった時、ものすごい爆音と共にグロイ画像が出てびっくりさせる最凶コンテンツもありましたね。。。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: Androidでゲーム作り

投稿記事 by Dixq (管理人) » 13年前

> qontさん

遊んで下さってありがとうございます^^
コメント頂いたことをv1.01で反映させました。
→横に持ち替えても、横表示にしないようにしました。
→画面のタイムアウトを無くし、スリープにならないようにしました。

ハエ叩きって、あの黒い本ですね。
オライリーのOpenGL ESの本が詳しいですよ。

SurfaceViewとGLSurfaceの実行速度の比較はまだやってないですが、そんなに変わらないんじゃないかと思ってます。
こちらに比較結果検証したデータがありますが、
http://android20092009.blog67.fc2.com/b ... ry-50.html
下手したらGLにすると遅くなる場合もあり、3Dを使わないならOpenGLESを使う理由はないんじゃないかと
最後に編集したユーザー Dixq (管理人) on 2012年1月22日(日) 13:24 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: Androidでゲーム作り

投稿記事 by ISLe » 13年前

壁の外側から内側に向けて当たったときだけ反射するようにすると、座標の補正やら角のめり込みやら面倒なことを省けます。
めり込む瞬間がありますけど気にならないレベルだと思います。
気になるようなら細かく動かす必要があります。

壁の法線ベクトルは線分の両端の座標のXとYを入れ替えるだけで求まります。
それと前回の座標から今回の座標に向けた移動ベクトルの内積をとると衝突する向きかどうかが分かります。

壁に接触すると止まるというのは重力加速度を加算してないのですかね。
センサーの傾きをそのまま加算しているみたいですけど、壁の接触面とステージの傾きを考慮して重力加速度を三次元に分解して加算する必要があります。

あとJavaではインデックスでループ回すと遅いのでリストにすると良いと思います。

アバター
SAI
記事: 115
登録日時: 14年前

Re: Androidでゲーム作り

投稿記事 by SAI » 13年前

姉がアンドロイド携帯持ってたので借りてきました。
が。
インストールの方法がわからない・・・orz

もう解約したやつなので普通のやり方ではできないのでしょうか。
いろいろ調べると、PC→SD→携帯と呼び出す方法があるみたいで、やってみましたが
「パッケージの解析中に問題が発生しました」というエラーが出て開けませんでした。
無念・・・(´・ω・`)

ISLe
記事: 2650
登録日時: 14年前

Re: Androidでゲーム作り

投稿記事 by ISLe » 13年前

SAI さんが書きました:「パッケージの解析中に問題が発生しました」というエラーが出て開けませんでした。
無念・・・(´・ω・`)
提供元不明のアプリのインストール許可にチェックが入ってないのでは?
『設定』→『アプリケーション』→『提供元不明のアプリ』

アバター
SAI
記事: 115
登録日時: 14年前

Re: Androidでゲーム作り

投稿記事 by SAI » 13年前

>ISLeさん
解決策ありがとうございます!
調べてみましたが、チェックが入ってました・・・。(´・ω・`)

アバター
lriki
記事: 88
登録日時: 14年前

Re: Androidでゲーム作り

投稿記事 by lriki » 13年前

私が初めて作ったAndroidでゲームと何となく似ててびっくりしましたw
こういうゲームって「Android使ってるぞーっ」ていう感じがシンプルに出てて好きです。



実行速度に関するお話がちょっと見えたので、気になったことを少し。

私がゲームを制作していたとき、いくつかの端末を学校の備品から借りることができたので
SurfaceViewを使って作ったゲームを走らせてみました。

モデルはXPERIAとGalaxy(詳しく確認しませんでしたが、多分1~半年前のもの)でしたが、
Galaxyではゲーム難易度に影響が出るレベルで処理落ちしてました。
(加速度センサーの感度もGalaxyの方が鈍かったです)

しばらくAndroidには触ってませんが、今 OpenGL ES にするとどうなのかなって思いました。


モデルもどんどん新しくなってるので古い情報かもしれませんけど、
こんなことがありましたよーということでコメントさせていただきました。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: Androidでゲーム作り

投稿記事 by Dixq (管理人) » 13年前

>ISLeさん

なるほど、調べるベクトルを予め絞るのは手ですね。
ありがとうございます。

>壁の法線ベクトルは線分の両端の座標のXとYを入れ替えるだけで求まります。

これは目からうろこでした。。。
貴重な情報ありがとうございます。

>Javaではインデックスでループ回すと遅いのでリストにすると良いと思います。

そうですね、LinkedListの場合は特にiteratorを使うようにします。