Android游戏Highscore实现

-1 java sqlite android opengl-es

我想提出一个空间射击对我的最后一年的项目,并认为这将是冷静地包括本地比分/高分屏.我不知道如何解决这个问题,如果有人能指出我正确的方向,我会非常感激,我在网上发现的所有例子对我来说都很复杂.此外,我希望分数显示在用opengl es渲染的游戏屏幕上.谢谢.

Ter*_*ert 10

我刚刚完成了我正在开发的OpenGL ES游戏的高分板.因为它是你的最后一年项目我不会将它用作pastebin,而是给你一些指示.在我的应用程序中,分数被发送到我的PHP脚本,该脚本在MySQL中存储值.

我用过的:

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

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

HighScore hs = new HighScore(context, score, level);
Run Code Online (Sandbox Code Playgroud)

上下文是必需的,因此可以创建AlertDialogs和Toasts.构造函数调用函数submit(),该函数显示要求播放器名称的AlertDialog,然后将数据发送到服务器.

我的类包含这行代码,让玩家知道他们是否在收到服务器响应后进入前100名:

Toast.makeText(mContext, "You didn't make the score board", 
        Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)

高分列表存储在ArrayList中

private ArrayList<String> highscores = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

并且使用String.format以与此类似的方式填充数据:

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

然后:

在你的渲染器的onDrawFrame中你可以构建高分类,这样你就可以调用类似下面的一个衬里,其中包含你的翻译,缩放pushMatrix和popMatrix调用以将高分数据绘制到屏幕上.

hs.draw(gl);
Run Code Online (Sandbox Code Playgroud)

其中包含一个循环,与此不太相似:

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

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

希望这有助于推动您朝着正确的方向前进,并祝您的项目顺利


使用OpenGL ES渲染我的Android应用程序的高分状态的屏幕截图 我的Android应用程序使用OpenGL ES渲染的高分状态的屏幕截图


编辑:将分数发送到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);
}
Run Code Online (Sandbox Code Playgroud)

应该注意的是,$ 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();
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在任何时候进入这里的基础知识和更多代码,而且绝对是我有史以来最长的职位.我会认真考虑@Dan的评论,并通过基于服务器的方法研究本地存储到高分板

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