4

2Dゲームを作成したいのですが、知識の背景とゲーム自体の詳細を考慮して、どちらに進むべきかを知りたいです。

私の経歴(関連するもの):

  • 私は10日前にAndroidプログラミングを学び始め、ゲームメニューを作成しました。

  • 私はJava(デスクトップ用)でプログラミングした経験がかなりあります。

  • 私は過去にC++でopenGLを使用した経験がありますが、3Dの作業しか行っていません(また、私が学んだ多くのことを覚えていません)。オープンGLシェーダーをプログラムしたことはありません。回転/スケーリング/変換、テクスチャ(テクスチャ座標)の適用、いくつかの非常に原始的なライトなどの基本的な変換などを学びました。

ゲームには次のものがあります。

  • スプライト。フレームごとに+-50の平均が表示されます。

  • ピンチしてジェスチャーをズーム/パンします。

  • この機能:たとえば、あるスプライトを別の場所に移動し、指を使って進むべき道を描くことができます。これは、どのズームレベルでも可能です。

  • 音。銃声、爆発、単純な短い音。

  • ボーナスとして、グローのあるライン、ワープエフェクトなどのエフェクトがあると便利ですが、これは実際には必須ではありません。

  • 円/正方形/三角形などの幾何学的形状を描く簡単な方法があるはずです(つまり、ゲーム自体ではなく、それを開発するために使用されるAPIで)

ゲームを半月で終わらせたいです。

さて、ゲームの特徴、私の経歴、そして利用可能な時間を与えられれば、最善の解決策は何だと思いますか?OpenGL ES 2.0?キャンバス?またはAPI/グラフィックス/ゲームエンジン/ライブラリ(どれですか、ドキュメント/チュートリアルはありますか?)?

ゲーム自体はシンプルです。私が言及したことは、少なくとも私にとっては、ここでは本当に大きなことです。

私と特徴を共有するゲームの例は次のとおりです: OsmosSpirit

4

3 に答える 3

7

まず、Canvasはゲームを実行できません。しかし、私が完全にキャンバス「Squirrel Wars」(市販)で行ったゲームを見ると、それは平均的なデバイスでキャンバスを使用するゲームの制限についてです。

Canvasの使用に関する問題は、操作する必要のあるメモリの制限と、ハードウェアアクセラレーションされていないためのFPSの制限です。

最大の制限であり、OpenGL ES 1.1に切り替える理由の1つは、OpenGLを使用すると、必要に応じてiOSへの移植がはるかに簡単になることです。

また、OpenGL ESを使用すると、実行する操作を大幅に制御でき、画面を乱雑にすることなく画面に収まるように、多くのスプライトを保持するのに十分なはずです。

私が設計している現在のOpenGLゲームでは、300〜400のスプライトを25〜32FPSでフレームにレンダリングできます。

ただし、スプライトの描画を画面上のものに制限することで、20〜50のように、約60〜70FPSを維持します。

OpenGLには学習曲線がありますが、学ぶ価値はあります。紹介されてトピックを調査してから2日間で設計した2DFrameWorkがあり、2Dのすべてのニーズを完全に満たしています。

これで、FrameWorkを再利用して、デザインしたい2Dゲームに使用できるようになりました。

それの多くを与えることなく、ここにあなたを始めるためのいくつかのコードがあります

    import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;

public class RunGameActivity extends Activity{
private GLSurfaceView glSurfaceView;
private GLRenderer GLRENDERER;

@Override
public void onCreate(Bundle savedInstanceState) {
    /***************************************************************************************** 
     * This is called when this activity is first creates.
     * First we remove the title bar, make our app full screen
     * It is set to landscape in the manifest file.
     * We than create our OPENGL ES surfaceview and its renderer for us to use
     * and finally setContentView() view so we see the OPENGL ES surfaceview
     * ***************************************************************************************/
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    super.onCreate(savedInstanceState);

    Log.d("RunGameActivity", "onCreate");

    glSurfaceView = new GLSurfaceView(this);
    GLRENDERER = new GLRenderer(this);
    glSurfaceView.setRenderer(GLRENDERER);
    setContentView(glSurfaceView);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    /***************************************************************************************** 
     * Here we get the incoming on touch event and send it down towards our game
     * via the GLRenderer class. The game does all the actual work with it.
     * ***************************************************************************************/
    Log.d("RunGameActivity", "OnTouchEvent");
synchronized(this) {
        GLRENDERER.HandleMotionEvent(event);
}
    return true;
}



/* Remember to resume the glSurface  */
@Override
protected void onResume() {
    /***************************************************************************************** 
     * Called when app resumes
     * ***************************************************************************************/
    super.onResume();
    glSurfaceView.onResume();
    Log.d("RunGameActivity", "onResume");
}

/* Also pause the glSurface  */
@Override
protected void onPause() {
    /***************************************************************************************** 
     * Called when app pauses
     * ***************************************************************************************/
    super.onPause();
    glSurfaceView.onPause();
    Log.d("RunGameActivity", "onPause");
}

}

私は本当にすべてを与えることを望んでいません、その価値は学ぶ

しかし、頂点、テクスチャ、動的テキストの作成から入力の処理、フレームレートに依存しない動きの管理、重力の処理、衝突の検出まで、すべてを非常に整理された方法で処理する方法を作成しました。 、およびアニメーション化するスプライト。言うまでもなく、AdMob広告、inAppBilling、およびこれまでに必要となるすべてのサウンドを処理します。

読み始めてください。そのウェブ全体、そして本の中で。あなたが良い本を見つけることができれば40ドルの投資の価値があります。

自分でカスタム作成する必要のあるコードの多く。ただし、独自のフレームワークを設定する価値はあります。

繰り返しになりますが、OpenGL1をお勧めします。*必要なすべてのデバイスと互換性があります。

提供したコードを開始するには、コードをコピーしてアクティビティに貼り付け、オブジェクトを右クリックして、クラスを作成します。Eclipseは、基本的なものの多くを自動的に通知/入力します。

于 2012-08-10T02:55:46.067 に答える
3

Android 3.0より前のデバイスを含めたい場合は、キャンバスを使用しません。ハードウェアアクセラレーションではないため、非常にひどいフレームレートが得られます。

android 2.3デバイスでキャンバスを少し試してみましたが、ハイエンドプロセッサを使用しても、テクスチャのある正方形を画面上でスライドさせるには、ひどく途切れることはありませんでした。

Android 3および4にはハードウェアアクセラレーションによるビューがありますが、2.3の場合、リモートで再生できるようにするには、GPUを使用する必要があると思います。GPUアクセラレーションがない場合は、特殊効果(パーティクル、グローなど)も忘れることができます。

OpenGLはここに行く方法だと思います。または、APIを自分で処理したくない場合は、OpenGLラッパーライブラリ(AndEngineが人気があるようです)を使用できます。

于 2012-08-10T01:20:24.960 に答える
0

AndEngineを使用してゲームを作成することをお勧めします。ハードウェアアクセラレーション(OpenGL ESを使用)であり、スプライトを操作するための優れたAPIを提供します。

于 2012-08-13T08:36:41.680 に答える