-1

我正在为我的最后一年项目制作太空射击游戏,并认为包含本地分数/高分屏幕会很酷。我不知道该怎么做,如果有人能指出我正确的方向,我将不胜感激,我在网上找到的所有示例对我来说都非常复杂。我还希望分数显示在使用 opengl es 渲染的游戏屏幕上。谢谢。

4

3 回答 3

10

我刚刚为我目前正在开发的 OpenGL ES 游戏创建了一个高分板。因为这是最后一年的项目,我不会把它用作粘贴箱,而是给你一些指示。在我的应用程序中,分数被发送到我的 PHP 脚本,该脚本将值存储在 MySQL 中。

我用了什么:

  • 处理所有与高分有关的新课程
  • AlertDialog "alertName" - 询问玩家姓名
  • 使用 alertName.setView(input) 将 EditText "input" 添加到对话框中;
  • 使用 AsyncTask 将分数提交到服务器
    • 这可以替换为其他数据存储选项,内部、外部或 SQLlite db

当游戏结束时(所有生命都消失了,计时器到了等),我使用了一行代码,与此不太相似:

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");

接着:

在您的渲染器的 onDrawFrame 中,您可以构建高分类,这样您就可以调用类似下面的一个衬里,其中将包含您的翻译、缩放 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);
}

注意:Text 是我编写的一个类,用于根据每个字符的 char 值在屏幕上绘制各种纹理,然后将其转换为与我的字符映射图像文件相关的一组 x,y 坐标。

希望这有助于将您推向正确的方向,并祝您的项目好运


使用 OpenGL ES 渲染的我的 android 应用程序高分状态的屏幕截图 使用 OpenGL ES 渲染的我的 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 方法 prepare 和 execute 制作的一个小类,它以关联数组的形式返回结果

HighScore Android 类: 同样,我不会复制/粘贴,但这将说明如何将数据发布到服务器,接收 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 的评论,并通过基于服务器的方法研究本地存储以获得高分板

如果复制和粘贴这些代码片段可能不起作用。所以请尝试理解它们并自己编写代码:)

于 2012-04-19T09:58:38.307 回答
0

我已经在同一个项目中这样做了,我做了一个对象列表。这个对象代表一个高分。如果我需要存储 High Scoren 的列表,我会序列化列表,如果我需要显示它,我会反序列化这个文件。

于 2012-04-19T09:55:30.633 回答
0

好吧,以您想要的任何格式(如名称、分数、日期等)编写一个包含高分的文件,以便您稍后解析。然后,每次你想写一个新的分数时,继续编辑它。盲目地阅读并展示它。

于 2012-04-19T09:03:42.803 回答