2012-04-19 17 views
-1

私は最後の1年間のプロジェクトで宇宙飛行士を作っていて、地元のスコア/ハイスコアのスクリーンを入れるのがクールだと思っていました。私はこれについてどうやって行くのか分かりませんし、誰かが正しい方向に向けることができれば本当に感謝します。また、私はopenglでレンダリングされたゲーム画面にスコアを表示したい。おかげさまで Androidゲームハイスコアの実装

答えて

10

私が現在取り組んでいるOpenGL ESゲームのハイスコアボードの作成が終了しました。 最終年度のプロジェクトでは、これをペーストビンとして使用するのではなく、いくつかの参考にします。私のアプリケーションでは、スコアはMySQLに値を格納するPHPスクリプトに送られます。

私が使用したもの:

    高得点
  • AlertDialog「alertName」を行うには、すべてを扱う
  • 新しいクラス - プレイヤー名のためにalertNameとのダイアログに追加
  • のEditText「入力」を依頼します.setView(入力);ゲームが終了すると、これは他のData Storageオプション、内部、外部、またはSQLliteいずれかデシベル

に置き換えることができAsyncTask

  • を使用してサーバーにスコアを提出
  • (すべての人生が消えて、タイマーアップなど)私はコードの行を使用して、これにあまり類似していない:

    HighScore hs = new HighScore(context, score, level); 
    

    AlertDialogとToastを作成できるようにコンテキストが必要です。コンストラクタは、プレーヤー名を要求するAlertDialogを表示して、サーバにデータを送信する関数submit()を呼び出します。

    私のクラスは、応答がサーバから受信した後、彼らはトップ100に達した場合、プレイヤーが知っているように、このコード行が含まれています。ハイスコアリストはArrayListの中に保存されている

    Toast.makeText(mContext, "You didn't make the score board", 
         Toast.LENGTH_SHORT).show(); 
    

    private ArrayList<String> highscores = new ArrayList<String>(); 
    

    データはStringを使用して埋められます。あなたの翻訳が含まれていると思われる、以下の1つのライナーのようなものを呼び出すことができますので、あなたはハイスコアのクラスを構築することができ、あなたのレンダラのonDrawFrame内

    、スケール:

    highscore_headers = String.format("%7s","rank") + 
         String.format("%11s","name") + 
         String.format("%10s","score") + 
         String.format("%5s","lvl"); 
    

    、その後:これと同様のやり方でフォーマットhighScoreデータを画面に描画するためにpushMatrixとpopMatrixを呼び出します。これまであまり異ならないループが含まれてい

    hs.draw(gl); 
    

    for(int i=0; i<highscores.size(); i++){ 
        text.drawText(gl, highscore.get(i).toString()); 
        gl.glTranslatef(0f, -0.8f, 0f); 
    } 
    

    注:テキストは、私はそれぞれのchar型の値に応じて、画面 上の様々なテクスチャを描画する書いたクラスであります文字は で、 文字マップイメージファイルに関連するx、y座標のセットに変換されます。

    ・ホープこれはあなたのプロジェクトを正しい方向にあなたをプッシュするのに役立ちます、そして最高の幸運


    私のAndroidアプリのハイスコア状態のスクリーンショットは、OpenGL ES a screenshot of my android app's high score state rendered using OpenGL ESを使用してレンダリング


    編集:送信評価点:

    これは私のソースの正確なコピーと貼り付けではありませんが、うまくいけば、ここにあなたの全体的な考え方を与えるのに十分な情報があります。私の最終的なコードは、デバイスにuniqidも与えます。ユーザーは、データベースに格納されているすべてのスコアを追跡できますが、それは別のものです。

    PHPファイル: 私は、私のベータ版の目的のために、私は単なるテキストのエントリを選択しました迅速に公開ゲームを取得スコアをハッシュ、署名要求で周りの混乱をしました。下記のコードは、選手がサブミットしたスコアを強調表示したり、時間に基づいてランクを取得したりすることについて詳しくは示していません。

    if(isset($_POST['name']) && isset($_POST['score'])){ 
        $sql = "INSERT INTO highscores(name, score) VALUES (:name, :score)"; 
        $data = array(":name"=>$_POST['name'], ":score"=>$_POST['score']); 
        $db->run($sql, $data); 
        echo display(); 
    } 
    function display(){ 
        $sql = "SELECT name, score FROM highscores ORDER BY score DESC"; 
        $result = $db->run($sql, array()); 
        return json_encode($result); 
    } 
    

    $ dbオブジェクトが

    ハイスコアアンドロイドクラス連想配列として結果を返す私はPDOの方法が用意ラップして実行するために作られた小さなクラス、あることに留意すべきである:再び コピー&ペーストはしませんが、これはサーバーにデータを投稿し、JSON文字列を受け取った後、文字列をパディングしてhighscores ArrayListに追加する方法を示します。以下のコードはHighScoreクラスのコンストラクタです。ユーザーの入力を求めます。

    List<NameValuePair>nameValuePairs = new ArraList<NameValuePair>(2); 
    AlertDialog alertName; 
    DefaultHttpClient client = new DefaultHttpClient(); 
    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
    String response = ""; 
    
    HighScore(Context context, int score){ 
        nameValuePairs.add(new BasicNameValuePair("score", + score.toString())); 
        alertName = new AlertDialog(context).create(); 
        EditText input = new EditText(context); 
        alertName.setTitle('Enter Your Name'); 
        alertName.setButton(AlertDialog.BUTTON_POSITIVE, "OK", 
         new DialogInterface.OnClickListener(){ 
          @Override 
          public void onClick(DialogInterface dialog, int which){ 
           nameValuePairs.add(
           new BasicNameValuePair("name", input.getText().toString()) 
           ); 
           SubmitAsync sa = new SubmitAsync(); 
           sa.execute(); 
          } 
        }); 
        alertName.show(); 
    } 
    

    SubmitAsyncクラスは、HighScoreクラスのサブクラスであり、httpクライアントがデータを送信し、受信したデータを追加するように設定します。データは、JSONとして消化され、前述のように文字列がパディングされ、その後、非常に基本的ですハイスコアのArrayList

    class SubmitAsync extends AsyncTask<String, Void, Void>{ 
        @Override 
        protected Void doInBackground(String... params){ 
         HttpPost postMethod = new HttpPost("http://address-of-script.php"); 
         postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
         response = client.execute(postMethod, responseHandler); 
         JSONArray jsonArray = new JSONArray(response); 
         for(int i=0; i<jsonArray.length(); i++){ 
          JSONObject j = jsonArray.getJSONObject(i); 
          String name = String.format("%11s", j.get("name")); 
          String score = String.format("%10s", j.get("score")); 
          highscores.add(name + score); 
         } 
        } 
    } 
    

    に加えて、私は、任意の時点でここに入っていると言っているだろうより多くのコードをたくさんそして最も確かに私の最長のポスト。私は真剣に@Danのコメントを検討し、コピーして貼り付けた場合、これらのコードスニペットはおそらく動作しません

    ハイスコアボードに自分のサーバーベースのアプローチを超えるローカルストレージを研究します。だから、それらを理解し、自分自身をコーディングしてみてください:)

+0

おかげTerryProbert、それは私がしたい正確に何ですが、どのようにPHPスクリプトにスコアを送信しますか?私は指導のためにあなたの高いスコアのコードを見ても構いません。私はそれに応じてあなたを参照します。もう一度ありがとう。 –

+1

@MichaelSeunAraromi PHP/MySQLに関する事前知識がなくても、おそらくあなたのプロジェクトからそれを稼働させるのに十分なことが分かるでしょう。さらに、あなたのゲームにはサーバー側のコンポーネントも必要になります。ローカルストレージオプションを調べ、TerryProbertのガイダンスを使ってハイスコア画面を作成する必要があるようです。 – Dan

+0

私は私が持っているものの非常に剥奪されたバージョンで私のポストを更新する過程にあるにもかかわらず、@ダンに同意する。 JSONObjectsとローカルストレージ/ SQLiteとのサーバレスポンスの原則が同じではないことは残念です – TerryProbert

0

あなたが望むどんな形式(名前、スコア、日付など)であっても、高スコアのファイルを後で解析する方が簡単です。そして、新しいスコアを書きたい時に毎回編集してください。盲目的にそれを読んでそれを表示する。

0

私は同じ種類のプロジェクトでそれを行うのですか、オブジェクトのリストを作成します。このオブジェクトは1つのハイスコアを表します。 High Scorenのリストを保存する必要がある場合は、リストをシリアル化して表示する必要がある場合は、このファイルを逆シリアル化します。