私は最終年度のプロジェクトのためにスペースシューターを作っていますが、ローカルスコア/ハイスコア画面を含めるのはクールだと思いました。私はこれについてどうやって行くのか分かりません、そして誰かが私を正しい方向に向けることができれば本当にありがたいです、私がオンラインで見つけたすべての例は私には非常に複雑に見えます。また、openglesでレンダリングされたゲーム画面にスコアを表示したいと思います。ありがとう。
3 に答える
現在取り組んでいるOpenGLESゲームのハイスコアボードの作成が完了しました。それはあなたの最終年のプロジェクトのためなので、私はこれをペーストビンとして使用しませんが、代わりにあなたにいくつかの指針を与えます。私のアプリケーションでは、スコアはMySQLに値を格納するPHPスクリプトに送信されます。
私が使用したもの:
- ハイスコアに関係するすべてを処理する新しいクラス
- AlertDialog"alertName"-プレーヤー名を尋ねる
- EditText "input"がalertName.setView(input);でダイアログに追加されました。
- AsyncTaskを使用してスコアをサーバーに送信する
- これは、内部、外部、またはSQLliteデータベースのいずれかの他のデータストレージオプションに置き換えることができます
ゲームが終わったとき(すべての人生が終わった、タイマーが上がったなど)、私はコードの行を使用しますが、これとあまり似ていません:
HighScore hs = new HighScore(context, score, level);
AlertDialogsとToastsを作成できるように、コンテキストが必要です。コンストラクターは、プレーヤー名を要求するAlertDialogを表示する関数submit()を呼び出してから、データをサーバーに送信します。
私のクラスには、サーバーから応答を受信した後にトップ100に到達したかどうかをプレーヤーに知らせるために、次のコード行が含まれています。
Toast.makeText(mContext, "You didn't make the score board",
Toast.LENGTH_SHORT).show();
ハイスコアリストはArrayListに保存されます
private ArrayList<String> highscores = new ArrayList<String>();
そして、データはこれと同様の方法でString.formatを使用してパディングされます。
highscore_headers = String.format("%7s","rank") +
String.format("%11s","name") +
String.format("%10s","score") +
String.format("%5s","lvl");
その後:
レンダラーのonDrawFrame内で、ハイスコアクラスを作成して、以下の1つのライナーのようなものを呼び出すことができます。これには、変換が含まれ、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);
}
注:テキストは、各文字の文字値に応じて画面にさまざまなテクスチャを描画するために作成したクラスであり、文字マップ画像ファイルに関連する一連のx、y座標に変換されます。
これがあなたを正しい方向に押し進めるのに役立つことを願っています、そしてあなたのプロジェクトで幸運を祈ります
OpenGLESを使用してレンダリングされたAndroidアプリのハイスコア状態のスクリーンショット
編集:PHPへのスコアの送信
これは私のソースの正確なコピーアンドペーストではありませんが、うまくいけば、すべての一般的なアイデアを提供するのに十分な情報がここにあります。私の最終的なコードは、デバイスに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メソッドの準備と実行をラップするために作成した小さなクラスであり、連想配列として結果を返すことに注意してください。
HighScore Androidクラス: 繰り返しますが、コピー/貼り付けはしませんが、サーバーにデータを投稿し、JSON文字列を受け取り、文字列を埋めてhighscoresArrayListに追加する方法を説明します。以下のコードは、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のコメントを真剣に検討し、ハイスコアボードへのサーバーベースのアプローチでローカルストレージを調査します
これらのコードスニペットは、コピーして貼り付けると機能しない可能性があります。ですから、それらを理解して自分でコーディングしてみてください:)
さて、後で解析しやすいように、高スコアのファイルをuが望む形式(名前、スコア、日付など)で記述します。そして、新しいスコアを書きたいときはいつでも編集を続けてください。盲目的に読んで表示してください。
私は同じ種類のプロジェクトでそれを行い、オブジェクトのリストを作成します。このオブジェクトは1つのハイスコアを表します。ハイスコアのリストを保存する必要がある場合は、リストをシリアル化し、表示する必要がある場合は、このファイルを逆シリアル化します。