我正在为我的最后一年项目制作太空射击游戏,并认为包含一个本地乐谱/高分屏幕会很酷。我不知道如何解决这个问题,如果有人能指出我正确的方向,我会非常感激,我在网上发现的所有例子对我来说都很复杂。此外,我希望分数显示在用opengl es渲染的游戏屏幕上。 感谢。
答案 0 :(得分:10)
我刚刚为我正在开发的OpenGL ES游戏创建了一个高分板。正如你的最后一年项目一样,我不会将它用作pastebin,而是给你一些指示。在我的应用程序中,分数被发送到我的PHP脚本,该脚本在MySQL中存储值。
当游戏结束时(所有生命消失,计时器等等)我使用一行代码,与此不太相似:
HighScore hs = new HighScore(context, score, level);
上下文是必需的,因此可以创建AlertDialogs和Toasts。构造函数调用函数submit(),该函数显示要求播放器名称的AlertDialog,然后将数据发送到服务器。
我的类包含这行代码,让玩家知道在收到服务器的响应后他们是否达到前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");
hs.draw(gl);
其中包含一个循环,与此不太相似:
for(int i=0; i<highscores.size(); i++){
text.drawText(gl, highscore.get(i).toString());
gl.glTranslatef(0f, -0.8f, 0f);
}
注意:Text是我写的一个类,用于在屏幕上绘制各种纹理 取决于每个字符的char值,然后是 翻译成一组x,y坐标,与我的相关 字符映射图像文件。
希望这有助于推动您朝着正确的方向前进,并祝您的项目好运
我的Android应用程序使用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方法准备和执行的一个小类,它将结果作为关联数组返回
HighScore Android类: 再次,我不会复制/粘贴,但这将说明如何将数据发布到服务器,接收JSON字符串,然后填充字符串并将其添加到高分数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的评论,并通过基于服务器的方法研究本地存储到高分板
如果复制和粘贴,这些代码段可能不起作用。所以请尝试理解它们并自己编码:)
答案 1 :(得分:0)
好吧,用你想要的任何格式(如姓名,分数,日期等)写一个高分的文件,以便你以后解析。然后,每当你想写一个新的分数时,继续编辑它。盲目阅读并显示它。
答案 2 :(得分:0)
我在同一个项目中做到了,我做了一个对象列表。该对象代表一个高分。如果我需要存储High Scoren列表,我会对列表进行序列化,如果需要显示它,我会反序列化该文件。